1

純粋なタッチシステムでパスワードコードを入力できるように、tkinter を使用して小さなテンキーを作成しようとしています。これは私がこれまでに持っているものです:

tkinter import ttk から tkinter をインポートする

def main():
    root = tkinter.Tk()
    numpad = NumPad(root)
    root.mainloop()


btn_list = [
'7',  '8',  '9',
'4',  '5',  '6',
'1',  '2',  '3', '0']


class NumPad(ttk.Frame):
    def __init__(self, root):
        ttk.Frame.__init__(self, root)
        self.grid()
        self.numpad_create()

    def numpad_create(self):
        r = 1
        c = 0
        for b in btn_list:
            cmd= lambda: print(b)
            self.b= ttk.Button(self, text=b,width=5,command=cmd).grid(row=r,column=c)
            print(b)
            c += 1
            if c > 4:
                c = 0
                r += 1

main()

プログラムを開始すると、数字 b がシェルに出力されるため、これは機能します。また、ボタンは希望どおりに表示されます。しかし、それらをクリックすると、シェルへの出力として常に 0 になります。私が行った間違いを見つけることができません。ガベージコレクションと関係があるのではないかと思いますが、よくわかりません。

誰か助けてくれませんか?それは本当に素晴らしいことです!

ありがとうございました!

4

3 に答える 3

2

cmd、あなたのラムダはb、ラムダ自体が宣言されたときの値をキャッチしません。の最終状態はb0あり、それがすべてのボタンが印刷される理由bです。

于 2013-04-29T17:07:10.193 に答える
0

の for ループはNumPad.numpad_create、各ボタン番号をループし、 に格納しますself.b。問題は、各数値が の以前の値を上書きするself.bため、実際に格納される値は だけになることです0。tkinter は、ライブ参照を持たないオブジェクトを自動的にガベージ コレクションします。リストである別の属性を追加しNumPad、すべてのボタン オブジェクトをその中に入れます。

@thkangも正しいです。2つの別々のバグがあると思います。私は実際にこれをテストしていないことに注意してください。

于 2013-04-29T17:12:20.047 に答える