如何使用for循环创建按钮,然后在我的命令函数中分别配置每个按钮?

2024-09-30 10:27:59 发布

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

我已经创建了9个带有循环的按钮,希望每个按钮在单击时都显示“x”。但是,命令功能没有为每个按钮正确执行

我已经试过用lambda了。。。我想问题可能在于我给每个按钮命名的方式

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个


Tags: lambdatext命令self功能boxstringconfigure
1条回答
网友
1楼 · 发布于 2024-09-30 10:27:59

为了访问在循环中创建的小部件,我们使用字典和列表来保持对它们的引用。稍后,我们可以从字典或列表中存储的引用中修改它们

像这样

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


现在,如何将命令传递给循环中的每个按钮

我看到您正在使用来自functoolspartial将参数传递给函数mark_box,我们也可以使用lambda来获得相同的结果,而无需导入functools请参阅post以获得更好的理解。

下面是一个组合示例,演示如何使用lambda将循环中的参数传递给Button的回调函数,并保留对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()

相关问题 更多 >

    热门问题