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

2024-04-29 09:38:48 发布

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

我在尝试让tkinter(特别是Entry类)使用线程时遇到了一些奇怪的问题。我已将问题缩小到以下示例:

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()分别返回输入字段中的每个数字;我需要*argsgetField()中发现这一点。按下按钮时,将打印以下内容:

2
0
0

我希望.get()返回整个字段条目。奇怪的是,.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()

我的线程代码有什么问题


Tags: fromimportselfappfieldgettkinterdef
2条回答

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(),而不是作为参数。即使我更改了值,它也会显示正确的值,这对我来说并不适用于您发布的代码

相关问题 更多 >