gpt4 book ai didi

python - 如何使用 for 循环创建按钮,然后可以在我的命令函数中单独配置每个按钮?

转载 作者:太空宇宙 更新时间:2023-11-03 20:54:35 24 4
gpt4 key购买 nike

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

最佳答案

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

就像这样..

all_buttons = []
for i in range(9):
button = Button(root, .... )
all_buttons.append(button)

当我们需要获取特定按钮时,我们可以通过 all_buttons[0] 获取它,这将为我们提供 Button实例首先在循环中创建。

但是,如果您想给出自己的标签或名称来引用每个Button,则使用dictionary,其中key将是名称, value 将是 Button 的实例。

all_buttons = {}
for i in range(9):
button = Button(root, .... )
all_buttons.update({ 'Button_%s'%i : button })

作为引用,我们使用 all_buttons['Button_0'] 为我们提供了第一个创建的 Button

<小时/>

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

我看到您正在使用 functools 中的 partial 将参数传递给函数 mark_box,我们也可以使用 lambda 无需导入 functools 即可获得相同的结果。 引用此post为了更好地理解。

这里是一个组合示例,如何使用 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()

关于python - 如何使用 for 循环创建按钮,然后可以在我的命令函数中单独配置每个按钮?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56103899/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com