Erreur: maximum recursion depth exceeded in __instancecheck

Frewil -  
mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   -

Bonjour,

J'ai crée un code python avec une horloge qui ne se met pas à jour et en plus j'ai l'erreur suivante:

RecursionError: maximum recursion depth exceeded in __instancecheck__

... en référence à la fonction update_labke_chauff_2.

import tkinter as tk
import tkinter.ttk as ttk
from PIL import Image
from PIL import ImageTk
from colorama import Fore, Style
import datetime
from pyModbusTCP.client import ModbusClient


window = tk.Tk()
# Création de la tab principale
tabs = ttk.Notebook(window)
# Positionnement de la tab principale dans la fenetre "window"
tabs.place(x=10, y=10)

# Variables globales
datetime_object = datetime.datetime.now()
date_heure = (
  datetime_object.strftime('%d/%m/%Y') + " " + 
  datetime_object.strftime("%H:%M:%S")
)
date = datetime_object.strftime('%d/%m/%Y')
heure = datetime_object.strftime("%H:%M:%S")


def update_label_chauff_2(label_chauff_2):
    datetime_object = datetime.datetime.now()
    date_heure = (
        datetime_object.strftime('%d/%m/%Y') + " " +
        datetime_object.strftime("%H:%M:%S")
    )

    # Mettre à jour le label avec la nouvelle valeur de la variable
    label_chauff_2.config(text="Date et heure: " + date_heure)


    # répéter la fonction
    label_chauff_2.after(1000, update_label_chauff_2(label_chauff_2))


def creation_fenetre_principale(tabs):

    #creation de la vue grapique de la tab chauffage
    chauffage = tk.Frame(tabs, width=900, height=520, bg="grey")
    tabs.add(chauffage, text="Chauffage")
    # Creation d'un frame principal dans la tab chauffage
    frame_principal_chauffage = tk.Frame(chauffage, width=880, height=500, bg="white")
    frame_principal_chauffage.place(x=10, y=10)
    # Ouverture de l'image chauffage.jpg
    synoptique_chauffage = Image.open("chauffage.jpg")
    # redimenssioner l'image
    synoptique_chauffage_resized = synoptique_chauffage.resize((710, 490))
    # convertir l'image en image tkinter
    backgroud_chauffage = ImageTk.PhotoImage(synoptique_chauffage_resized)
    # creation d'un label_chauff_1 dans le frame principal de la tab 1 pour
    # y afficher l'image chauffage.jpg
    label_chauff_1 = tk.Label(frame_principal_chauffage, image=backgroud_chauffage)
    label_chauff_1.image = backgroud_chauffage
    # afficher et positionner l'image dans le label_chauff_1 crée précédement
    # Modification de la taille de la police des titres des tabs
    style = ttk.Style(tabs)
    style.configure("light.TNotebook", font=("Arial", 12))
    label_chauff_1.place(x=50, y=10)

    # faire en sorte que la fenetre s'adapte automatiquement à la taille de l'ecran
    w, h = window.winfo_screenwidth(), window.winfo_screenheight()
    window.geometry("%dx%d" % (w, h))

    # appel du theme de la fenetre
    window.tk.call("source", "azure.tcl")
    window.tk.call("set_theme", "light")

    # Titre de la fenêtre
    window.title("Domotique")

    # Création de la tab principale
    tabs = ttk.Notebook(window)
    # Positionnement de la tab principale dans la fenetre "window"
    tabs.place(x=10, y=10)

    # Création du menu "Fichier"
    menu_fichier = tk.Menu(window, tearoff=0)
    menu_fichier.add_command(label="Ouvrir", command=ouvrir_fichier)
    menu_fichier.add_command(label="Enregistrer", command=enregistrer_fichier)
    menu_fichier.add_separator()
    menu_fichier.add_command(label="Quitter", command=window.destroy)

    # Création du menu "Edition"
    menu_edition = tk.Menu(window, tearoff=0)
    menu_edition.add_command(label="Annuler", command=annuler)
    menu_edition.add_command(label="Rétablir", command=retablir)

    # Création du menu "Aide"
    menu_aide = tk.Menu(window, tearoff=0)
    menu_aide.add_command(label="Aide", command=aide)

    menu_aide = tk.Menu(window, tearoff=0)
    menu_fichier = tk.Menu(window, tearoff=0)
    menu_edition = tk.Menu(window, tearoff=0)
    creation_des_menus(window, menu_aide, menu_fichier, menu_edition)

    # --------------- initialisation de la connexion Modbus -----------------
    print(Fore.LIGHTBLUE_EX + "*** Initialisation de la connection Modbus ***")
    print(Style.RESET_ALL)  # annuler le style de couleur du texte
    adresseIP = "192.168.0.11"

    c = ModbusClient()
    c.host = adresseIP
    c.port = 502

    print(Fore.GREEN + "Connexion Modbus initialisée")
    print(Fore.GREEN + "Connecté à l'adresse IP ", adresseIP, "\n")
    print(Style.RESET_ALL)  # annuler les style de couleur du texte
    print(Fore.YELLOW + "le", date, "à", heure)
    print(Style.RESET_ALL)  # annuler le style de couleur du texte

    # Lire les registres de 0 à 50
    registers = c.read_holding_registers(0, 50)

    # Affichez les valeurs lues
    print(registers)

    label_chauff_2 = ttk.Label(frame_principal_chauffage, background="lightblue")
    label_chauff_2.place(x=550, y=350)

    c.close()

    update_label_chauff_2(label_chauff_2)


Pourriez-vous m'aider s'il vous plaît ?

Merci


Windows / Chrome 109.0.0.0

4 réponses

  1. Utilisateur anonyme
     

    Bonjour 

    ben le message est clair, la fonction récursive update_label_chauff_2 (parce qu'elle s'appelle elle-même) s'appelle à l'infini et au bout d'un moment atteint les  limites du système.

    Quand on écrit une fonction récursive, il y a 2 règles à respecter (et là c'est pas le cas)

    • il doit y avoir une clause qui arrête la récursivité 
    • chaque appel récursif doit converger vers cette clause 

    Ça a déjà été débattu longuement récemment, je t'invite donc à lire ce sujet https://forums.commentcamarche.net/forum/affich-37788419-appel-d-une-fonction-recursive#p37789977


    0
  2. Frewil
     

    Merci beaucoup.

    J'ai revu tout mon code et maintenant il est différent. Cependant je n'arrive pas à voir le label nommé "label_chauff_2" se mettre à jour.

    A votre avis, cela pourrait venir de quelle erreur?

    Merci

    import tkinter as tk
    import tkinter.ttk as ttk
    
    from PIL import Image
    from PIL import ImageTk
    from colorama import Fore, Style
    import datetime
    from pyModbusTCP.client import ModbusClient
    
    window = tk.Tk()
    class chauffage:
    
        def __init__(self):
            # variables globales de la class
            datetime_object = datetime.datetime.now()
            self.date_heure = (
                datetime_object.strftime('%d/%m/%Y') + " " + 
                datetime_object.strftime("%H:%M")
            )
            self.date = datetime_object.strftime('%d/%m/%Y')
            self.heure = datetime_object.strftime("%H:%M")
    
    
        def tab_chauffage(self):
            chauffage = tk.Frame(tabs, width=900, height=520, bg="grey")
            tabs.add(chauffage, text="Chauffage")
            # Creation d'un frame principal dans la chauffage
            frame_principal_chauffage = tk.Frame(
               chauffage, width=880, height=500, bg="white"
            )
            frame_principal_chauffage.place(x=10, y=10)
            # Ouverture de l'image chauffage.jpg
            synoptique_chauffage = Image.open("chauffage.jpg")
            # redimenssioner l'image
            synoptique_chauffage_resized = synoptique_chauffage.resize((710, 490))
            # convertir l'image en image tkinter
            backgroud_chauffage = ImageTk.PhotoImage(synoptique_chauffage_resized)
            # creation d'un label_chauff_1 dans le frame principal
            # de la tab 1 pour y afficher l'image chauffage.jpg
            label_chauff_1 = tk.Label(
                frame_principal_chauffage,
                image=backgroud_chauffage
            )
            label_chauff_1.image = backgroud_chauffage
            # afficher et positionner l'image dans le label_chauff_1 crée précédement
            # Modification de la taille de la police des titres des tabs
            style = ttk.Style(tabs)
            style.configure("light.TNotebook", font=("Arial", 12))
            label_chauff_1.place(x=50, y=10)
    
            # my_variable = 25
            label_chauff_2 = ttk.Label(
                frame_principal_chauffage, text="Date et heure: " + self.date_heure,
                background="lightblue"
            )
            label_chauff_2.place(x=550, y=350)
    
    
        def connect_chaudiere_et_lecture_registres(self):
            # --------------- initialisation de la connexion Modbus -----------------
            print(Fore.LIGHTBLUE_EX + "*** Initialisation de la connection Modbus ***")
            print(Style.RESET_ALL)  # annuler le style de couleur du texte
            adresseIP = "192.168.0.11"
            c = ModbusClient()
            c.host = adresseIP
            c.port = 502
            if c.open():  # vérifie si la connection est active
                print(Fore.GREEN + "Connexion Modbus initialisée")
                print(Fore.GREEN + "Connecté à l'adresse IP ", adresseIP, "\n")
                print(Style.RESET_ALL)  # annuler les tyle de couleur du texte
                print(Fore.YELLOW + "le", self.date, "à", self.heure)
                print(Style.RESET_ALL)  # annuler le style de couleur du texte
                # Lisez les registres 0 à 10
                registers = c.read_holding_registers(0, 50)
    
                # Affichez les valeurs lues
                print(registers)
    
                c.close()
    
    
            else:
                print(Fore.RED + "Impossible de se connecter à l'adresse IP ", adresseIP)
                print(Fore.RED + "Code erreur: ", c.last_error_as_txt)
                print(Style.RESET_ALL)  # annuler le style de couleur du texte
                print("--" * 80)
    
        def update_chauffage(self):
            self.connect_chaudiere_et_lecture_registres()
            window.after(1000, self.update_chauffage)
            window.update
    
    
    def ouvrir_fichier():
        # À compléter
        pass
    
    
    def enregistrer_fichier():
        # À compléter
        pass
    
    
    def aide():
        # À compléter
        pass
    
    
    def annuler():
        # À compléter
        pass
    
    
    def retablir():
        # À compléter
        pass
    
    
    def tab_2():
        # Création des tabs dans la tab principale et ajout de celles-ci
    
        tab2 = tk.Frame(tabs, width=900, height=520, bg="grey")
        tabs.add(tab2, text="tab 2")
        # Modification de la taille de la police des titres des tabs
        style = ttk.Style(tabs)
        style.configure("light.TNotebook", font=("Arial", 12))
    
    
    def tab_3():
        # Création des tabs dans la tab principale et ajout de celles-ci
    
        tab3 = tk.Frame(tabs, width=900, height=520, bg="grey")
        tabs.add(tab3, text="tab 3")
        # Modification de la taille de la police des titres des tabs
        style = ttk.Style(tabs)
        style.configure("light.TNotebook", font=("Arial", 12))
    
    
    def tab_4():
        # Création des tabs dans la tab principale et ajout de celles-ci
    
        tab4 = tk.Frame(tabs, width=900, height=520, bg="grey")
        tabs.add(tab4, text="tab 4")
        # Modification de la taille de la police des titres des tabs
        style = ttk.Style(tabs)
        style.configure("light.TNotebook", font=("Arial", 12))
    
    
    # Création du menu "Fichier"
    
    menu_fichier = tk.Menu(window, tearoff=0)
    menu_fichier.add_command(label="Ouvrir", command=ouvrir_fichier)
    menu_fichier.add_command(label="Enregistrer", command=enregistrer_fichier)
    menu_fichier.add_separator()
    menu_fichier.add_command(label="Quitter", command=window.destroy)
    
    # Création du menu "Edition"
    menu_edition = tk.Menu(window, tearoff=0)
    menu_edition.add_command(label="Annuler", command=annuler)
    menu_edition.add_command(label="Rétablir", command=retablir)
    
    # Création du menu "Aide"
    menu_aide = tk.Menu(window, tearoff=0)
    menu_aide.add_command(label="Aide", command=aide)
    
    
    def a_propos():
        # Création de la fenêtre secondaire
        window_a_propos = tk.Tk()
        window_a_propos.tk.call("source", "azure.tcl")
        window_a_propos.tk.call("set_theme", "light")
        window_a_propos.title("À propos de")
    
        # Texte à afficher dans la fenêtre
        texte = "\nProgramme rédigé par Frédéric Willauer\nVersion 1.00 - Janv 2023\n"
        label = tk.Label(window_a_propos, text=texte)
    
        # Taille de la fenêtre
        window_a_propos.geometry("350x120")
        label.pack()
    
        # Bouton "Fermer" qui ferme la fenêtre lorsqu'il est cliqué
        bouton_fermer = tk.Button(
            window_a_propos, text="Fermer", command=window_a_propos.destroy
        )
        bouton_fermer.pack()
    
    
    def creation_des_menus(window, menu_aide, menu_fichier, menu_edition):
        # Création du sous-menu "À propos de"
        menu_a_propos = tk.Menu(menu_aide, tearoff=0)
        menu_a_propos.add_command(label="À propos de", command=a_propos)
    
        # Ajout du sous-menu "À propos de" au menu "Aide"
        menu_aide.add_cascade(label="Aide", menu=menu_a_propos)
    
        # Ajout du sous-menu A propos de au menu Aide
        menu_aide.add_cascade(label="A propos de", menu=menu_a_propos)
    
        # Création de la barre de menu
        barre_menu = tk.Menu(window)
        barre_menu.add_cascade(label="Fichier", menu=menu_fichier)
        barre_menu.add_cascade(label="Edition", menu=menu_edition)
        barre_menu.add_cascade(label="Aide", menu=menu_aide)
        window.config(menu=barre_menu)
    
    
    ######### PROGRAMME PRINCIPAL #########
    
    # Instanciation des classes
    instance_chauffage = chauffage()
    
    # faire en sorte que la fenetre s'adapte automatiquement à la taille de l'ecran
    w, h = window.winfo_screenwidth(), window.winfo_screenheight()
    window.geometry("%dx%d" % (w, h))
    
    # appel du theme de la fenetre
    window.tk.call("source", "azure.tcl")
    window.tk.call("set_theme", "light")
    
    # Titre de la fenêtre
    window.title("Domotique")
    
    # Création de la tab principale
    tabs = ttk.Notebook(window)
    # Positionnement de la tab principale dans la fenetre "window"
    tabs.place(x=10, y=10)
    
    # appel des fonctions
    instance_chauffage.tab_chauffage()
    instance_chauffage.connect_chaudiere_et_lecture_registres()
    instance_chauffage.update_chauffage()
    
    tab_2()
    tab_3()
    tab_4()
    
    menu_aide = tk.Menu(window, tearoff=0)
    menu_fichier = tk.Menu(window, tearoff=0)
    menu_edition = tk.Menu(window, tearoff=0)
    creation_des_menus(window, menu_aide, menu_fichier, menu_edition)
    window.mainloop()
    0
  3. Diablo76 Messages postés 344 Date d'inscription   Statut Membre Dernière intervention   140
     

    Salut,

    Je pense que tu t'eme!les les pédales, garde ta base en procédurale avant de passer en POO,

    0
  4. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 944
     

    Bonjour,

    Peux-tu faire un exemple minimal qui met en évidence ton problème et préciser l'erreur ou le comportement attendu ?

    Bonne chance

    0