使用带线程的 Tkinter Entry.get() 的奇怪行为

Strange behavior using Tkinter Entry.get() with threads

我在尝试让 tkinter(尤其是 Entry class)与线程一起工作时遇到了一些奇怪的问题。我已将问题缩小到以下示例:

from threading import Thread
from tkinter import *

class App:
    def __init__(self):
        
        self.root = Tk()
        self.field = Entry(self.root)
        self.field.insert(0,200)

        self.but = Button(text = 'get', command = Thread(target = self.getField,
                                                        args = self.field.get()
                                                        ).start)

        self.field.pack()
        self.but.pack()

    def getField(self, *args):
        for arg in args:
            print (arg)
        return

myApp = App()
myApp.root.mainloop()

出于某种原因 self.field.get() return 分别输入字段中的每个数字;我需要 *args in getField() 才能发现这一点。当您按下按钮时,将打印以下内容:

2
0
0

我预计 .get() 到 return 整个字段条目。奇怪的是,.get() 也不响应新的字段条目,更改 UI 中的值会导致相同的输出。

以下没有线程的代码可以完美运行:

from threading import Thread
from tkinter import *

class App:
    def __init__(self):
        
        self.root = Tk()
        self.field = Entry(self.root)
        self.field.insert(0,200)

        self.but = Button(text = 'get', command = self.getField)

        self.field.pack()
        self.but.pack()

    def getField(self, *args):
        print(self.field.get())
        return

myApp = App()
myApp.root.mainloop()

我的线程代码有什么问题?

Thread 的参数应作为元组传递,如文档中所述:args 是目标调用的参数元组....
用它唯一的项目创建一个元组是 self.field.get() 让你的代码工作:

from threading import Thread
from tkinter import *

class App:
    def __init__(self):
        
        self.root = Tk()
        self.field = Entry(self.root)
        self.field.insert(0,200)

        self.but = Button(text = 'get', command = Thread(target = self.getField,
                                                        args = (self.field.get(), )
                                                        ).start)

        self.field.pack()
        self.but.pack()

    def getField(self, *args):
        print('>>>', args)
        for arg in args:
            print (arg)
        return

myApp = App()
myApp.root.mainloop()

输出:

('>>>', ('200',))
200

下面的代码让它为我工作:

from threading import Thread
from tkinter import *

class App:
    def __init__(self):
        
        self.root = Tk()
        self.field = Entry(self.root)
        self.field.insert(0,200)
        self.field.pack()
        self.but = Button(text = 'get', command = self.threadGetField) 
        self.but.pack()
        self.root.mainloop()

    def threadGetField(self):
        my_thread = Thread(target=self.getField())
        my_thread.start()

    def getField(self):
        print(self.field.get())
        return

myApp = App()

它解决了这两个问题 - 它在一行中显示数字,因为您只在 getField 函数中调用 self.field.get(),而不是作为参数。即使我更改了值,它也会显示正确的值,这对您发布的代码不起作用。