0

我已经搜索了解决方案并尝试实现它们,但没有成功让 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()
4

1 回答 1

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 的迭代顺序取决于实现)

于 2013-09-16T19:08:34.673 回答