2012-09-11 24 views

答えて

42

pack_forgetに電話してウィジェットを削除できます(ウィンドウに追加するにはpackを使用しています)。

例:

from tkinter import * 

root = Tk() 

b = Button(root, text="Delete me", command=lambda: b.pack_forget()) 
b.pack() 

root.mainloop() 

あなたがpack_forgetを使用する場合は、後でもう一度packを呼び出し、再びウィジェットを表示することができます。恒久的に削除したい場合は、ウィジェットのdestroyに電話してください(再度追加することはできません)。

あなたがgridメソッドを使用する場合は、あなたがgrid_forgetまたはgrid_removeを使用することができますがウィジェットを非表示にします。

+6

...それが誰かを助けることを願っています:pack_forget'はウィジェットを削除しません '、それが唯一のビューから削除されることに注意してください。ウィジェットを破棄せずにウィジェットを再作成すると、メモリリークが発生する可能性があります。 –

+3

Frameを 'pack_forget'して削除すると、子ウィジェットも削除されますか、それとも個別に削除する必要がありますか? – Marco83

+0

packの代わりにplaceの 'place_forget'のようなことをすることができますか? – Stegosaurus

-1

ウィジェットが関数の一部であり、grid_removeが別の関数の一部である場合、ラベルを削除しないことがわかりました。この例では...

def somefunction(self): 
    Label(self, text=" ").grid(row = 0, column = 0) 
    self.text_ent = Entry(self) 
    self.text_ent.grid(row = 1, column = 0) 
def someotherfunction(self): 
    somefunction.text_ent.grid_remove() 

...ラベルを削除する有効な方法はありません。私は見つけることができる

唯一の解決策は、ラベルに名前を付け、それをグローバルにすることです:

def somefunction(self): 
    global label 
    label = Label(self, text=" ") 
    label.grid(row = 0, column = 0) 
    self.text_ent = Entry(self) 
    self.text_ent.grid(row = 1, column = 0) 
def someotherfunction(self): 
    global label 
    somefunction.text_ent.grid_remove() 
    label.grid_remove() 

私はこの問題に遭遇したときに関与クラスは一つの関数がクラスにいると1ではない、がありました、私はglobal label行が本当に上記で必要と確信していません。

+1

あなたが作成する最初のラベルを削除する方法がないという事実は、あなたが一つの関数でそれを作成し、別の関数でそれを削除しているという事実に関連していません。参照を保持する。これはtkinterものではなく、プログラミングのものです。オブジェクトを操作するには、オブジェクトへの参照が必要です。 2番目の例では、グローバル変数を使用する必要はありません。代わりに、エントリウィジェットのように 'self'に割り当てます。 –

6

あなたができることの1つは、クリアする必要があるフレームからスレーブリストを取得し、必要に応じてそれらを破棄または「隠す」ことです。明確なフレームを取得するには、このようにそれを行うことができます。

from tkinter import * 

root = Tk() 

def clear(): 
    list = root.grid_slaves() 
    for l in list: 
     l.destroy() 

Label(root,text='Hello World!').grid(row=0) 
Button(root,text='Clear',command=clear).grid(row=1) 

root.mainloop() 

あなたはgrid_slaves()pack_slaves()またはslaves()はあなたがフレームにウィジェットを追加するために使用される方法に応じて呼び出す必要があります。

0

今日、私はpython3のtkinter guiライブラリを使って、このスレッドの中で共有したいと思っている簡単で良いクリックイベント処理を学びます。

from tkinter import * 

cnt = 0 


def MsgClick(event): 
    children = root.winfo_children() 
    for child in children: 
     # print("type of widget is : " + str(type(child))) 
     if str(type(child)) == "<class 'tkinter.Message'>": 
      # print("Here Message widget will destroy") 
      child.destroy() 
      return 

def MsgMotion(event): 
    print("Mouse position: (%s %s)" % (event.x, event.y)) 
    return 


def ButtonClick(event): 
    global cnt, msg 
    cnt += 1 
    msg = Message(root, text="you just clicked the button..." + str(cnt) + "...time...") 
    msg.config(bg='lightgreen', font=('times', 24, 'italic')) 
    msg.bind("<Button-1>", MsgClick) 
    msg.bind("<Motion>", MsgMotion) 
    msg.pack() 
    #print(type(msg)) tkinter.Message 


def ButtonDoubleClick(event): 
    import sys; sys.exit() 


root = Tk() 

root.title("My First GUI App in Python") 
root.minsize(width=300, height=300) 
root.maxsize(width=400, height=350) 
button = Button(
    root, text="Click Me!", width=40, height=3 
) 
button.pack() 
button.bind("<Button-1>", ButtonClick) 
button.bind("<Double-1>", ButtonDoubleClick) 

root.mainloop() 

は@TheBeardedBerry

+0

これは質問の答えになるはずですか?そうでない場合は、削除してください。その場合は、これがウィジェットの削除にどのように関係するかを明確にする必要があります。 –

+0

python3のために私を動機づけてくれた@BryanOakleyに感謝します。 :D – ArifMustafa

関連する問題