如何使用for循环创建按钮,然后可以分别在命令功能中分别对其进行配置?

时间:2019-05-12 22:16:01

标签: python tkinter

我创建了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个按钮。

1 个答案:

答案 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()