按钮返回特定字符串 [Tkinter]
我现在有一个Tkinter程序,它可以显示多个名字,每个名字旁边都有一个叫“Foo”的按钮。
当你点击这个按钮时,它会调用一个函数,这个函数需要获取按钮左边的名字,也就是标签的名字。
我创建按钮和标签的代码是这样的:
from Tkinter import *
class display():
def __init__(self):
self.namelist = ["Mike","Rachael","Mark","Miguel","Peter","Lyn"]
def showlist(self):
self.controlframe = Frame()
self.controlframe.pack()
self.frame = Frame(self.controlframe,height=1)
self.frame.pack()
row = 0
for x in self.namelist:
label = Label(self.frame,text="%s "%x,width=17,anchor="w") #limit the name to 17 characters
fooButton = Button(self.frame,text="Foo")
label.grid(row=row, column=0, sticky="W")
fooButton.grid(row=row, column=1)
row = row + 1
mainloop()
D = display()
D.showlist()
我想实现的功能是:如果我点击了旁边的Foo
按钮,比如说旁边是Mark
,那么这个按钮就能返回标签的名字Mark
。其他标签旁边的Foo
按钮也是一样的。
谢谢!
1 个回答
1
下面是你可以这样做的方法:
- 在循环中为每个按钮定义一个命令
- 把当前循环的索引传递给回调函数(可以参考如何在Tkinter中给按钮命令传递参数)
- 在按钮点击的回调函数中,通过传入的索引从
namelist
中获取对应的项目
下面是代码:
from Tkinter import *
class display():
def __init__(self, controlframe):
self.controlframe = controlframe
self.namelist = ["Mike", "Rachael", "Mark", "Miguel", "Peter", "Lyn"]
def callback(self, index):
print self.namelist[index]
def showlist(self):
self.frame = Frame(self.controlframe, height=1)
self.frame.pack()
row = 0
for index, x in enumerate(self.namelist):
label = Label(self.frame, text="%s " % x, width=17, anchor="w") #limit the name to 17 characters
fooButton = Button(self.frame, text="Foo",
command=lambda index=index: self.callback(index))
label.grid(row=row, column=0, sticky="W")
fooButton.grid(row=row, column=1)
row = row + 1
tk = Tk()
D = display(tk)
D.showlist()
tk.mainloop()
注意索引是如何传递给lambda的,这就是所谓的“lambda闭包作用域”问题,详细可以查看Python lambda闭包作用域。
希望这对你有帮助。