2

Python 2.7 では、「エントリ」ウィジェットの状態をチェックボタンのおかげで通常/無効にしたいと考えています。

この質問の助けを借りて、チェックボタンでウィジェットを無効にしますか? 、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つ以上のペア(チェックボタン/エントリ)を持ちたいときに問題が発生します。私の最終的なインターフェースでは、このペアが 20 個以上ある可能性があるため、同じ「naccheck」メソッドを 20 個以上持つことは避けたいと思います。

私はこれを試しました:

#!/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」メソッドがすぐに呼び出され、いずれかをクリックしても呼び出されません...

私が間違ったことをしましたか?

4

1 に答える 1

8

この問題を解決するには多くの方法があります。1 つの方法は、entry 変数と checkbutton 変数を check 関数に渡すことです。最初にエントリ ウィジェットと変数を作成します。次に、チェックボタンを作成し、変数とエントリをコールバックに渡します。

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

匿名関数を作成するための単純な手法であるラムダの使用に注意してください。これにより、名前付き関数を作成しなくても、引数をコールバックに渡すことができます。別のオプションは、functools.partialを使用することです。これは非常に一般的な質問であるため、間違いなく StackOverflow にこの例が多数あります。

次に、引数を受け入れるように関数を変更する必要があります。

def naccheck(self, entry, var):
    if var.get() == 0:
        entry.configure(state='disabled')
    else:
        entry.configure(state='normal')
于 2013-02-26T22:03:04.817 に答える