Python Tkinter使用checkbutton禁用多个条目

Python Tkinter使用checkbutton禁用多个条目,python,checkbox,tkinter,tkinter-entry,Python,Checkbox,Tkinter,Tkinter Entry,对于Python2.7,我想通过一个checkbutton将“Entry”小部件的状态转换为normal/disable 有了这个问题的帮助,我可以用一个检查按钮和一个条目来完成 #!/usr/bin/env python2.7 # -*- coding: utf-8 -*- import Tkinter as tk root = tk.Tk() class Principal(tk.Tk): def __init__(self, *args, **kwargs):

对于Python2.7,我想通过一个checkbutton将“Entry”小部件的状态转换为normal/disable

有了这个问题的帮助,我可以用一个检查按钮和一个条目来完成

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

        self.ck1 = tk.Checkbutton(root, text='test',
            variable=self.nac, command=self.naccheck)
        self.ck1.pack()

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

    def naccheck(self):
        print "check"
        if self.nac.get() == 0:
            self.ent1.configure(state='disabled')
        else:
            self.ent1.configure(state='normal')

app = Principal()
root.mainloop()
当我想要2对或更多对(选中按钮/条目)时,问题就会出现。 在我的最后一个界面中,我可能有20个或更多的这对,所以我希望避免有20个或更多相同的“naccheck”方法

我试过这个:

#!/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 = {}
        self.ent = {}

        self.ent["test"] = tk.Entry(root, width=20, background='white', textvariable=self.foo, state='disabled')
        self.ent["test"].pack()

        self.ent["image"] = tk.Entry(root, width=20, background='white', textvariable=self.foo, state='disabled')
        self.ent["image"].pack()

        self.nac["test"] = tk.IntVar()
        self.ck1 = tk.Checkbutton(root, text='test', variable=self.nac["test"], command=self.naccheck("test"))
        self.ck1.pack()

        self.nac["image"] = tk.IntVar()
        self.ck1 = tk.Checkbutton(root, text='image', variable=self.nac["image"], command=self.naccheck("image"))
        self.ck1.pack()


    def naccheck(self,item):
        print "check "+item
        print self.nac[item].get()
        if self.nac[item].get() == 0:
            self.ent[item].configure(state='disabled')
        else:
            self.ent[item].configure(state='normal')

app = Principal()
root.mainloop()
不幸的是,当我启动这段代码时,会立即为每个checkbutton调用方法“naccheck”,而在我单击一个按钮之后就再也不会调用了


我做错了什么

有很多方法可以解决这个问题。一种方法是将entry和checkbutton变量传递到check函数中。首先创建条目小部件和变量。然后,创建checkbutton并将变量和条目传递到回调:

ent = tk.Entry(...)
var = tk.IntVar()
chk = tk.Checkbutton(..., command=lambda e=ent, v=var: self.naccheck(e,v))
注意lambda的使用,这是一种创建匿名函数的简单技术。这使您能够向回调传递参数,而无需创建命名函数。另一个选择是使用。毫无疑问,StackOverflow上有几十个这样的例子,因为这是一个非常常见的问题

接下来,需要修改函数以接受参数:

def naccheck(self, entry, var):
    if var.get() == 0:
        entry.configure(state='disabled')
    else:
        entry.configure(state='normal')

为什么不将所有
条目
存储在一个数组中,然后在
naccheck
中对它们运行
for
循环呢?我的条目在一个数组中!1检查按钮必须“激活”相关条目。通过入口循环有什么好处?谢谢!“lambda”函数的作用是:-)。当您定义“v”,然后在“naccheck”调用中使用“c”时,命令中出现了一个输入错误。@Eric:谢谢您让我知道这个输入错误;我修好了。测试后,我为什么要用“e”和“v”呢?似乎,在不修改代码的情况下,只添加“lambda”(command=lambda:self.naccheck(“test”))也可以工作@埃里克:如果你想通过v和c,lambda很有用。正如你所建议的,还有其他方法可以解决这个问题。在使用相同键将对象存储在字典中的情况下,传入键可以正常工作。