【问题标题】:Disable widget with checkbutton?使用复选按钮禁用小部件?
【发布时间】:2011-09-02 01:31:21
【问题描述】:

如何使用复选按钮禁用条目...我知道了,但它不起作用(python 2.7.1)...

#!/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()

【问题讨论】:

    标签: python checkbox tkinter


    【解决方案1】:

    我做了 Principal 类的 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.foo。

    另外,您可能希望创建 ck1 和 ent 成员变量,因为稍后使用 naccheck() 引用它们时可能会遇到问题

    这些更改在我的 Python2.7 上运行良好

    【讨论】:

      【解决方案2】:

      您的代码有很多小问题。一方面,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 * 可能会导致问题。

      【讨论】:

      • 谢谢...我正在使用“Tkinter as tk”,因为我喜欢一些旧样式的小部件(不是 ttk)...
      • @Hairo:我不明白你的评论。导入方式对您使用 ttk 还是原始小部件没有影响。另外,您说您正在使用import Tkinter as tk,但在您的示例中显然不是。您的示例显示 from Tkinter import *
      • 哦,对不起,这只是一个例子......在整个代码中,我也使用了“import Tkinter as tk”,所以如果我添加“tk.Entry”,则获得旧样式,如果只是使用"Entry" 获取 ttk 样式...
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-05-03
      • 2020-12-28
      • 2020-04-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多