#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. И технически вы не уничтожаете никакие виджеты, вы просто «прячете» их