我正在制作一个带有Tkinter GUI的python应用程序。到目前为止,它有一些动态创建的列表框,我将链接到一个滚动条。我需要一种方法让yscroll()
知道哪个列表框已滚动。将i
变量传递给yscroll()
不起作用。
from Tkinter import *
class MyApp(Tk):
def __init__(self):
Tk.__init__(self)
self.title(' - My App - ')
self.listboxes = []
for i in xrange(5):
lb = Listbox(self, yscrollcommand=lambda i, *args: self.yscroll(i, *args))
for x in xrange(30):
lb.insert('end', x)
lb.pack(fill='y', side='left')
self.listboxes.append( lb )
self.scrollbar = Scrollbar(self, orient='vertical')
self.scrollbar.pack(side='right', fill='y')
def yscroll(self, i, *args):
print i
print args
ma = MyApp()
ma.mainloop()
答案 0 :(得分:2)
usual recipe for using a variable from a loop in a lambda似乎与参数解包与*args
一起使用时无法正常工作。但由于*args
在这种情况下似乎总是包含两个值(视口的开头和结尾,除非我误认为),你可以像这样重写lambda
:
lb = Listbox(self, yscrollcommand = lambda x, y, i=i: self.yscroll(i, x, y))
或者您可以创建一种" meta lambda",创建一个具有i
正确值的lambda
make_callback = lambda i: lambda *args: self.yscroll(i, *args)
lb = Listbox(self, yscrollcommand = make_callback(i))
当定义i
时,两者都会将i
绑定到迭代中lambda
的值。