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

2024-05-14 22:11:46 发布

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

我在这个网站上读过至少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()可能是更好的方法

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

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


Tags: 代码testselfobjectserverinittkinterdef
1条回答
网友
1楼 · 发布于 2024-05-14 22:11:46

您询问的错误是由以下行引起的:

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,因此需要正确定义函数以接受这些参数。您还存在一个错误,您试图在文本小部件中插入一个对象(测试),而不是对象中包含的文本

相关问题 更多 >

    热门问题