如何有效地为tkinter框架添加大量按钮?

时间:2011-08-21 10:14:59

标签: python button tkinter

我想向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)

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

2 个答案:

答案 0 :(得分:4)

不是命名按钮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)

答案 1 :(得分:1)

您可以将所有按钮属性放在dict中,然后在其上循环以创建按钮,这是一个示例:

buttons = {
    'one': {'sticky': W+E+N+S, 'padx': 1, 'pady': 1},
    'two': {'sticky': W+E+N+S, 'row': 0, 'column': 1, 'padx': 1, 'pady': 1},
    'three': {'sticky': W+E+N+S, 'row': 0, 'column': 2, 'padx': 1, 'pady': 1}
}
for b in buttons:
    button = Button(frame, text=b.title(), command=self.callback)
    button.grid(**buttons[b])
    setattr(self, b, button)

如果需要,这还可以让您轻松添加新按钮。