как удалить виджеты без глобальной переменной при использовании функции

#python #tkinter

Вопрос:

У меня есть пара виджетов, которые появляются при первом запуске моего кода, но когда я нажимаю кнопку, все это исчезает, и появляются другие виджеты. У меня также есть кнопка «Назад», которая затем извлекает удаленные виджеты и удаляет второй набор виджетов. Моя проблема в том, что я использую глобальную переменную для удаления виджетов, и я хочу знать, как лучше подойти к этому без использования глобальных переменных? Я также получаю слабые предупреждения о том, что глобальные переменные не определены на модульном уровне.

 from tkinter import *  # allows for the use of tkinter GUI

win = Tk()  # creates the tkinter window
win.geometry("1270x725 0 0")


def something_happens(e1, e2, e3):
    print('something is supposed to happen when an option is pressed but that's not important')


def category_option_menu():
    global category_drop_down_menu
    global category_variable
    category_names = ['all', 'electrical', 'mechanical', 'optics']  # sets the names of the different categories that
    # will sort the items so only those items show up
    category_variable = StringVar(win)
    category_variable.set(category_names[0])

    category_drop_down_menu = OptionMenu(win, category_variable, *category_names)  # creates the option menu for the
    # different categories
    category_drop_down_menu.config(width=10, font=('Arial', 20), highlightthickness=0)  # sets the parameters
    category_drop_down_menu.place(relx=.45, rely=.3)  # moves the option_menu to its location
    category_variable.trace('w', something_happens)  # if any option in the option menu is pressed, the CategoryChanged
    # function will run


def destroy_widget():
    category_drop_down_menu.place(relx=2)


button = Button(win, text='this is suppose to get rid of the option menu widget', font=('Arial', 20),
                command=destroy_widget)
button.place(relx=.2, rely=.5)


category_option_menu()


win.mainloop()
 

Комментарии:

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

2. В принципе win , это тоже глобально, можете ли вы избежать этого в этом процедурном подходе? Если вы хотите избавиться от глобальных переменных, используйте OOP. И технически вы не уничтожаете никакие виджеты, вы просто «прячете» их