Remove/Forget 切换按钮中的按钮

Remove/Forget Buttons in a Toggle Button

在我的 GUI 应用程序中,我有一个 Show/Hide 切换按钮。默认情况下,按钮文本为 "Show"。单击该按钮时,会从预定义列表中创建多个后续按钮,并且按钮文本会更改为 "Hide".

当用户单击 "Hide" 我希望 hide/remove 已创建的按钮。我想我需要在 else 条件下使用 grid_forget() 函数,但怎么会这样呢?

感谢阅读。

# Toggles between Show/Hide and creates buttons
def toggle_text():
    if btn['text'] == 'Show':
        btn['text']  = 'Hide'
        for i, item in enumerate(some_list):
            btn = Button(root, text='%s' % item)
            btn.grid(row=6+i, column=0, sticky=W)
    else:
        btn['text'] = 'Hide'

# Show/Hide button
btn = Button(root, text='Show', command=toggle_text)
btn.grid(row=5, column=0, sticky=W)

您必须创建列表来保留按钮,然后您可以使用 grid()grid_forget()

import tkinter as tk

# --- functions ---

def toggle_text():
    global buttons # inform function to use external/global variable

    if btn['text'] == 'Show':
        btn['text']  = 'Hide'

        for i, item in enumerate(some_list, 6):
            # don't use name `btn` because you overwrite external `btn`
            b = tk.Button(root, text=item)
            b.grid(row=i, column=0, sticky='we')
            buttons.append(b)
    else:
        btn['text'] = 'Show'

        for b in buttons:
            #b.grid_forget()
            # better `destroy` because you will create new buttons 
            # so you can free memory 
            b.destroy() 

        # remove all buttons from list
        #buttons.clear() # only Python 3 (doesn't need `global buttons`)
        #buttons[:] = [] # Python 2 and 3 (doesn't need `global buttons`)
        buttons = [] # Python 2 and 3 but needs `global buttons`

# --- main ---

some_list = ['A', 'B', 'C']
buttons = [] # create global variable

root = tk.Tk()

btn = tk.Button(root, text='Show', command=toggle_text)
btn.grid(row=5, column=0, sticky='w')

root.mainloop()

如果您总是有相同的按钮,那么您可以创建它们一次。

import tkinter as tk

# --- functions ---

def toggle_text():

    if btn['text'] == 'Show':
        btn['text']  = 'Hide'

        for i, b in enumerate(buttons, 6):
            b.grid(row=i, column=0, sticky='we')

    else:
        btn['text'] = 'Show'

        for b in buttons:
            b.grid_forget()

# --- main ---

root = tk.Tk()

some_list = ['A', 'B', 'C']

buttons = [] # create global variable
for item in some_list:
    b = tk.Button(root, text=item)
    buttons.append(b)

btn = tk.Button(root, text='Show', command=toggle_text)
btn.grid(row=5, column=0, sticky='w')

root.mainloop()

或者你可以使用Frame来分组Buttons

import tkinter as tk

# --- functions ---

def toggle_text():

    if btn['text'] == 'Show':
        btn['text']  = 'Hide'
        frame.grid(row=6, column=0, sticky='we')
    else:
        btn['text'] = 'Show'
        frame.grid_forget()

# --- main ---

root = tk.Tk()

some_list = ['A', 'B', 'C']

frame = tk.Frame(root)
frame.columnconfigure(0, weight=1) # resise column

for i, item in enumerate(some_list):
    b = tk.Button(frame, text=item)
    b.grid(row=i, column=0, sticky='we')

btn = tk.Button(root, text='Show', command=toggle_text)
btn.grid(row=5, column=0, sticky='w')

root.mainloop()