Python Tkinter:如何配置循环中生成的按钮?

时间:2017-06-16 11:28:28

标签: python-2.7 tkinter

我使用Python 2.7和Tkinter为我的代码制作GUI。 在某一点上,一个框架在循环中充满了许多按钮。当我点击其中一个按钮时,该函数需要知道它被调用的位置,所以我用Google搜索并找到了这个好方法:

def generate_buttons(n):
    for i in xrange(n):
        newbutton = str(i)
        newbutton = Button(myFrame, text=newbutton, command= lambda name=i:print_name(name)).grid(column=i)

def print_name(name):
    print name

所以当我生成这样的按钮时:

generate_buttons(5)

5个按钮出现在一行中。如果我点击数字3,控制台将打印“3”。

如果我想进一步访问按钮,我该怎么办?例如,给他们一个新的外观。如果我只创建了一个按钮,那将很容易:

myButton.Button(text="bla")
myButton.config(relief=SUNKEN)

myButton.config(padx=10)

但是在循环中,我一直覆盖“newbutton”。这是否意味着我再也无法访问这些人了?如何“寻址”迭代创建的对象,因此没有名称?

1 个答案:

答案 0 :(得分:2)

使用结构(listdictionary)来保存您的对象。 这两个选项之间的主要区别 - 使用list,您访问theese对象的逻辑仅限于索引,而使用dictionary时,key参数可以是任何内容(也可以是索引) 。如果您需要阅读有关结构的内容,请查看python docs

这是一个带有列表的片段:

try:
    import tkinter as tk
except ImportError:
    import Tkinter as tk


def generate_buttons(n):
    for _ in range(n):              #   xrange in python 2
        newbutton = tk.Button(text=_, command=lambda name=_: change_relief(name))
        newbutton.grid(column=_)
        buttons.append(newbutton)


def change_relief(idx):
    button = buttons[idx]

    if button['relief'] == 'raised':
        button.config(relief='sunken')
    else:
        button.config(relief='raised')


root = tk.Tk()

#   our list with buttons
buttons = []

#   generate some buttons
generate_buttons(5)

#   another button, that uses a value from an entry below
change_relief_button = tk.Button(text='Change relief by id',
                                 command=lambda: change_relief(int(id_entry.get())))
change_relief_button.grid()

#   entry with user input
id_entry = tk.Entry()
id_entry.grid()

#   default 0
id_entry.insert(0, '0')

#   mainloop
root.mainloop()

每个编号按钮都可以改变它自己的浮雕,而`change_relief_button'通过索引从条目中更改按钮的缓解。