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
それを行う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()
destroy()
このメソッドを使用して、次のように指定されたウィジェットを削除するだけです。
lbl = tk.Label(....)
btn = tk.Button(....., command=lambda: lbl.destroy())
これを使用すると、特定のウィジェットを完全に破棄できます。
動的に変更するウィジェットのリストがあると言います。既存のウィジェットを再利用して再構成しますか、それともすべての新しいウィジェットを作成して古いウィジェットを削除しますか?それは答えに影響します。
既存のウィジェットを再利用する場合は、ウィジェットを再構成するだけです。または、それらの一部を一時的に非表示にする場合は、対応する「forget」メソッドを使用して非表示にします。それらをpack()
呼び出しでマップした場合、呼び出しでpack_forget()
(または単にforget()
)非表示になります。したがって、grid_forget()
グリッド化されたウィジェットを非表示にしplace_forget()
、配置されたウィジェットを非表示にします。
ウィジェットを再利用する予定がない場合はdestroy()
、のように直接呼び出すことでウィジェットを破棄して、widget.destroy()
リソースを解放できます。
clear_btm=Button(master,text="Clear") #this button will delete the widgets
clear_btm["command"] = lambda one = button1, two = text1, three = entry1: clear(one,two,three) #pass the widgets
clear_btm.pack()
def clear(*widgets):
for widget in widgets:
widget.destroy() #finally we are deleting the widgets.
今日、私は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()
それが誰かを助けることを願っています...
ウィジェットでforgetメソッドを使用できます
from tkinter import *
root = Tk()
b = Button(root, text="Delete me", command=b.forget)
b.pack()
b['command'] = b.forget
root.mainloop()
ウィジェットが関数の一部であり、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つの関数がクラスにあり、もう1つはクラスにないのでglobal label
、上記の行が本当に必要かどうかはわかりません。