私は動的に変更したいTkinterウィジェットのリストを持っています。ウィンドウからTkinterウィジェットを削除するには?
私のウィンドウからウィジェットを完全に削除するにはどうすればいいですか?
私は動的に変更したいTkinterウィジェットのリストを持っています。ウィンドウからTkinterウィジェットを削除するには?
私のウィンドウからウィジェットを完全に削除するにはどうすればいいですか?
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
を使用することができますがウィジェットを非表示にします。
ウィジェットが関数の一部であり、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
行が本当に上記で必要と確信していません。
あなたが作成する最初のラベルを削除する方法がないという事実は、あなたが一つの関数でそれを作成し、別の関数でそれを削除しているという事実に関連していません。参照を保持する。これはtkinterものではなく、プログラミングのものです。オブジェクトを操作するには、オブジェクトへの参照が必要です。 2番目の例では、グローバル変数を使用する必要はありません。代わりに、エントリウィジェットのように 'self'に割り当てます。 –
あなたができることの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()
はあなたがフレームにウィジェットを追加するために使用される方法に応じて呼び出す必要があります。
今日、私は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
これは質問の答えになるはずですか?そうでない場合は、削除してください。その場合は、これがウィジェットの削除にどのように関係するかを明確にする必要があります。 –
python3のために私を動機づけてくれた@BryanOakleyに感謝します。 :D – ArifMustafa
...それが誰かを助けることを願っています:pack_forget'はウィジェットを削除しません '、それが唯一のビューから削除されることに注意してください。ウィジェットを破棄せずにウィジェットを再作成すると、メモリリークが発生する可能性があります。 –
Frameを 'pack_forget'して削除すると、子ウィジェットも削除されますか、それとも個別に削除する必要がありますか? – Marco83
packの代わりにplaceの 'place_forget'のようなことをすることができますか? – Stegosaurus