繁体   English   中英

无法在另一个 class 方法中的滚动文本小部件的末尾插入文本

[英]Can't insert text at the end of a scrolledtext widget in another class method

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

这是确切的错误:

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()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM