我正在使用Python 3中的tkinter
处理GUI,我有一个名为Entry
的{{1}}文本框,其中包含以下绑定:
inputFilePathDisplay
按下某个键时,我有以下回调函数:
inputFilePathDisplay.bind("<Key>", lambda event, filePath = inputFilePath: key(event, filePath))
我的目标是在#input functions -- see if the user has entered text
def key(event, filePath):
filePath = event.widget.get()
框中输入并将其分配给Entry
。我可以看到inputFilePath
函数中filePath
变量已更改,但key()
的值未更新。我对Python很新,所以我不熟悉它如何处理通过引用传递参数。我错过了什么?
感谢您的时间。
答案 0 :(得分:0)
当你这样做时:
filePath = event.widget.get()
您正在将局部变量filepath
的值从传递给函数的值更改为event.widget.get()
返回的值。此时传递给函数的值将丢失。
您无法以这种方式分配给传入的调用者变量。首先,如果他们没有传递变量怎么办?
大多数情况下的常见做法只是返回值。如果这不可能,因为它不是这种情况,您可以让您的函数采用可变容器,例如列表,字典或类实例,并对其进行修改。 tkinter
为各种基本类型提供了这样的可变类,例如StringVar
。
因此,您定义了一个StringVar
实例,使用set()
方法设置其值,然后您可以稍后使用get()
检索它。
所以你的key
函数看起来像这样:
def key(event, filePath):
filePath.set(event.widget.get())
你的绑定看起来像这样:
inputFilePath = StringVar()
inputFilePathDisplay.bind("<Key>", lambda event, filePath=inputFilePath: key(event, filePath))
另一种可能性(从我看到的快速谷歌搜索是许多tkinter
程序员的首选)是使你的回调函数成为某个类实例上的绑定方法。然后,您可以将值存储为实例上的属性。这样做的好处是该方法已经知道它连接到哪个对象(通过self
),因此您不需要明确地处理它。因为你只需要一个方法,所以让实例可以调用!
class StrHolder(object):
def __call__(self, event):
self.value = event.widget.get()
现在您的绑定可以是,例如:
inputFilePath = StrHolder()
inputFilePathDisplay.bind("<Key>", inputFilePath)
要稍后检索该值,请参考inputFilePath.value
。你甚至可以修饰StrHolder
类,这样它或多或少就像一个字符串,而不必引用该属性。