Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Python]_tkinter.TclError: invalid command name ".

    23 octobre 2018 à 17:28:47

    Bonjour bonjour,

    Je me suis mis il y a peu à la programmation réseau (socket du cours sur openclassroom) ainsi qu'à Tkinter(je commence à me familiariser avec);).

    J'ai donc pour but de créer un simple chat

    Voici l'aperçu graphique (j'ai essayer de le rendre moderne au possible:honte:)

    J'ai malgré sa un problème qui persiste

    Mon fichier admin.py(partie graphique) se charge d'importer la partie logique (server2.py)

    Jusque la tout se passe bien mais lorsque j'essaye d'envoyer un message (via le widget text.insert), j'obtiens une erreur de ce type:

    Je vous laisse donc mon code à disposition:

    admin.py

    from tkinter import *
    from tkinter.messagebox import *
    from tkinter import font
    import server2
    class Panel:
        
        """Classe définissant l'interface graphique du serveur"""
        def __init__(self):
            """Fonction principale"""
            self.root = Tk()
            self.font = font.Font(family='Ubuntu', weight='bold')
            
            self.root.resizable(False, False)
            for index,titre in {"1":"Option Serveur","2":"Options Moderation","3":"Log","4":"Mod chat","5":"Users","6":"Theme"}.items():
                exec("self.frame" + index + " = LabelFrame(self.root,relief='sunken',text='" + titre + "',bd=2)")
            #On repartis les 3 options en parties égales
            for number in "123":
                self.frame2.columnconfigure(int(number),weight=1)
            self.frame1.columnconfigure(0,weight=1)
    
            self.btn1 = Button(self.frame1, text="Start", bg='#fbc531', fg="#FFFFFF", command=self.turnhost, font=self.font,bd=0)
            self.btn2 = Button(self.frame2, text="Mute", state=DISABLED, fg="#f1c40f", command=self.mute, font=font.Font(family='Ubuntu',size=10,weight='bold'), bd=0)
            self.btn3 = Button(self.frame2, text="Kick", state=DISABLED, fg="#e67e22", command=self.kick, font=font.Font(family='Ubuntu',size=10,weight='bold'), bd=0)
            self.btn4 = Button(self.frame2, text="Ban", state=DISABLED, fg="#e74c3c", command=self.ban, font=font.Font(family='Ubuntu',size=10,weight='bold'), bd=0)
    
            self.theme = Button(self.frame6, text="DARK", bg="#2f3640", fg="#FFFFFF", font=font.Font(family='Ubuntu',size=10,weight='bold'), command=self.theme,relief="groove",bd=0)
            self.users = Listbox(self.frame5,selectbackground="#9b59b6",activestyle="none",bd=0,highlightthickness=1,highlightcolor="#9b59b6")
            self.message = StringVar()
            self.chat = Entry(self.frame4,textvariable=self.message,state=DISABLED,relief='flat',disabledbackground="#FFFFFF")
            self.chat.bind('<KeyPress-Return>',self.modmessage)
            self.log = Text(self.frame3,height=5,wrap='word')
        def theme(self):
            """Fonction qui permet de changer le theme"""
            if self.theme.cget("text") == "DARK":
                self.theme.configure(text="LIGHT",bg="#00a8ff",fg="#f5f6fa")
                self.root.config(bg="#2f3640")
                self.chat.config(bg="#2f3640",fg="#FFFFFF",disabledbackground="#2f3640")
                self.users.config(bg="#2f3640",highlightbackground="#2f3640",fg="#FFFFFF")
                self.log.config(bg="#2f3640",fg="#ecf0f1")
                
                for number in "123456":
                    exec("self.frame"+number+".config(bg='#2f3640',fg='#dcdde1')")
                for index,color in {"2":"#f1c40f","3":"#e67e22","4":"#e74c3c"}.items():
                    exec("self.btn"+index+".config(bg='#2f3640',fg='"+color+"')")
            else:
                self.theme.configure(text="DARK",bg="#2f3640", fg="#FFFFFF")
                self.root.config(bg="#FFFFFF")
                self.chat.config(bg="#FFFFFF",fg="#FFFFFF",disabledbackground="#FFFFFF")
                self.users.config(bg="#FFFFFF",highlightbackground="#FFFFFF",fg="BLACK")
                self.log.config(bg="#FFFFFF",fg="BLACK")
                
                for number in "123456":
                    exec("self.frame"+number+".config(bg='#FFFFFF',fg='BLACK')")
                for index,color in {"2":"#f1c40f","3":"#e67e22","4":"#e74c3c"}.items():
                    exec("self.btn"+index+".config(bg='#FFFFFF',fg='"+color+"')")
                
        def modmessage(self,event):
            """Fonction qui permet l'envoie d'un message"""
            
            self.log.insert(END,'\n>'+self.message.get())
            self.chat.delete(0,len(self.message.get()))
        def mute(self):
            """Fonction qui permet de mute un utilisateur"""
            
            if askyesno('Mute', 'Voulez vous mute?'):
                self.log.insert(END,'\n'+"Vous avez mute")
            else:
                pass
        def ban(self):
            """Fonction qui permet de ban un utilisateur"""
            
            if askyesno('Ban', 'Voulez vous ban?'):
                self.log.insert(END,'\n'+"Vous avez ban :o")
            else:
                pass
        def kick(self):
            """Fonction qui permet de kick un utilisateur"""
            
            if askyesno('Kick', 'Voulez vous kick?'):
                self.log.insert(END,'\n'+"Vous avez kick")
            else:
                pass
        def modstate(self,value):
            """Fonction qui change l'etat des boutons"""
            for key in ["btn2","btn3","btn4","chat"]:
                exec("self."+key+".config(state=value)")
        def showpanel(self):
            """Fonction d'affichage"""
            try:
                self.frame1.grid(column=0,row=0)
                self.frame2.grid(column=2,row=0)
                self.frame3.grid(column=0,row=1, columnspan=3)
                self.frame4.grid(column=1,row=0)
                self.frame5.grid(column=2)
                self.frame6.grid(column=0,row=2,sticky='N')
                
                self.users.insert(END,"192.168.28.101")
                self.users.grid()
                self.chat.grid()
                self.log.grid(column=0)
                self.theme.grid()
                
                self.btn1.grid(sticky='we')
                self.btn2.grid(column=1,row=0,sticky='WE')
                self.btn3.grid(column=2,row=0,sticky='WE')
                self.btn4.grid(column=3,row=0,sticky='WE')
            except TclError:
                print("Reouverture de l'application")
            
        def turnhost(self):
            """Fonction qui lance le serveur"""
            
            if self.btn1.cget("text") == "OFF":
                self.btn1.configure(text="ON",bg="#2ecc71",fg="#FFFFFF")
                self.log.insert(END,'\n'+"Demarrage du serveur...")
                self.modstate("normal")
            elif self.btn1.cget("text") == "ON":
                self.btn1.configure(text="OFF",bg="#e74c3c",fg="#FFFFFF")
                self.log.insert(END,'\n'+"Arret du serveur...")
                self.modstate("disabled")
            else:
                self.btn1.configure(text="ON",bg="#2ecc71",fg="#FFFFFF")
                self.log.insert(END,"Demarrage du serveur...")
                self.modstate("normal")
    admin=Panel()
    admin.showpanel()
    admin.root.mainloop()
    

    server2.py

    # -*-coding:utf-8 -*
    import socket
    import select
    import msvcrt
    from admin import *
    class server:
    
        def __init__(self, hote='192.168.28.177', port=12800):
    
            self.hote = hote
            self.port = port
            self.max_connexion = 5
            self.connected_client = []
            self.read_client = []
            self.ipparser = []
            self.parseclient = ""
            self.user_count = 0
        def serverinterpreter(self):
            connexion_server.setblocking(0)
            if msvcrt.kbhit():
                key = msvcrt.getch()
                if key.decode() == "\r":
                    pass
                else:
                        print("Ok")
        def sendallclient(self,client,receive):
            for personnes in self.connected_client:
                                transmit = "<SERVER>{}>{}".format(self.clientparser(client), receive)
                                personnes.send(transmit.encode())
                                self.ipparser.clear()
                                
        def clientparser(self,clientsocket):
            for key,values in enumerate(clientsocket.getpeername()):
                self.ipparser.append(str(values))
            return ":".join(self.ipparser)
        def start(self):
            admin.log.insert(END,'\n'+"Prout...")
            global connexion_server
            connexion_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            connexion_server.bind((self.hote, self.port))
            connexion_server.listen(self.max_connexion)
            while True:
                self.serverinterpreter()
                ask_connexion, wlist, xlist = select.select([connexion_server], [], [], 0.05)
                
                for connexion in ask_connexion:
                    connexion_client, connexion_info = connexion_server.accept()
                    self.connected_client.append(connexion_client)
                    print("{}:{} est connecté".format(connexion_info[0], connexion_info[1]))
                    self.user_count += 1
                    print("Il y a {} utilisateur(s)".format(self.user_count))
                try:
    
                    read_client, wlist, xlist = select.select(self.connected_client, [], [], 0.05)
                except select.error:
                    pass
                else:
                    for client in read_client:
                        
                        try:
                            receive = client.recv(1024)
                            receive = receive.decode()
                            print("{}>{}".format(self.clientparser(client), receive))
                            self.ipparser.clear()
                            self.sendallclient(client,receive)
                            
                        except ConnectionResetError:
                            print("La connexion avec {} a été perdu".format(self.clientparser(client)))
                            self.user_count -= 1
                            self.ipparser.clear()
                            self.connected_client.remove(client)
                            client.close()
                            print("Il y a {} utilisateur(s)".format(self.user_count))
                            continue
            for client in self.connected_client:
                client.close()
    
                
            connexion_server.close()
                
    
    
    test = server()
    test.start()
                
    

    En espérant pouvoir trouver une réponse.
    Merci à vous :ange:


    • Partager sur Facebook
    • Partager sur Twitter
      23 mai 2019 à 17:44:59

      Cela signifie généralement que vous essayez d'appeler une méthode sur un widget qui a été détruit
      • Partager sur Facebook
      • Partager sur Twitter

      [Python]_tkinter.TclError: invalid command name ".

      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
      • Editeur
      • Markdown