Python 使用带有线程的Tkinter Entry.get()时的奇怪行为
我在尝试让tkinter(特别是Python 使用带有线程的Tkinter Entry.get()时的奇怪行为,python,python-3.x,multithreading,tkinter,tkinter-entry,Python,Python 3.x,Multithreading,Tkinter,Tkinter Entry,我在尝试让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)
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()
分别返回输入字段中的每个数字;我需要getField()
中的*args
来发现这一点。按下按钮时,将打印以下内容:
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()
我的线程化代码有什么问题?线程的参数应作为元组传递,如文档中所述: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
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(),而不是作为参数。即使我更改了值,它也会向我显示正确的值,这对你发布的代码不起作用。下面的代码让它对我起作用:
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(),而不是作为参数。即使我更改了值,它也会向我显示正确的值,这对我来说并不适用于您发布的代码。谢谢您的回答。您的解决方案将返回的数字解析为单独的数字,但输出仍然忽略该字段的任何新输入。尝试在UI中将数字更改为999,它仍然输出200。这在实际应用程序中不起作用,因为您在创建entry小部件大约一毫秒后正在调用
self.fields.get()
。线程将始终只有初始值,而不是用户输入的值。谢谢您的回答。您的解决方案将返回的数字解析为单独的数字,但输出仍然忽略该字段的任何新输入。尝试在UI中将数字更改为999,它仍然输出200。这在实际应用程序中不起作用,因为您在创建entry小部件大约一毫秒后正在调用self.fields.get()
。线程将始终只有初始值,而不是用户输入的值。谢谢您的回答。它确实有效,但我很好奇为什么在args
参数中嵌入.get()
方法会导致打印旧值?我怀疑它在App
初始化时立即运行.get()
,但这没有意义,因为线程只有在您按下按钮时才会启动。@Darrel:这是因为对get()
的调用是在创建按钮时发生的,而不是在单击按钮时发生的。谢谢您的回答。它确实有效,但我很好奇为什么在args
参数中嵌入.get()
方法会导致打印旧值?我怀疑它在App
初始化时立即运行.get()
,但这没有意义,因为线程只有在您按下按钮时才会启动。@Darrel:这是因为对get()
的调用是在创建按钮时发生的,而不是在单击按钮时发生的。