Tkinter使用checkbutton禁用多个条目



使用Python 2.7,我想通过checkbutton将"Entry"小部件的状态切换为正常/禁用。

在这个问题的帮助下,用checkbutton禁用小部件?,我可以用1个检查按钮和1个进入

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

当我想要两个或两个以上的配对(checkbutton/entry(时,问题就来了。在我的最后一个界面中,我可能有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的使用,这是一种创建匿名函数的简单技术。这使您可以将参数传递给回调,而不必创建命名函数。另一种选择是使用functool.partial。毫无疑问,StackOverflow上有几十个这样的例子,因为这是一个非常常见的问题。

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

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

相关内容

  • 没有找到相关文章

最新更新