tkinter在单击时逐步显示按钮上的整数

问题描述 投票:1回答:2

在一系列说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(),可能做错了。

python tkinter callback
2个回答
2
投票

您需要将迭代器定义和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()

1
投票

请考虑以下内容:

buttons[num].config(text=next(iter(range(1, 5))))

您每次单击按钮都将创建一个新的迭代器。相反,您应该在全局范围内定义它,并在每次单击按钮时在其上调用下一步:

a = iter(range(1, 5))

def callback(num):
    buttons[num].config(text=next(a))
© www.soinside.com 2019 - 2024. All rights reserved.