我已经搜索了这个解决方案并试图实现它们,但是没有成功获得tkinter Scale
小部件来通过设置command
关键字参数来调用方法。
我将小部件对象存储在字典中的列表中。在创建列表时调用该方法,并确实包含正确的对象。我认为范围可能是这里的问题。
import Tkinter as Tkinter
from Tkinter import *
import ttk as ttk
class App:
prefs = {
"Fred": "Dead", "Kims": "Limbs"
}
def __init__(self, root):
self.root = root
self.testiter=-1
lControls = {}
r=0 ; p=-1 ; self.pSlider = 0 ; self.pLabel = 0
for key, var in App.prefs.items():
lControls[key] = [] #add empty list for this key
p+=1
self.pSlider=p
s=Scale(root, from_=1, to=16, orient="horizontal",\
command= lambda x:self.UpdateValues(key)) #trying with 1 or no arguments
#s=Scale(root, from_=1, to=16, orient="horizontal",\
# command=self.UpdateValues(key))
#s=Scale(root, from_=1, to=16, orient="horizontal",\
# command=self.UpdateValues())
#s=Scale(root, from_=1, to=16, orient="horizontal",\
# command=self.UpdateValues) # <<< gives error "TypeError: UpdateValues() takes exactly 1 argument (2 given)"
#
lControls[key].append(s)
s.grid(row=r,column=0)
p+=1
self.pLabel=p
l=Label(root, text="AAArrrgggghhhH!")
lControls[key].append(l)
l.grid(row=r, column=1)
r+=1
def UpdateValues(self, key): #trying this with just self too
self.testiter+=1
print(self.testiter)
root = Tk()
App(root)
root.mainloop()
答案 0 :(得分:1)
调用UpdateValues
时,lambda表达式使用上次存在的key
值。特别是,无论您点击哪个滑块,key
都将是循环中最后一个迭代的值(可能是“Kims”)。
这种方法的典型解决方案是在lambda上放置一个默认参数,以便值尽早绑定,并且在循环的下一次迭代中不会更改。
s=Scale(root, from_=1, to=16, orient="horizontal",\
command= lambda x, key=key:self.UpdateValues(key))
您可以通过更改UpdateValues
的正文
def UpdateValues(self, key):
print(key)
当您单击顶部滑块时,它会打印“Kims”,当您单击底部滑块时,它会打印“Fred”。 (反之亦然,因为dict的迭代顺序依赖于实现)