修改SV功能

时间:2015-05-21 08:14:39

标签: python tkinter

我试图修改StringVar(),以便可以记住以前的数据

class sv(sv):
    def __init__(self):
        self.svm_history = []
        self._name = StringVar()

    def SVM_set(self):
        if self._names:
            if svm_value!=self._name:
                self.svm_history.append(self._name)
                self._name = svm_value

    def SVM_undo(self):    
        return self.svm_history[-2]

我做错了什么?

2 个答案:

答案 0 :(得分:2)

确保您也调用父类型的__init__;当你这样做时,也要添加必要的参数:

class StringV_Memory (StringVar):
    def __init__ (self, master=None, value=None, name=None):
        StringVar.__init__(self, master, value, name)

        # the rest of your code

这样做可以确保正确初始化必要的东西;你的错误应该消失。

答案 1 :(得分:1)

除了the answer by poke之外,您正在以错误的方式使用Tkinter StringVar。你用StringVar覆盖self._name,你不应该这样做,因为你继承了StingVar。然后将其用作变量,而不使用.set().get()

我建议你这样做,类似下面的代码,允许用户使用常规.set().get()方法,并添加.undo()方法。请注意,undo now现在实际上不会更改该值,它只返回当前值之前的最后一个值。

班级:

class StringV_Memory(StringVar):
    def __init__(self, master=None, value=None, name=None):
        StringVar.__init__(self, master, value, name)
        self._tk.globalsetvar(self._name, value)
        self.svm_history = []
        self.svm_value = None 

    def set(self, svm_value):
        try:
            old = self.get()
        except TclError:
            # During Variable.__init__() set() is called but there is nothing to get yet
            # this will yield a TclError which you can catch and initialize the StringVar with an empty string
            self._tk.globalsetvar(self._name, '')
        else:
            if svm_value != old:
                self.svm_history.append(old)
                self._tk.globalsetvar(self._name, svm_value)

    def undo(self):    
        return self.svm_history[-1]

您可以使用:

root = Tk()
a = StringV_Memory(root)

a.set('1')
a.set('2')
a.set('3')

print a.get()
print a.undo()

root.mainloop()