修复函数StringVar_WithHistory

时间:2016-11-17 00:14:15

标签: python class

 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吗?感谢

2 个答案:

答案 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()