我已经在该网站上阅读了至少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()可能是更好的方法。
我很欣赏这段代码中可能有一些行不需要在那里,它们只是各种尝试的遗留物:/
任何解决方案将不胜感激。
答案 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,因此您需要正确定义函数以接受这些参数。您还遇到了一个错误,试图在文本小部件中而不是对象中包含的文本中插入对象(测试)。