Home > Software design >  (Python) Is there a way to clear all entry boxes in a Tkinter UI in one line?
(Python) Is there a way to clear all entry boxes in a Tkinter UI in one line?

Time:11-08

I have made a Tkinter UI for a fairly simple calculator that all works fine, and I have a clear button to clear all entry boxes. I'd rather have one line of code to clear all 40 boxes than 40 lines to clear each individually, and was wondering if there was a Tkinter command that could do the same as ent.delete(0, END) but for all entries?

CodePudding user response:

This should be sufficient:

[widget.delete(0, tk.END) for widget in root.winfo_children() if isinstance(widget, tk.Entry)]

It uses list comprehension to loop through all the children of root and does .delete() if the child is an Entry

Implementation:

import tkinter as tk


root = tk.Tk()
root.geometry("300x300")

def create_entries(root, amount):
    for _ in range(amount):
        tk.Entry(root).pack(pady=2)


def clear():
    [widget.delete(0, tk.END) for widget in root.winfo_children() if isinstance(widget, tk.Entry)]


create_entries(root, 5)

clear_btn = tk.Button(root, text="clear", padx=10, command=clear)
clear_btn.pack()

root.mainloop()

NOTE:
I should point out that this is probably not best practice but I dont really know.
It creates a list but doesnt assign it to anything so essentially it just does what you intended

EDIT:
Also consider the following if you want to clear every entry, even if it is inside a different widget. This is to be used only if you are sure that every single entry in the whole application should be cleared

def clear(root):
    for widget in root.winfo_children():
        if not isinstance(widget, tk.Entry):
            clear(widget)
        elif isinstance(widget, tk.Entry):
            widget.delete(0, tk.END)

Also note that, I used a normal for loop for this, because as noted in the comments, it is better

  • Related