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

2024-03-28 21:11:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我第一次尝试使用lambda event:和tkinter,在循环中使用它时遇到了困难

我知道在使用lambda时需要指定i等于什么,但我不确定如何与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按钮工作得很好,因为我在lambda之后有i=numbers[counter],但是我得到了IndexError: list index out of range,因为我在绑定do_something函数时没有

我怎样才能解决这个问题

TL;DR 我想这样做,但我不知道怎么做:

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


Tags: lambdatext文本eventbindtkintercounterrange
1条回答
网友
1楼 · 发布于 2024-03-28 21:11:54

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

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)

相关问题 更多 >