gpt4 book ai didi

python - Tkinter 使用复选按钮禁用多个条目

转载 作者:行者123 更新时间:2023-11-28 20:49:12 26 4
gpt4 key购买 nike

使用 Python 2.7,我想通过复选按钮将“Entry”小部件的状态变为正常/禁用。

借助这个问题Disable widget with 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()

当我想要 2 个或更多对(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()

不幸的是,当我启动此代码时,会立即为每个复选按钮调用方法“naccheck”,并且在我单击一个之后就再也不会调用...

我做错了什么?

最佳答案

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

ent = tk.Entry(...)
var = tk.IntVar()
chk = tk.Checkbutton(..., command=lambda e=ent, v=var: self.naccheck(e,v))

请注意 lambda 的使用,这是一种用于创建匿名函数的简单技术。这使您能够将参数传递给回调而无需创建命名函数。另一种选择是使用 functools.partial .毫无疑问,在 StackOverflow 上有几十个这样的例子,因为这是一个非常常见的问题。

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

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

关于python - Tkinter 使用复选按钮禁用多个条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15099954/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com