2

後で削除またはアンパックできるという警告を付けて、ウィジェット(おそらくラベル)を作成する方法を探しています。

ウィジェットは問題なく生成できますが、名前が割り当てられていません。可能であれば、特定の匿名ウィジェットを削除する方法がわかりません。

私の最初の本能は、安定した規則で変数名を動的に作成することでしたが、それはワームの缶を不必要に開く可能性があります。その考え方を以下に示します。実行時に処理する数がわからないときに、特定のボタン ウィジェットを削除できるようにしたいと考えています。ありがとうございました。

from Tkinter import *
import time
import ttk


def onDoubleClick(event):
    item = t.selection()
 #print "you clicked on", t.item(item,"text")

    if (t.item(item,"text")=="Start IO"):
        Button2 = Button(frame2,text="Button2",command=but).pack()


def but():
    pack_forget()

root=Tk()
root.geometry("800x300")
frame1 = Frame(root)
frame2 = Frame(root)

t=ttk.Treeview(frame1)
t.heading("#0",text="Test steps")
t.insert("",0,"IO",text="IO")
t.insert("IO","end",text="Start")
t.bind("<Double-1>", onDoubleClick)
t.pack()
frame1.pack(side=LEFT)
frame2.pack(side=LEFT)

編集:私の機能要求は確かに近視眼的でした。私の最終的な目標は、Label ウィジェットと Button を並べて配置することです。どちらも、テスト ランチャーの「ステップ」となるものを構成します。ボタンをクリックすると、それ自体とそれぞれのラベルの両方が GUI から削除されます。ボタンのコールバックで両方のウィジェットを作成し、どちらかを削除することはできますが、両方を pack_forget するには、関数を定義する必要があると思います。私の問題は、def removeStepへの正しい参照を渡すことにあると思います。使用例を以下に示します: ....[これが私の RTFM で解決できる場合は、お気軽にお知らせください。見つけられませんでした]

テスト: PB&J を作成する

ステップ 0: パンを入手する [ステップを削除]

ステップ 1: PB を塗抹する [ステップを削除]

ステップ 2: ゼリーを塗る [ステップを削除]

4

2 に答える 2

9

動的に作成されたウィジェットをリストに格納する必要があります。次のようなものがあります

dynamic_buttons = []

def onDoubleClick(event):
    ...
    button = Button(...)
    dynamic_buttons.append(button)
    button.pack()

次に、たとえば次のようにして、削除用のボタンにアクセスできます。

dynamic_buttons[0].destroy()

編集:ユースケースに関する詳細情報があれば、おそらくそうするでしょう

class RemovableTask(Frame):
    def __init__(self, master, name, **options):
        Frame.__init__(self, master, **options)
        lbl = Label(self, text=name)
        btn = Button(self, text='Remove step', command=self.destroy)
        lbl.grid(row=0, column=0)
        btn.grid(row=0, column=1)

次に、「Step 0: Get Bread」のような名前で RemovableTask のインスタンスを作成し、それらを列にグリッドまたはパックします。それ以外はすべて自動的に処理されます。

于 2013-02-11T01:42:22.790 に答える
4

ここにはいくつかのオプションがあります。最初のオプションは、動的に作成されたボタンをリストに保存することです。次に、いつでもボタンを追加/削除できます-そして、すべてのボタンへの参照を保持します。クリーンでシンプル。

2 番目のオプションはconfig、ボタンを作成した後 (そしてそれへの参照を取得した後) にメソッドを使用してウィジェットを破棄することです -- または、少なくとも表示から削除します (widget.pack_forget 実際にはウィジェットを破棄しません !実際にウィジェットを破棄するには、widget.destroy代わりに呼び出したい) ... :

import Tkinter as tk

root = tk.Tk()

def add_new():
    b = tk.Button(root,text="Click to destroy")
    b.pack()
    b.config(command=b.pack_forget) 

b = tk.Button(root,text="Add_new",command=add_new)
b.pack()
root.mainloop()
于 2013-02-11T01:46:18.397 に答える