Вызов функций с аргументами «команда» и «связывание» - PullRequest
1 голос
/ 22 февраля 2012

Хочу отметить, что я изучаю питон с короткого времени. Вопрос будет начальным.

Мне нужно добавить команду в меню в верхней части программы, которая будет вызывать функцию "color_picker (" red ").

kolory.add_command(label="Czerwony", command=color_picker('red')) Когда я использую это, это как-то неправильно, потому что он вызывается после запуска программы, и я не жду, когда я нажму кнопку меню. (Я уверен в этом, так как я добавил «showinfo» к этой функции, и она показывает сообщение, прежде чем я что-то сделаю) kolory.add_command(label="Czerwony", command=lambda: color_picker('red')) Это как бы работает, но я не знаю, что здесь означает "лямбда". Это единственный способ вызывать функции с аргументами в меню параметров?

Тот же вопрос касается обязательных сочетаний клавиш. okno.bind("1", color_picker) - это вызовет функцию, но не имеет аргумента, который должен быть цветом. Как я могу это сделать?

Итак, как назначить функции аргументам WITH, сочетаниям клавиш и меню с помощью add_command?

PS. Искал через google, но кажется, что в python нет такой хорошей документации, как, например, в c #. Или я слишком глуп, чтобы найти это.

EDIT:

Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Python27\lib\lib-tk\Tkinter.py", line 1410, in __call__
    return self.func(*args)
TypeError: color_picker() takes at most 1 argument (2 given)

Это сообщение об ошибке, когда я пытаюсь использовать "pick_red" в okno.bind

1 Ответ

3 голосов
/ 22 февраля 2012

Я не уверен, что понимаю вопрос, но здесь идет речь;

Проблема в том, что вы вызываете функцию color_picker (добавляя () послеимя функции).

То, что вы хотите сделать, это передать фактическую функцию , а не результат вызова функции в качестве аргумента ключевого слова command, например, add_command(label="Czerwony", command=color_picker)

Однако, поскольку вы хотите задать ему фиксированный аргумент 'red', вы должны использовать частичный из functools, что-то вроде;

from functools import partial
pick_red = partial(color_picker, "red")
kolory.add_command(label="Czerwony", command=pick_red)

EDIT:

Теперь, когда ваше сообщение об ошибке показывает, что вы используете Tkinter, мы можем видеть, что согласно документации функция, которая передается bind(), всегда передаетсяevent параметр, поэтому вам нужна функция, которая может его принять;

def pick_red_with_event(event):
    # We really do nothing with event for now but we always get it...
    color_picker("red")

okno.bind("1", pick_red_with_event)

То же самое работает для okno.bind, если вы определили pick_red, как указано выше, просто выполните:

okno.bind("1", pick_red)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...