2016-12-02 81 views
1

我正在嘗試使用ComboBox控件跟蹤變量。當我改變ComboBox值我得到以下錯誤:跟蹤變量 - 組合框Tkinter

AttributeError: 'StringVar' object has no attribute '_report_exception' 

我在做什麼錯?

import tkinter as tk 
from tkinter import ttk, StringVar 

class TEST(tk.Frame): 
    def __init__(self, parent): 
     tk.Frame.__init__(self, parent) 
     self.parent = parent 

     self.estvalue = StringVar() 

     self.pestanas = ttk.Notebook(self.parent) 
     self.geometria = ttk.Frame(self.pestanas) 
     self.viento = ttk.Frame(self.pestanas) 
     self.topografia = ttk.Frame(self.pestanas) 
     self.pestanas.add(self.geometria, text="Parámetros Globales") 
     self.pestanas.add(self.viento, text="Viento") 
     self.pestanas.grid(sticky=tk.W, pady=6, padx=6) 
     Estructura = ["Edificios", 
         "Chimeneas, Tanques y Estructuras similares", 
         "Carteles llenos", 
         "Carteles abiertos y Estructuras similares"] 
     self.Estructura = tk.LabelFrame(self.geometria, text="Estructura", 
             labelanchor="nw", borderwidth="2", 
             relief="groove", pady=5, padx=5) 
     self.Estructura.grid(column=0, row=0, sticky=tk.W) 
     self.Est = ttk.Label(self.Estructura, text="Tipo de Estructura") 
     self.Est.grid(column=0, row=0, sticky=tk.W) 
     self.Est = ttk.Label(self.Estructura, text="Tipo de Estructura") 
     self.Est.grid(column=0, row=1, sticky=tk.W) 
     self.boxest = ttk.Combobox(self.Estructura, textvariable=self.estvalue, 
            state='readonly', width=36) 
     self.boxest['values'] = Estructura 
     self.boxest.current(0) 
     self.boxest.grid(column=1, row=0, sticky=tk.E, padx=5) 

     self.estvalue.trace_variable("w",self.eventest()) 

    def eventest(self): 
     if self.estvalue.get() == "Edificios": 
      print("foo") 
     else: 
      print("bar") 

def main(): 
    root = tk.Tk() 
    app = TEST(root) 
    app.grid() 
    root.title("App") 
    root.focus_force() 
    root.minsize(width=600, height=390) 
    root.columnconfigure(0, weight=1) 
    root.mainloop() 

if __name__ == '__main__': 
    main() 

回答

3

你必須給追蹤參考的功能。相反,你是調用函數並給出跟蹤任何函數返回。

建立這樣的軌跡(注意失蹤()

self.estvalue.trace_variable("w",self.eventest) 

跟蹤將沿着三個值傳遞給函數,所以你需要修改你的函數接受這些論點即使你不要使用它們。

+0

這還不是全部。處理程序的定義必須改爲接受另外三個參數:'def eventest(self,a,b,c):'。我不確定附加參數包含什麼,但在這種情況下可以忽略它們。 – martineau

+0

@martineau:我在最後一段談到了這一點。至於他們是什麼,請參閱http://stackoverflow.com/questions/29690463/what-are-the-arguments-to-tkinter-variable-trace-method-callbacks –

+0

哎呀,對不起,我錯過了你的答案的一部分。無論如何,感謝您的鏈接。 – martineau