你可以通过引用python中的回调方法传递一个变量吗?

时间:2015-03-09 05:50:33

标签: python user-interface callback tkinter event-handling

我正在使用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很新,所以我不熟悉它如何处理通过引用传递参数。我错过了什么?

感谢您的时间。

1 个答案:

答案 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类,这样它或多或少就像一个字符串,而不必引用该属性。