我创建了9个带循环的按钮,希望每个按钮在单击时都显示“ x”。但是,命令功能不能正确执行每个按钮。
我已经尝试使用lambda ...我认为问题可能出在我为每个Button命名的方式上?
def create_buttons(self):
buttoncounter = 1
for i in range(9):
self.temp_string = "b" + str(buttoncounter)
self.temp_string = Button(self, text = "\n\t\n\t\n\t")
self.temp_string.grid(row = (20 + i), column = (20))
self.temp_string.configure(command=partial(self.mark_box,
buttoncounter))
buttoncounter += 1
def mark_box(self, num):
turnlist = ["x", "o"]
self.temp_string = "b" + str(num)
self.temp_string.configure(text = "x")
我希望能够单击一个按钮并将其自身选中,但是当我单击9个按钮中的任何一个时,它只会选中第9个按钮。
答案 0 :(得分:0)
要访问在循环中创建的窗口小部件,我们使用字典和列表来保留对其的引用。稍后,我们可以从存储在词典或列表中的引用中修改它们。
就像..
all_buttons = []
for i in range(9):
button = Button(root, .... )
all_buttons.append(button)
当我们需要获取特定按钮时,可以通过all_buttons[0]
来获取它,这将为我们提供循环中首先创建的Button
的实例。
但是,如果您想给自己的标签或名称引用每个Button
,请使用字典,其中键是名称,值将是Button
的实例。
all_buttons = {}
for i in range(9):
button = Button(root, .... )
all_buttons.update({ 'Button_%s'%i : button })
要引用,我们使用all_buttons['Button_0']
给我们第一个创建的Button
。
我看到您正在使用partial
中的functools
来将参数传递给函数mark_box
,我们也可以使用lambda
获得相同的结果而无需导入functools。 请参阅此post,以便更好地理解。
这是如何使用Button
在循环中将参数传递给lambda
的回调函数以及如何保留对Button
的引用的组合示例?
import tkinter as tk
root = tk.Tk()
label = tk.Label(root, text='Click the Button')
label.pack()
def update(text):
label.config(text="Button %s is clicked"%text)
all_buttons = []
for i in range(9):
button = tk.Button(root, text='Button %s'%i, command=lambda i=i: update(i) )
button.pack()
all_buttons.append(button)
print('\nThis the list containing all the buttons:\n', all_buttons)
root.mainloop()