trace_variable()

时间:2016-01-05 19:40:42

标签: python tkinter callback

我有一个应该根据下拉菜单中的哪个选项构建一个窗口的函数:

def buildview():
    value = StringVar()
    options = ["one", "two", "three"]

    menu = OptionMenu(*(root, value) + tuple(options))

    ### Some window building accoring to the value selected... ###

    value.trace_variable("w", buildview)

引发的异常如下所示(EDIT:Entire Traceback):

Traceback (most recent call last):
  File "D:\Dropbox\PRO\infograbber\Infograbber 0.1.py", line 102, in <module>
    mainloop()
  File "C:\Python35\Python3564\lib\tkinter\__init__.py", line 405, in mainloop
    _default_root.tk.mainloop(n)
  File "C:\Python35\Python3564\lib\tkinter\__init__.py", line 1553, in __call__
    self.widget._report_exception()
AttributeError: 'StringVar' object has no attribute '_report_exception'

究竟是什么导致了这个?我可以没有这样的方法回调吗?我甚至不知道从哪里开始解决这个问题,所以我很感激你的帮助。

我正在使用Python 3.5 64位,Sublime Text 2,Windows 10。

编辑: 添加了测试回调函数:

def test(*args):
        print("test")

并将上面的描述更改为

value.trace_variable("w", test)

现在异常改为:

Traceback (most recent call last):
  File "C:\Python35\Python3564\lib\tkinter\__init__.py", line 1549, in __call__
    return self.func(*args)
  File "D:\Dropbox\PRO\infograbber\Infograbber 0.1.py", line 56, in buildview
    root.trace_variable("w", self.printcurrentarticle)
  File "C:\Python35\Python3564\lib\tkinter\__init__.py", line 1948, in __getattr__
    return getattr(self.tk, attr)
AttributeError: '_tkinter.tkapp' object has no attribute 'trace_variable'

1 个答案:

答案 0 :(得分:1)

我不完全确定这是否是唯一的问题,但它绝对是 问题。当跟踪触发时,它会通过three arguments。您定义的函数不带参数。您需要传入对至少包含三个参数的函数的引用。

您还遇到的问题是,每次跟踪触发时,您都要创建另一个变量和另一个跟踪。从表面看来,这似乎是一个坏主意,除非你真的想在每次选项菜单改变时创建一个新的选项菜单。