2

昨日、私はこの質問をしました。ループTkinterによる要素の作成で、いくつかの箇条書きを動的に作成する方法を見つけました。クリアボタンを追加して、押すとフォーム全体がリセットされるようにします。リストを[]に戻してみましたが、うまくいきませんでした。

編集-基本的に、リセットを押すと、フォームが読み込まれたときとまったく同じように表示されます。

4

2 に答える 2

4

ボタンは次のdestroy方法で削除されます。

    for button in self.button:
        button.destroy()

import Tkinter as tk

class ButtonBlock(object):
    def __init__(self, master):
        self.master = master
        self.button = []
        self.button_val = tk.IntVar()
        entry = tk.Entry()
        entry.grid(row=0, column=0)
        entry.bind('<Return>', self.onEnter)
        entry.focus()
        clear_button = tk.Button(master, text='Clear', command=self.onClear)
        clear_button.grid(row=0, column=1)
    def onClear(self):
        for button in self.button:
            button.destroy()
    def onEnter(self, event):
        entry = event.widget
        num = int(entry.get())
        self.onClear()
        for i in range(1, num+1):
            self.button.append(tk.Radiobutton(
                self.master, text=str(i), variable=self.button_val, value=i,
                command=self.onSelect))
            self.button[-1].grid(sticky='WENS', row=i, column=0, padx=1, pady=1)
    def onSelect(self):
        print(self.button_val.get())

if __name__ == '__main__':
    root = tk.Tk()
    ButtonBlock(root)
    root.mainloop()
于 2013-03-27T12:44:45.957 に答える
2

リストを元に戻す(つまり、を使用する)と、変数self.button = []に格納されているデータがクリアされます。buttonそのアクションだけでは、ユーザーインターフェイス(UI)に接続されません。(メソッドによって)作成されたウィジェットオブジェクトを明示的に削除する必要がありますonEnter

したがって、あなたが探しているクリアリング機能は、あなたの前の質問からの答えを拡張することによって実現可能であるはずです。onClearクラスにメソッドを追加して、「クリア」コントロールが選択されたときに(つまり、ボタンウィジェットを使用して)、ウィジェットがメソッドを呼び出すのと同じように、ButtonBlockそのコールバック関数が呼び出されるようにします。ButtonBlock.onClear()EntryonEnter

編集:この質問に対するunutbuの答えを参照してください。選択すると、clear_buttonコントロールはを呼び出しますButtonBlock.onClear()。forループはonClear、リストから各ボタンオブジェクトへの参照を取得しbutton、オブジェクトのdestroyメソッドを呼び出します。これにより、UIからオブジェクトが削除されます。

于 2013-03-27T12:47:46.433 に答える