btn.bind(on_release=self.load(fileChooser.path, fileChooser.selection))
...
def load(self, path, selection):
print path, selection
这是对 python 语法的滥用。问题是,您需要将一个函数传递给 btn.bind。该函数被存储,然后当on_release
事件发生时,该函数被调用。
您所做的不是传入函数,而是简单地调用它并传递结果。这就是为什么您在打开文件选择器时会看到打印一次路径和选择的原因 - 这是该函数被实际调用的唯一一次。
相反,您需要传入要调用的实际函数。由于范围可变,您必须在这里小心一点,并且有多种潜在的解决方案。以下是一种可能性的基础知识:
def load_from_filechooser(self, filechooser):
self.load(filechooser.path, filechooser.selection)
def load(self, path, selection):
print path, selection
...
from functools import partial
btn.bind(on_release=partial(self.load_from_filechooser, fileChooser))
该partial
函数接受一个函数和一些参数,并返回一个自动传递这些参数的新函数。这意味着当 on_release 发生时 bind 实际上有一些东西要调用,这反过来又会调用 load_from_filechooser ,而后者又会调用你原来的 load 函数。
您也可以在不使用局部的情况下执行此操作,但这是一种有用的通用技术,在这种情况下(我认为)有助于弄清楚发生了什么。
我使用了对 fileChooser 的引用,因为您不能直接在函数中引用 fileChooser.path 和 fileChooser.selection - 您只能在定义函数时获取它们的值。这样,我们跟踪 fileChooser 本身,仅在稍后调用该函数时提取路径和选择。