Python tkinter удалить все виджеты

Как удалить виджеты Tkinter из окна?

У меня есть список виджетов Tkinter, которые я хочу динамически менять.

Как я могу полностью удалить виджеты из моего окна?

5 ответов

Ты можешь позвонить 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 скрыть виджет

Один из способов сделать это — получить список рабов из кадра, который необходимо очистить, и уничтожить или «спрятать» их в соответствии с вашими потребностями. Чтобы получить четкую рамку, вы можете сделать это так:

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()) 

Используя это, вы можете полностью уничтожить определенные виджеты.

Вы говорите, что у вас есть список виджетов, которые нужно динамически изменять. Вы хотите повторно использовать и перенастроить существующие виджеты или создать все новые виджеты и удалить старые? Это влияет на ответ.

Если вы хотите повторно использовать существующие виджеты, просто перенастройте их. Или, если вы просто хотите временно скрыть некоторые из них, используйте соответствующий метод «забыть», чтобы скрыть их. Если вы сопоставили их с 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. 

Я обнаружил, что когда виджет является частью функции и 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() 

Когда я столкнулся с этой проблемой, был задействован класс, одна функция была в классе, а другая — нет, поэтому я не уверен, что global label линии действительно необходимы в вышеупомянутом.

Вы можете использовать метод забудьте на виджете

из ткинтера импорт * root = Tk () b = кнопка (root, text="Удалить меня", command = b.forget) b.pack () root.mainloop ()

Сегодня я изучаю простую и удобную обработку событий кликов с помощью библиотеки tkinter gui в python3, которой я хотел бы поделиться в этой теме.

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)) == "": # 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("", MsgClick) msg.bind("", 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("", ButtonClick) button.bind("", ButtonDoubleClick) root.mainloop() 

Надеюсь, это поможет кому-то.

Источник

Как скрыть, восстановить и удалить Tkinter виджеты

Как скрыть, восстановить и удалить Tkinter виджеты

  1. Скрыть и восстановить виджеты Tkinter
  2. Удалить тикинтерные виджеты Нажмите кнопку

В данном уроке мы продемонстрируем, как скрыть, восстановить и удалить Tkinter виджеты, нажав на кнопку. В конце мы также покажем, как удалить или убить существующие Tkinter-виджеты.

Скрыть и восстановить виджеты Tkinter

pack_forget() метод для сокрытия виджетов Tkinter Widgets

В отличие от метода pack в виджетах Tkinter, мы могли скрыть виджеты Tkinter, вызвав метод pack_forget() для того, чтобы сделать виджеты невидимыми.

try:  import Tkinter as tk except:  import tkinter as tk  class Test():  def __init__(self):  self.root = tk.Tk()  self.label=tk.Label(self.root,  text = "Label")  self.buttonForget = tk.Button(self.root,  text = 'Click to hide Label',  command=lambda: self.label.pack_forget())  self.buttonRecover = tk.Button(self.root,  text = 'Click to show Label',  command=lambda: self.label.pack())   self.buttonForget.pack()  self.buttonRecover.pack()  self.label.pack(side="bottom")  self.root.mainloop()   def quit(self):  self.root.destroy()  app = Test() 
self.buttonForget = tk.Button(self.root,  text = 'Click to hide Label',  command=lambda: self.label.pack_forget()) 

pack_forget() привязывается к команде кнопки buttonForget .

После нажатия кнопки виджет метки будет скрыт, но сама метка все еще существует, но становится невидимой.

Нам нужно снова вызвать метод pack() для упаковки виджета, чтобы сделать его видимым, или другими словами, для его восстановления.

grid_forget() Метод скрытия виджетов, если используется макет grid

Если виджеты размещаются в менеджере компоновки grid , то следует использовать метод grid_forget() для того, чтобы сделать виджеты Tkinter невидимыми.

try:  import Tkinter as tk except:  import tkinter as tk  class Test():  def __init__(self):  self.root = tk.Tk()  self.label=tk.Label(self.root,  text = "Label")  self.buttonForget = tk.Button(self.root,  text = 'Click to hide Label',  command=lambda: self.label.grid_forget())  self.buttonRecover = tk.Button(self.root,  text = 'Click to show Label',  command=lambda: self.label.grid())   self.buttonForget.grid(column=0, row=0, padx=10, pady=10)  self.buttonRecover.grid(column=0, row=1, padx=10, pady=10)  self.label.grid(column=0, row=2, padx=10, pady=10)  self.root.mainloop()   def quit(self):  self.root.destroy()  app = Test() 
self.buttonForget = tk.Button(self.root,  text = 'Click to hide Label',  command=lambda: self.label.grid_forget()) 

Здесь мы связываем метод grid_forget с командой кнопки.

Вы можете заметить, что позиция метки не совпадает до того, как она будет скрыта после повторного вызова метода grid .

Если мы хотим восстановить исходную позицию метки, то метод grid_remove будет правильным вариантом.

grid_remove() Метод скрытия виджетов цинтера, если используется grid макет

grid_remove() скрывает виджет, но запоминает опции сетки, такие как колонка и ряд .

try:  import Tkinter as tk except:  import tkinter as tk  class Test():  def __init__(self):  self.root = tk.Tk()  self.label=tk.Label(self.root,  text = "Label")  self.buttonForget = tk.Button(self.root,  text = 'Click to hide Label',  command=lambda: self.label.grid_remove())  self.buttonRecover = tk.Button(self.root,  text = 'Click to show Label',  command=lambda: self.label.grid())   self.buttonForget.grid(column=0, row=0, padx=10, pady=10)  self.buttonRecover.grid(column=0, row=1, padx=10, pady=10)  self.label.grid(column=0, row=2, padx=10, pady=20)  self.root.mainloop()   def quit(self):  self.root.destroy()  app = Test() 

Удалить тикинтерные виджеты Нажмите кнопку

В этом разделе мы покажем, как навсегда удалить виджеты Tkinter, вызвав метод destroy .

try:  import Tkinter as tk except:  import tkinter as tk  class Test():  def __init__(self):  self.root = tk.Tk()  self.label=tk.Label(self.root,  text = "Label")  self.buttonForget = tk.Button(self.root,  text = 'Click to hide Label',  command=lambda: self.label.destroy())  self.buttonRecover = tk.Button(self.root,  text = 'Click to show Label',  command=lambda: self.label.pack())   self.buttonForget.pack()  self.buttonRecover.pack()  self.label.pack(side="bottom")  self.root.mainloop()   def quit(self):  self.root.destroy()  app = Test() 

Кнопка удаляется после нажатия на нее.

Вы можете попробовать нажать кнопку buttonRecover , но получите уведомление об ошибке _tkinter.TclError , как показано ниже,

Exception in Tkinter callback Traceback (most recent call last):  File "D:\WinPython\WPy-3661\python-3.6.6.amd64\lib\tkinter\__init__.py", line 1702, in __call__  return self.func(*args)  File "C:\Users\jinku\OneDrive\Bureaublad\test.py", line 17, in lambda>  command=lambda: self.label.pack())  File "D:\WinPython\WPy-3661\python-3.6.6.amd64\lib\tkinter\__init__.py", line 2140, in pack_configure  + self._options(cnf, kw)) _tkinter.TclError: bad window path name ".!label" 

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

Сопутствующая статья — Tkinter Label

Источник

Deleting widgets with Tkinter destroy()

The Tkinter destroy method has the ability to “destroy” any Tkinter GUI objects. This includes widgets like Entry, Button, Toplevel and even the entire Tkinter application.

The syntax is very simple. You simply have to call it as a method on any Tkinter object as shown below.

root.destroy() # Destroys the whole Tkinter application mylabel.destroy() # Destroys a label toplevel.destroy() # Destroys a window

The Destroy Function

When used on root the destroy function will cause Tkinter to exit the mainloop() and simultaneously destroy all the widgets within the mainloop() .

from tkinter import * def close(): root.destroy() root = Tk() root.geometry('200x100') button = Button(root, text = 'Close the window', command = close) button.pack(pady = 10) root.mainloop()

The window produced by the above code. Clicking the button will destroy the window, causing it to disappear.

Tkinter destroy widget

The code below is used simply to destroy a single individual widget.

from tkinter import * def delete(): mylabel.destroy() root = Tk() root.geometry('150x100') mylabel = Label(root, text = "This is some random text") mylabel.pack(pady = 5) mybutton = Button(root, text = "Delete", command = delete) mybutton.pack(pady = 5) root.mainloop()

Below is short 3 second video demonstrating the effect of the above code.

This marks the end of the Tkinter destroy widget article. Any suggestions or contributions for CodersLegacy are more than welcome. Questions regarding the article content can be asked in the comments section below.

Источник

Читайте также:  Оператор свитч си шарп
Оцените статью