Как передать параметры функции из объекта guizero? - PullRequest
0 голосов
/ 12 мая 2019

Я не могу передать какой-либо параметр в функцию, вызываемую виджетом Guizero, с атрибутом «команда» при инициализации или с помощью вызова события.

Это работает как ожидалось (параметры не переданы):

from guizero import App, PushButton

def go():
    print (10)

app = App(title="Test")
button = PushButton(app, text = "Click Here", command = go)

app.display()

, но следующее печатает число 10 один раз, прежде чем кнопка нажата, а затем, когда я нажимаю, ничего не происходит

from guizero import App, PushButton

def go(n):
    print (n)

app = App(title="Test")
button = PushButton(app, text = "Click Here", command = go(10))

app.display()

Тот же самый результат, который я получаю с этим:

from guizero import App, PushButton

def go(n):
    print (n)

app = App(title="Test")
button = PushButton(app, text = "Click Here")
button.when_clicked = go(10)

app.display()

Чего мне не хватает?

Заранее спасибо!

Ответы [ 3 ]

1 голос
/ 12 мая 2019

Во всех каркасах GUI command= (или аналогичный) ожидает callback - это означает имя функции без () и без параметров.


Если вы используете go(10), значит,

result = go(10)
PushButton( ...., command=result)

, поэтому он выполняет go(10) еще до того, как вы нажмете кнопку - и присваивает результат command=. Потому что go() возвращает None, поэтому вы получаете PushButton( ...., command=None), а когда вы нажимаете кнопку, вы ничего не получаете.


Вы должны создать новую функцию, которую можете запускать без ()

def go_10():
    go(10)

PushButton( ...., command=go_10)

Или вы можете использовать lambda для создания функции непосредственно в command=

PushButton( ...., command=lambda:go(10))
1 голос
/ 12 мая 2019
from guizero import App, PushButton
def go(n):
    print (n)
app = App(title="Test")
button = PushButton(app, text = "Click Here", command = lambda: go(10))
app.display()

Всякий раз, когда вы пишете go(10) в любом месте, вы вызываете функцию go. Вы можете подумать, что передаете go с аргументами, но это не так, потому что круглые скобки рядом с go() вызывают функцию прямо здесь и сейчас. Если вы хотите передать функцию go другой функции, и go также следует передать с некоторыми аргументами, то вам нужно обернуть функцию go и передать обернутую функцию в качестве аргумента «команда». Использование лямбда-функции для переноса go(10) является одним из таких способов сделать это.

Причина, по которой это работает, заключается в том, что лямбда-функция НЕ вызывается тут же. Вы говорите, что command() должен в конечном итоге вызвать объявленную анонимную лямбда-функцию *1013*, и когда эта лямбда-функция будет вызвана, она сама вызовет go(10). Вы объявляете анонимную лямбда-функцию, НЕ вызывая ее. Лямбда-функция будет вызываться позже как command().

0 голосов
/ 21 мая 2019

Я нашел решение!

Использование функции lambda - это умный способ обойти ограничение обратного вызова, но я нашел более правильный способ передачи аргументов функции с помощьюсвойства виджета (каламбур не предназначен).Как оказалось, я пропустил очень краткую ссылку на свойство args , которое можно установить при создании экземпляра и которое используется для передачи списка в функцию, вызываемую command

Вот мое решение:

from guizero import App, PushButton

def go(n):
    print (n)

app = App(title="Test")
button = PushButton(app, text = "Click Here", args = [10], command = go)

app.display()

Как и ожидалось, каждый раз, когда вы нажимаете кнопку, печатается '10'.

Спасибо за все остальные ответы!

...