Python, Tkinter, как дать опциону свои окна при нажатии - PullRequest
0 голосов
/ 04 мая 2018

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

def change_dropdown(*args):
    top = Toplevel()
    top.title("READ")
    toplabel = Label(top,text= "Lmao", font = ("Helvetica", 13))
    toplabel.grid()
    button = Button(top, text="Dismiss", relief=FLAT, font = ("Helvetica", 10, "bold"), fg = "ghostwhite", bg = "black", width = "30", height = "2", command=top.destroy)
    button.grid()
    top.focus()


def popmenu():
    global tkvar
    tkvar = StringVar(master)

    choices = {"About","Colour themes", "Contact",}
    popupMenu = OptionMenu(master, tkvar, *choices)
    popupMenu.grid(row = 0, column = 0, columnspan = 5, sticky=W+E+S+N)
    tkvar.set("About") 
    tkvar.trace("w", change_dropdown)

1 Ответ

0 голосов
/ 04 мая 2018

Насколько я понимаю, вы хотите что-то вроде этого ...

def change_dropdown(*args):
    if tkvar.get() == "About":
        # open About window
    elif tkvar.get() == "Contact":
        # open Contact window
        ...., etc

Полный пример

Каждое окно Toplevel - это окно, похожее на корневое окно, и вы помещаете в него виджеты, как в master.

Я немного изменил код, чтобы сделать его более читабельным с моей точки зрения; Я поднял главное окно (мастер) код из функции. Я поместил спецификации шрифта в начале, чтобы сделать код Labels и Buttons более коротким. Я изменил выбор Dict на Tuple, который кажется более естественным. Я дал OptionMenu ширину, чтобы он не менял размер при выбранном выделении.

from tkinter import *

master = Tk()
master.geometry('300x150+1000+50')
info = Label(master, text='Press "p" for popup menu')
info.pack()


# Fonts
H13 = ("Helvetica", 13)
H10B = ("Helvetica", 10, "bold")

def change_dropdown(*args):
    top = Toplevel()
    if tkvar.get() == "About":      # About window
        top.title("About")
        toplabel = Label(top,text= "The About window", font = H13)
        toplabel.grid()
        button = Button(top, text="Dismiss", relief=FLAT, font = H10B,
                        fg = "ghostwhite", bg = "black", width = "30",
                        height = "2", command=top.destroy)
        button.grid()
        top.focus()

    elif tkvar.get() == "Contact":      # Contact window
        top.title("Contact")
        toplabel = Label(top,text= "Contact form", font = H13)
        toplabel.grid()
        button = Button(top, text="Dismiss", relief=FLAT, font = H10B,
                        fg = "ghostwhite", bg = "black", width = "30",
                        height = "2", command=top.destroy)
        button.grid()
        top.focus()

    elif tkvar.get() == "Colour themes":    # Color themes window
        top.title("Colour themes")
        toplabel = Label(top,text= "Choose color theme", font = H13)
        toplabel.grid()
        button = Button(top, text="Dismiss", relief=FLAT, font = H10B,
                        fg = "ghostwhite", bg = "black", width = "30",
                        height = "2", command=top.destroy)
        button.grid()
        top.focus()

tkvar = StringVar(master)

def popmenu(event):
    top = Toplevel()
    choices = ("About","Colour themes", "Contact")  # Tuple or List instead of dict
    popupMenu = OptionMenu(top, tkvar, *choices)
    popupMenu.config(width=15)     # Otherwise width varies with option
    popupMenu.grid(row = 0, column = 0, columnspan = 5, sticky=W+E+S+N)
    tkvar.set("Pick one") 
    tkvar.trace("w", change_dropdown)

master.bind('p', popmenu)
master.mainloop()

Это очень простой интерфейс, но если вы планируете сделать его более сложным, я настоятельно рекомендую вам прочитать об объектно-ориентированном Python. Отслеживать глобалы становится довольно быстро.

...