2016-01-05 3 views
-1

У меня есть функция, которая должна создать окно, согласно которому параметр в раскрывающемся меню выбран:Исключение возникает с trace_variable()

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: Целые 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.

EDIT: Добавлена ​​функция обратного вызова тест:

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' 
+0

Пожалуйста, опубликуйте весь отчет Traceback – vrs

+0

@vrs Добавил его .. –

+0

Итак, вы создали функцию с именем 'buildview', которая устанавливает трассировку для вызова' buildview'? Это _really_ ваш код? –

ответ

1

Я не совсем уверен, что это единственная проблема, но это определенно a проблема. При срабатывании следа он проходит в three arguments. Определенная вами функция не принимает аргументов. Вам нужно передать ссылку на функцию, которая принимает как минимум три аргумента.

У вас также есть проблема, что каждый раз, когда следы пожары, вы создаете другой переменные и другого следа. На поверхности, которая кажется плохой идеей, если вы действительно не хотите создавать новое меню опций каждый раз, когда изменяется переменнаяменю.

+0

Ну, я, кажется, совершенно неправильно понял, что делают методы trace и trace. Я думал, что они смотрят одну единственную переменную и вызывают функцию обратного вызова, как только это значение изменяется. Есть ли способ сделать это с помощью этого метода? –

+0

@FloKlar: вы, кажется, понимаете это хорошо. Когда переменная изменяется, вызывается обратный вызов. –

+0

Но как указать, какую переменную смотреть в root.trace_variable ("w", buildview)? Или он постоянно наблюдает за всеми переменными? –

Смежные вопросы