使用带线程的 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(),而不是作为参数。即使我更改了值,它也会显示正确的值,这对您发布的代码不起作用。
我在尝试让 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(),而不是作为参数。即使我更改了值,它也会显示正确的值,这对您发布的代码不起作用。