Выполнение команды из OptionMenu

Есть ли способ заставить меню опций выполнять команды из ряда различных команд?

from tkinter import *
#creates 2 windows
root = Tk()
popup = Toplevel()

#places frame in popup window
popup_frame = Frame(popup)
popup_frame.pack()

#4 functions, text is just placeholder for idea
def popup1(popup):
    popup_frame.destroy()
    popup_frame = Frame(popup)
    label_popup1 = Label(popup_frame, text="unique textfor popup1")
    popup_frame.pack()
    label_popup1.pack()

def popup2(popup):
    popup_frame.destroy()
    popup_frame = Frame(popup)
    label_popup2 = Label(popup_frame, text="unique text for popup2")
    popup_frame.pack()
    label_popup2.pack()

def popup3(popup):
    popup_frame.destroy()
    popup_frame = Frame(popup)
    label_popup3 = Label(popup_frame, text="unique text for popup3")
    popup_frame.pack()
    label_popup3.pack()

def popup1(popup):
    popup_frame.destroy()
    popup_frame = Frame(popup)
    label_popup4 = Label(popup_frame, text="unique text for popup4")
    popup_frame.pack()
    label_popup4.pack()

#2 option menus offering different selections
options1 = ["popup1", "popup2"]
variable1 = StringVar()
drop_title1 = StringVar(root)
#sets initial name for widget
drop_title1.set("Please Choose Options 1 Or 2")
dropdownmenu1 = OptionMenu(root, drop_title1, *options, command=lambda:func())
dropdownmenu1.place(x=10, y=10)

options2 = ["popup3", "popup4"]
variable2 = StringVar()
drop_title2 = StringVar(root)
drop_title2 .set("Please Choose Options 3 Or 4")
dropdownmenu2 = OptionMenu(root, drop_title2, *options, command=lambda:func())
dropdownmenu2.place(x=100, y=10)

root.mainloop()

Таким образом, есть корневой фрейм с двумя различными выпадающими меню, где, если вы нажмете, скажем, опцию 1, popup_frame будет удален и заменен содержимым опции 1, затем из второго выпадающего меню выбрана опция 4 и содержимое popup_frame изменить на какой вариант 4 содержит?

1 ответ

Решение

Функция определяется как command для OptionMenu будет выдано выбранное значение в качестве аргумента. Таким образом, вы можете определить функцию обратного вызова для проверки этого значения и вызова другой функции в зависимости от того, какое это значение:

from tkinter import *
#creates 2 windows
root = Tk()
popup = Toplevel()

#places frame in popup window
popup_frame = Frame(popup)
popup_frame.pack()

#4 functions, text is just placeholder for idea
def popup1():
    global popup_frame
    popup_frame.destroy()
    popup_frame = Frame(popup)
    label_popup1 = Label(popup_frame, text="unique text for popup1")
    popup_frame.pack()
    label_popup1.pack()

def popup2():
    global popup_frame
    popup_frame.destroy()
    popup_frame = Frame(popup)
    label_popup2 = Label(popup_frame, text="unique text for popup2")
    popup_frame.pack()
    label_popup2.pack()

def popup3():
    global popup_frame
    popup_frame.destroy()
    popup_frame = Frame(popup)
    label_popup3 = Label(popup_frame, text="unique text for popup3")
    popup_frame.pack()
    label_popup3.pack()

def popup4():
    global popup_frame
    popup_frame.destroy()
    popup_frame = Frame(popup)
    label_popup4 = Label(popup_frame, text="unique text for popup4")
    popup_frame.pack()
    label_popup4.pack()

def func(val):
    if val == "popup1":
        popup1()
    elif val == "popup2":
        popup2()
    elif val == "popup3":
        popup3()
    elif val == "popup4":
        popup4()

#2 option menus offering different selections
options1 = ["popup1", "popup2"]
variable1 = StringVar()
drop_title1 = StringVar(root)
#sets initial name for widget
drop_title1.set("Please Choose Options 1 Or 2")
dropdownmenu1 = OptionMenu(root, drop_title1, *options1, command=func)
dropdownmenu1.pack(side=LEFT)

options2 = ["popup3", "popup4"]
variable2 = StringVar()
drop_title2 = StringVar(root)
drop_title2 .set("Please Choose Options 3 Or 4")
dropdownmenu2 = OptionMenu(root, drop_title2, *options2, command=func)
dropdownmenu2.pack(side=LEFT)

root.mainloop()
Другие вопросы по тегам