我目前在选择数组内容时遇到问题。可以更改数组内容,因此我创建了import
方法并使用threading
来更新数据。
我将使用Tkinter作为我的GUI,我希望我的按钮在点击后返回数组的内容。
我的数组就像:myarray = ["Uno:Dos:Tres:Quatro","One:Two:Three:Four","A:B:C:D"]
。
代码:
from Tkinter import *
myarray = []
class Dummy:
def Sth(self):
global myarray
myarray = ["Uno:Dos:Tres:Quatro","One:Two:Three:Four","A:B:C:D"]
master = Tk()
master.grid()
for x in myarray:
x = x.split(":")
self.frame = Frame(master)
self.frame.pack()
self.thebutton = Button(self.frame,text=x[0],command=lambda: self.doFoo(x[0],x[1],x[2],x[3]))
self.thebutton.pack()
master.mainloop()
def doFoo(self,first,second,third,fourth):
popup = Tk()
popup.grid()
Label(popup,text=first).pack()
Label(popup,text=second).pack()
Label(popup,text=third).pack()
Label(popup,text=fourth).pack()
popup.mainloop()
A = Dummy()
A.Sth()
问题:点击按钮后,弹出窗口的内容为A,B,C,D
。
我的期望是:
Uno,Dos,Tres,Quatro
One,Two,Three,Four
我尝试过:
for index,x in enumerate(myarray):
x = x.split(":")
self.frame = Frame(master)
self.frame.pack()
self.thebutton = Button(self.frame,text=x[0],command=lambda index=index: self.doFoo(x[index][0],x[index][1],x[index][2],x[index][3]))
但我得IndexError: string index out of range
。
答案 0 :(得分:1)
考虑一下你的for
循环:它创建的三个按钮都具有相同的变量x
,而doFoo()
的回调始终将会获得通过了列表中的最后一项。
如果在lambda表达式中指定x = x,则每个命令将保留循环迭代中的信息。你需要重新格式化你的循环:
for x in myarray:
x = x.split(':')
Button(self.frame, text=x[0], command = lambda x=x: self.doFoo(x[0],x[1],x[2],x[3])).pack()
并把它:
self.frame = Frame(master)
self.frame.pack()
在你的for循环之外。
有关详细信息,请参阅:http://effbot.org/zone/tkinter-callbacks.htm