Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用带有线程的Tkinter Entry.get()时的奇怪行为_Python_Python 3.x_Multithreading_Tkinter_Tkinter Entry - Fatal编程技术网

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

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)

我在尝试让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()
分别返回输入字段中的每个数字;我需要
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()
的调用是在创建按钮时发生的,而不是在单击按钮时发生的。