无法在其他类方法的scrolledtext小部件末尾插入文本

问题描述

我正在尝试使用tkinter构建客户端套接字,但是当我尝试监听服务器套接字时,我必须创建另一个方法。在该方法中,我希望将来自服务器的每条消息都插入到scrolledtext小部件的末尾,但出现此错误

这是确切的错误

Traceback (most recent call last):
  File "client_dummy_GUI.py",line 39,in <module>
    gui.check_for_messages()
  File "client_dummy_GUI.py",line 32,in check_for_messages
    self.chat_text.insert(tkinter.END,"{0}\n".format(message_from_server.decode("utf-8")))
  File "C:\Users\David\AppData\Local\Programs\Python\python38-32\lib\tkinter\__init__.py",line 3738,in insert
    self.tk.call((self._w,'insert',index,chars) + args)
_tkinter.TclError: invalid command name ".!frame.!scrolledtext"

这是代码

import socket 
import tkinter,tkinter.scrolledtext

class GUI(tkinter.Frame):
    def __init__(self,master = None):
        super().__init__()
        self.master = master
        self.pack()

        self.client = socket.socket(socket.AF_INET,socket.soCK_STREAM)
        self.client.connect((socket.gethostname(),1337))
        self.client.settimeout(0.2)
        self.BUF_SIZE = 4096

        self.chat_text = tkinter.scrolledtext.ScrolledText(self.master)
        self.chat_text.pack()

        self.entry_text = tkinter.StringVar()
        self.entry = tkinter.Entry(master,textvariable = self.entry_text)
        self.entry.pack()

        self.entry.bind("<Return>",self.send_message)

    def send_message(self,e):
        message_to_server = self.entry_text.get()
        self.client.send(message_to_server.encode("utf-8"))

    def check_for_messages(self):
        while True:
            try:
                message_from_server = self.client.recv(self.BUF_SIZE) 
                self.chat_text.insert(tkinter.END,"{0}\n".format(message_from_server.decode("utf-8")))
            except socket.timeout as _e_:
                print(str(_e_))

x = tkinter.Tk()
gui = GUI(x)
gui.mainloop()
gui.check_for_messages()

解决方法

我知道了。 在使用.mainloop()方法之前,必须使用“ gui.check_for_messages”。 所以:

x = tkinter.Tk()
gui = GUI(x)
gui.check_for_messages()
gui.mainloop()