Как использовать лямбда я = я с событием? - PullRequest
0 голосов
/ 21 июня 2019

Я экспериментирую с использованием lambda event: и tkinter в первый раз, и у меня возникли сложности при использовании его в цикле.

Я понимаю, что мне нужно указать, что i равно, когдаиспользуя lambda, но я не уверен, как это сделать в сочетании с event.Я хочу, чтобы кнопки tkinter совпали с вводом с клавиатуры, чтобы они оба печатали соответствующий текст, поэтому, когда я нажимаю 1 на моей клавиатуре, программа печатает 1 и так далее.

numbers = ['1', '2', '3', '4', '5', '6', '7', '8', '9']
counter = 0

for x in range(len(numbers)):
    key = Button(w, text=numbers[counter], 
                 command=lambda i=numbers[counter]: do_something(i))

    root.bind(number[counter], lambda event: 
              do_something(numbers[counter]))

    counter += 1

def do_something(event, text):
    print(text)

Существующие кнопки tkinter отлично работают, потому что у меня i=numbers[counter] после lambda, но я получаю IndexError: list index out of range, потому что не знаю, когда привязываю функцию do_something.

Как я могу решить эту проблему?

TL; DR Я хочу сделать что-то это, но я не знаю, как:

root.bind(test[counter], lambda event: i=numbers[counter]: self.keyboard_input(numbers[counter]))

1 Ответ

1 голос
/ 21 июня 2019

Та же идея, вы создаете необязательный параметр со значением по умолчанию:

lambda event, i=numbers[counter]: do_something(i)

(хотя i немного странный выбор имени.)

Рассмотрите возможность вызовафункция вместо этого, так что нет необходимости повторять этот хак и циклически перебирать элементы списка напрямую, если вы не используете счетчик снаружи в качестве индекса:

def create_button(number):
    key = Button(w, text=number,
                 command=lambda: do_something(number))

    root.bind(number, lambda event: do_something(number))


numbers = ['1', '2', '3', '4', '5', '6', '7', '8', '9']

for number in numbers:
    create_button(number)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...