Traceback (most recent call last):
omu = OptionMenuUndo(main, 'Choose Option', 'option1','option2','option3')
self.result.set(title)
if StringVar.get(self) != value:
value = self._tk.globalgetvar(self._name)
AttributeError: 'NoneType' object has no attribute 'globalgetvar'
我正在使用StringVar_WithHistory类使其适用于OptionMenuUndo类。 StringVar_WithHistory有三种方法。
init (self):初始化基类;创建一个历史列表,用于存储使用。
调用的值集set(self,value):如果该值与当前值不同,则将StringVar设置为value并在历史列表中记住它(如果它与当前值相同,则不执行任何操作:无新选择)
undo(self):通过更新StringVar和历史列表
来撤消最近选择的选项我尝试运行代码,但出现以下错误:
df %>%
mutate(bit.change=cumsum(c(1, diff(bit) != 0)))
Day bit bit.change
1 2016-10-01 1 1
2 2016-10-02 0 2
3 2016-10-03 0 2
4 2016-10-04 1 3
5 2016-10-05 1 3
6 2016-10-06 0 4
7 2016-10-07 1 5
8 2016-10-08 1 5
9 2016-10-09 1 5
10 2016-10-10 1 5
有人可以告诉我如何修复myStringVar_WithHistory吗?感谢
答案 0 :(得分:3)
您忘记在子类的StringVar.__init__()
中调用__init__()
,因此var实际上从未创建过。
这是一个有趣的想法,但我认为它不会像你期望的那样起作用。请记住,StringVar不是Python对象;它是Tcl对象,存在于Tkinter嵌入的Tcl解释器中。如果某人从Python代码中set()
,则只会调用被覆盖的var.set()
方法。由Tk小部件的内置功能引起的对变量的任何更改都将直接影响Tcl变量; Python方面没有涉及任何内容。您可以通过使用StringVar的跟踪功能来了解该值,而不是尝试覆盖任何方法。
答案 1 :(得分:0)
您忘记了StringVar.__init__()
顺便说一句:你必须使用[-2]
或第一个弹出值。
PS。 self.history大小,因为它可能是空的。
from tkinter import StringVar
class StringVar_WithHistory(StringVar):
def __init__(self, **kwargs):
StringVar.__init__(self, **kwargs)
self.history = []
def set(self, value):
if StringVar.get(self) != value:
StringVar.set(self, value)
self.history.append(value)
#print('DEBUG:', self.history)
def undo(self):
StringVar.set(self, self.history[-2])
self.history.pop()
#print('DEBUG:', self.history)
import tkinter as tk
root = tk.Tk()
a = StringVar_WithHistory(value='TEST')
print(a.get())
a.set('Hello')
print(a.get())
a.set('World')
print(a.get())
a.undo()
print(a.get())
a.undo() # error because self.history is empty
root.mainloop()