在一系列说5个Button对象中,我希望第一个单击的Button看到其'text'参数更新为数字1。然后,当我单击第二个Button时,无论哪个按钮,我都希望显示2,然后显示3,最多显示5。
这是我的尝试,它一直显示1并且不进行迭代。
import tkinter as tk
root = tk.Tk()
root.geometry('300x200')
buttons = []
def callback(num):
buttons[num].config(text=next(iter(range(1, 5))))
for i in range(5):
buttons.append(tk.Button(root, text='?', width=6, height=3, command=lambda x=i: callback(x)))
for j in buttons:
j.pack(side='left')
root.mainloop()
其他信息:使用lambda而不是直接调用它,我可能很难真正理解回调的操作方式,并且滥用后者可能是无法按预期工作的原因。这也是我第一次使用next()和iter(),可能做错了。
您需要将迭代器定义和next()
调用分开,否则每次都将创建一个新的迭代器。
如果您想将其升至5,还需要将6
放在iter(range(1, 6))
中。
尝试一下:
import tkinter as tk
root = tk.Tk()
root.geometry('300x200')
buttons = []
my_iter = iter(range(1, 6))
def callback(num):
buttons[num].config(text=next(my_iter))
for i in range(5):
buttons.append(tk.Button(root, text='?', width=6, height=3, command=lambda x=i: callback(x)))
for j in buttons:
j.pack(side='left')
root.mainloop()
请考虑以下内容:
buttons[num].config(text=next(iter(range(1, 5))))
您每次单击按钮都将创建一个新的迭代器。相反,您应该在全局范围内定义它,并在每次单击按钮时在其上调用下一步:
a = iter(range(1, 5))
def callback(num):
buttons[num].config(text=next(a))