gpt4 book ai didi

python - 如何有效地向 tkinter 框架添加大量按钮?

转载 作者:太空狗 更新时间:2023-10-30 00:00:23 26 4
gpt4 key购买 nike

我想给 Tkinter 添加 10 个按钮,命名为 One to Ten。我基本上只是使用蛮力方法,在我的应用程序类的 init 函数中添加每个按钮。它可以工作,但我想尽量减少使用的代码,以提高效率,例如使用数据结构来保存所有按钮。

我正在考虑使用 buttonBox 来容纳所有按钮,但我不确定是否可以通过 grid() 来操纵位置来放置按钮我想要的。

self.one = Button(frame, text="One", command=self.callback)
self.one.grid(sticky=W+E+N+S, padx=1, pady=1)

self.two = Button(frame, text="Two", command=self.callback)
self.two.grid(sticky=W+E+N+S, row=0, column=1, padx=1, pady=1)

self.three = Button(frame, text="Three", command=self.callback)
self.three.grid(sticky=W+E+N+S, row=0, column=2, padx=1, pady=1)

# ...

self.ten = Button(frame, text="Ten", command=self.callback)
self.ten.grid(sticky=W+E+N+S, row=1, column=4, padx=1, pady=1)

谁能告诉我一种提高效率的方法,例如数据结构?

最佳答案

与其将按钮命名为self.oneself.two等,不如通过索引列表来引用它们会更方便,例如self.button.

如果按钮做不同的事情,那么你只需要明确地将按钮与回调相关联。例如:

name_callbacks=(('One',self.callback_one),
('Two',self.callback_two),
...,
('Ten',self.callback_ten))
self.button=[]
for i,(name,callback) in enumerate(name_callbacks):
self.button.append(Button(frame, text=name, command=callback))
row,col=divmod(i,5)
self.button[i].grid(sticky=W+E+N+S, row=row, column=col, padx=1, pady=1)

如果按钮都做相似的事情,那么一个回调就足以为它们提供服务。由于回调本身不能接受参数,您可以设置回调工厂以通过闭包传递参数:

def callback(self,i): # This is the callback factory. Calling it returns a function.
def _callback():
print(i) # i tells you which button has been pressed.
return _callback

def __init__(self):
names=('One','Two','Three','Four','Five','Six','Seven','Eight','Nine','Ten')
self.button=[]
for i,name in enumerate(names):
self.button.append(Button(frame, text=name, command=self.callback(i+1)))
row,col=divmod(i,5)
self.button[i].grid(sticky=W+E+N+S, row=row, column=col, padx=1, pady=1)

关于python - 如何有效地向 tkinter 框架添加大量按钮?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7137636/

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