2016-10-18 23 views
0

試圖讓我的腦海中圍繞如何在寫入條目後啓用按鈕的狀態。我正在嘗試一個新窗口Toplevel。其中,有三個入口小部件。填充值後,應啓用「運行」按鈕。我知道我必須使用trace方法將觀察者回調附加到變量。這是我迄今爲止所做的。試圖在所有條目更新後嘗試更改按鈕的狀態

class appl: 
    def __init__(self, master): 
     self.master = master 
     self.frame = tk.Frame(self.master, width=800, height=700) 
     self.var = tk.IntVar() 
     self.func1 = tk.Radiobutton(self.frame, text='fun1', value=1, variable=self.var,command=self.new_window) 
     self.func1.pack() 
     self.frame.pack() 
    def new_window(self): 
     self.newWindow = tk.Toplevel(self.master) 
     self.intvar1 = tk.IntVar() 
     self.intvar2 = tk.IntVar() 
     self.intvar3 = tk.IntVar() 
     self.ent = tk.Button(self.newWindow, text='ENTER', state='disabled', command=self.validate_check).grid(row=3, column=1) 
     self.intvar1.trace('w', self.validate_check) 
     self.intvar2.trace('w', self.validate_check) 
     self.intvar3.trace('w', self.validate_check) 
     self.X = tk.Entry(self.newWindow,textvariable=self.intvar1) 
     self.Y = tk.Entry(self.newWindow, textvariable=self.intvar2) 
     self.Z = tk.Entry(self.newWindow, textvariable=self.intvar3) 
     self.X.grid(row=0, column=1) 
     self.Y.grid(row=1, column=1) 
     self.Z.grid(row=2, column=1) 
     tk.Label(self.newWindow, text=" X").grid(row=0) 
     tk.Label(self.newWindow, text=" Y").grid(row=1) 
     tk.Label(self.newWindow, text=" Z").grid(row=2) 
    def validate_check(self, *args): 
     x = self.intvar1.get() 
     y = self.intvar2.get() 
     z = self.intvar3.get() 
     if x and y and z: 
      self.ent.config(state=NORMAL) 
     else: 
      self.ent.config(state=DISABLED) 
def main(): 
    root = tk.Tk() 
    app = appl(root) 
    root.mainloop() 
if __name__ == '__main__': 
    main() 

回答

3

您的代碼,除了幾乎工作:

self.ent = tk.Button(self.newWindow, text='ENTER', state='disabled', command=self.validate_check).grid(row=3, column=1) 

應該是:

self.ent = tk.Button(self.newWindow, text='ENTER', state='disabled', command=self.validate_check) 
self.ent.grid(row=3, column=1) 

此外,當你以外0-9在輸入框中輸入的東西,validate_check(...)將引發異常,因爲輸入文本不能轉換爲整數值。嘗試將validate_check(...)更改爲:

def validate_check(self, *args): 
    try: 
     x = self.intvar1.get() 
     y = self.intvar2.get() 
     z = self.intvar3.get() 
     # all three entries are valid integers, enable the button 
     self.ent.config(state=tk.NORMAL) 
    except: 
     # something wrong on the entries, disable the button 
     self.ent.config(state=tk.DISABLED) 
+0

工作正常,謝謝你! –