我使用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”。这是否意味着我再也无法访问这些人了?如何“寻址”迭代创建的对象,因此没有名称?
答案 0 :(得分:2)
使用结构(list
或dictionary
)来保存您的对象。
这两个选项之间的主要区别 - 使用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'通过索引从条目中更改按钮的缓解。