btn.bind(on_release=self.load(fileChooser.path, fileChooser.selection))
...
def load(self, path, selection):
print path, selection
Это злоупотребление синтаксиса питона. Проблема в том, что вам нужно передать функцию на btn.bind. Функция сохраняется, а затем, когда происходит событие on_release
, вызывается функция.
Что вы сделали, это не пропуск функции, а просто вызвать ее и передать результат. Вот почему вы видите, что путь и выбор печатаются один раз, когда вы открываете filechooser - это тот единственный момент, когда функция фактически вызывается.
Вместо этого вам необходимо передать фактическую функцию, которую вы хотите вызвать. Вы должны быть немного осторожны здесь из-за переменного охвата, и есть много потенциальных решений. Ниже основа одной возможности:
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
функция принимает функцию и некоторые аргументы, и возвращает новую функцию, которая автоматически передает эти аргументы. Это означает, что bind действительно имеет что-то для вызова, когда происходит on_release, что в свою очередь вызывает load_from_filechooser, который, в свою очередь, вызывает вашу исходную функцию загрузки.
Вы также можете сделать это без частичной, но это полезная общая техника, и в этом случае помогает (я думаю), чтобы дать понять, что происходит.
Я использовал ссылку на fileChooser, потому что вы не можете ссылаться на fileChooser.path и fileChooser.selection непосредственно в своей функции - вы получите только их значения во время определения функции. Таким образом, мы отслеживаем файл fileChooser и извлекаем только путь и выбор, когда функция будет вызвана позже.
Вот пример использования filechooser.https: //www.youtube.com/watch? V = 6x1gUNoVB2I –