如何在事件中使用lambda i = i?

时间:2019-06-21 01:21:44

标签: python tkinter lambda

我第一次尝试使用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 个答案:

答案 0 :(得分:1)

同样的想法,您正在创建一个具有默认值的可选参数:

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)