从其他线程向tkinter文本窗口小部件插入字符串

时间:2020-11-09 17:16:24

标签: python tkinter

我已经在该网站上阅读了至少25个类似的问题,但我无法正常工作。

按现状,我只是想用客户端和服务器构建一个简单的聊天应用程序。 GUI将在逻辑的单独线程上运行,以确保事物保持流畅并且不会锁定。我从代码中修剪了大多数逻辑,以找出问题所在

import socket, csv, datetime, tkinter as tk, threading
from tkinter import ttk

interface = tk.Tk()
test = tk.StringVar()
test.set("String Var Test")

class serverInterface():
    def __init__(self, interface):
        global test
        self.messageLog = tk.Text(interface, height=10, state="disabled", yscrollcommand="scrollBar.set")
        self.scrollBar = ttk.Scrollbar(interface, command=self.messageLog.yview).grid(row=0, column=2, sticky="nsew")
        self.messageLog.grid(row=0, column=0, columnspan=2)
        test.trace("w", serverInterface.guiUpdate(self))

    def guiUpdate(self):
        self.messageLog.insert(tk.END, test)


class server():
    def __init__(self):
        global test
        print("Server thread")
        while True:
            test.set("Updated from server object")


interface.title("Server")
serverInterface = threading.Thread(target=serverInterface(interface)) #Create serverInterface object
server = threading.Thread(target=server, daemon=True) # Create server object
server.start()
interface.mainloop()

这将导致控制台被Exception in Tkinter callback Traceback (most recent call last): File "C:\Users\thoma\AppData\Local\Programs\Python\Python38\lib\tkinter\__init__.py", line 1883, in __call__ return self.func(*args) TypeError: 'NoneType' object is not callable垃圾邮件 我也尝试过使用Queue(),就像我看到的其他建议一样,但这只会导致一组不同的错误,我觉得使用StringVar()可能是更好的方法。

我很欣赏这段代码中可能有一些行不需要在那里,它们只是各种尝试的遗留物:/

任何解决方案将不胜感激。

1 个答案:

答案 0 :(得分:0)

您要询问的错误归因于此行:

test.trace("w", serverInterface.guiUpdate(self))

该行在功能上与此相同:

result = serverInterface.guiUpdate(self)
test.trace("w", result)

由于guiUpdate(self)返回None,因此您要让tkinter呼叫None。因此,错误TypeError: 'NoneType' object is not callable

必须为trace方法提供一个可调用的(即:对函数的引用)。在这种情况下,您需要使用self.guiUpdate

跟踪将为automatically pass arguments to the function,因此您需要正确定义函数以接受这些参数。您还遇到了一个错误,试图在文本小部件中而不是对象中包含的文本中插入对象(测试)。