无法在另一类方法中的scrolledtext小部件末尾插入文本

2024-09-15 04:37:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试使用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()

Tags: textselfmasterclientmessageforservertkinter