61

tkinter動的に変更したいウィジェットのリストがあります。

ウィンドウからウィジェットを削除するにはどうすればよいですか?

4

8 に答える 8

102

ウィジェットを呼び出し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

于 2012-09-11T07:49:10.860 に答える
24

それを行う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()

于 2017-07-06T17:28:31.863 に答える
5

destroy()このメソッドを使用して、次のように指定されたウィジェットを削除するだけです。

lbl = tk.Label(....)

btn = tk.Button(....., command=lambda: lbl.destroy())

これを使用すると、特定のウィジェットを完全に破棄できます。

于 2020-01-05T17:18:47.090 に答える
1

動的に変更するウィジェットのリストがあると言います。既存のウィジェットを再利用して再構成しますか、それともすべての新しいウィジェットを作成して古いウィジェットを削除しますか?それは答えに影響します。

既存のウィジェットを再利用する場合は、ウィジェットを再構成するだけです。または、それらの一部を一時的に非表示にする場合は、対応する「forget」メソッドを使用して非表示にします。それらをpack()呼び出しでマップした場合、呼び出しでpack_forget()(または単にforget())非表示になります。したがって、grid_forget()グリッド化されたウィジェットを非表示にしplace_forget()、配置されたウィジェットを非表示にします。

ウィジェットを再利用する予定がない場合はdestroy()、のように直接呼び出すことでウィジェットを破棄して、widget.destroy()リソースを解放できます。

于 2020-02-27T01:21:30.197 に答える
0

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.
于 2020-06-24T10:53:35.553 に答える
-1

今日、私は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()

それが誰かを助けることを願っています...

于 2017-10-26T16:08:37.780 に答える
-1

ウィジェットでforgetメソッドを使用できます

from tkinter import *

root = Tk()

b = Button(root, text="Delete me", command=b.forget)
b.pack()

b['command'] = b.forget

root.mainloop()
于 2018-05-22T11:24:27.237 に答える
-2

ウィジェットが関数の一部であり、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、上記の行が本当に必要かどうかはわかりません。

于 2013-06-06T11:37:27.430 に答える