2011-05-25 64 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

相关问题