我试图修改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]
我做错了什么?
答案 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()