2011-05-25 60 views
3

如何使用checkbutton我禁用條目...我得到這個,但它好好嘗試工作(蟒蛇2.7.1)...使用checkbutton禁用小部件?

#!/usr/bin/env python2.7 
# -*- coding: utf-8 -*- 

from Tkinter import * 

root = Tk() 

class Principal(tk.Tk): 
    def __init__(self, *args, **kwargs): 

     foo = ""  
     nac = "" 

     global ck1 
     nac = IntVar()  
     ck1 = Checkbutton(root, text='Test',variable=nac, command=self.naccheck) 
     ck1.pack() 

     global ent 
     ent = Entry(root, width = 20, background = 'white', textvariable = foo, state = DISABLED)  
     ent.pack() 

    def naccheck(self): 
     if nac == 1: 
      ent.configure(state='disabled') 
     else: 
      ent.configure(state='normal')  

app=Principal() 
root.mainloop() 

回答

1

我做了主類的foo和NAC成員變量

... 
    self.foo = StringVar() 
    self.foo.set("test") 
    self.nac = IntVar() 
    ... 

然後在naccheck()參考self.nac

def naccheck(self): 
     if self.nac == 1: 
      ent.configure(state='disabled') 
      self.nac = 0 
     else: 
      ent.configure(state='normal') 
      self.nac = 1 

不要忘記改變CK1的變量= self.nac 和ENT的textvariable = self.f OO。

此外,您可能想使CK1和耳鼻喉科的成員變量,因爲你可能有後來與naccheck()

這些變化對我的Python2.7工作罰款

3

有很多小引用它們的問題你的代碼有問題。首先,Principle繼承自tk.Tk,但不能以名稱tk導入Tkinter。

其次,你不需要全局變量。你應該使用實例變量。

第三,由於「nac」是IntVar,您需要使用get方法來獲取該值。

最後,您正在使用foo作爲textvariable屬性的值,但您使用的是普通值。它需要一個Tk的變量(例如:StringVar

這裏有一個版本的代碼有固定的那些事:

#!/usr/bin/env python2.7 
# -*- coding: utf-8 -*- 

import Tkinter as tk 

root = tk.Tk() 

class Principal(tk.Tk): 
    def __init__(self, *args, **kwargs): 

     self.foo = tk.StringVar() 
     self.nac = tk.IntVar()  
     ck1 = tk.Checkbutton(root, text='Test',variable=self.nac, command=self.naccheck) 
     ck1.pack() 

     self.ent = tk.Entry(root, width = 20, background = 'white', 
          textvariable = self.foo, state = tk.DISABLED)  
     self.ent.pack() 

    def naccheck(self): 
     if self.nac.get() == 1: 
      self.ent.configure(state='disabled') 
     else: 
      self.ent.configure(state='normal')  

app=Principal() 
root.mainloop() 

順便說一句,不管你做from Tkinter import *import Tkinter as tk是風格問題。我喜歡後者,因爲它毫不懷疑哪個模塊包含類或常量的名稱。執行import *會導致問題,如果您導入名稱與文件中其他代碼衝突的名稱。

+0

謝謝...我使用「Tkinter作爲tk」因爲我喜歡一些舊樣式的小部件(而不是ttk)... – Hairo 2011-05-26 14:32:19

+0

@Hairo:我不明白你的意見。如何導入不會影響您是否使用ttk或原始小部件。另外,你說你正在使用'import Tkinter as tk',但在你的例子中顯然你不是。你的例子顯示'從Tkinter導入*' – 2011-05-26 15:16:32

+0

ohh,對不起,這只是一個例子......在我使用「import Tkinter as tk」的代碼中,所以如果我添加「tk.Entry」得到舊樣式,並且if只需使用「Entry」即可獲得ttk風格... – Hairo 2011-05-26 16:59:29