如何使用按钮 return 到我的 GUI 加载的主页,

How do I return to the main page that my GUI loads to using a button,

我是 python/tkinter 的新手,我创建了一个 GUI,该应用程序 (GUI) 是一个啤酒应用程序,它会向您显示啤酒类型的描述,如果您不能决定喝什么,它还会有一个随机的啤酒选择器。我的问题是当我 运行 应用程序时,它会打开到主屏幕(当 GUI 打开时您首先看到的是),在屏幕顶部有 11 个按钮,中间有一个框架显示“欢迎使用应用程序”的屏幕每个按钮都按我想要的方式工作(按下其中一个按钮时,屏幕中间的框架消失,新框架显示我设置的文本和图片在它旁边)但是一旦我单击任何按钮并且主屏幕消失了,我就可以通过使用按钮并将其链接到使用 .lift() 但框架的 def 来返回主屏幕单击其他按钮之一的图片停留在屏幕上,我不知道如何让它们消失。我也无法让我的随机啤酒选择器显示在主屏幕以外的任何屏幕上,我尝试了很多不同的东西,但最后我把它放在了 from 上,因为它在其他任何地方都不起作用。

这是我的代码的简化版本:

'''

    import tkinter as tk
    from tkinter import *
import random
import PIL
from PIL import ImageTk, Image

HEIGHT = 700
WIDTH = 1200
BLUE = '#146F80'
GRAY = '#4A4A4A'

root = tk.Tk()
root.title("Welcome to the beer app!")


def beer(event):
    image = Image.open(r"C:\Users\john\Pictures\PNG\american pale ale.png")

    canvas2 = tk.Canvas(root, height=300, width=400, bg=BLUE, bd=0, highlightthickness=0, relief='ridge')
    photo = ImageTk.PhotoImage(image)
    item4 = canvas2.create_image(225, 210, image=photo)

    canvas2.place(relx=0.0, rely=0.25, relheight=0.6, relwidth=0.5)

    desc_frame = tk.Frame(root, bg=GRAY)
    desc_frame.place(relx=0.4, rely=0.2, relheight=0.7, relwidth=0.58)

    beer_desc = tk.Label(desc_frame, text="Beer description here", wraplength=680, justify=LEFT, font=('Gadugi', 18), bg=GRAY,
                         fg='white')
    beer_desc.pack()

    item4.pack()


def randbeer(event):
    beer_list = ["Stout", "Sour Beer", "American Brown Ale", "American Brown Ale", "Porter", "Indian Pale Ale",
                 "Wheat Beer", "Amber Ale", "English Pale Ale", "Pilsner", "Lager"]
    beer_item = random.choice(beer_list)
    updatedisplay(beer_item)


def updatedisplay(event):
    displayVariable.set(event)


def menu(event):
    button12.master.lift()


canvas = tk.Canvas(root, height=HEIGHT, width=WIDTH, bg=BLUE, highlightbackground=GRAY)
Canvas.pack(canvas)

welcome_frame = tk.Frame(root, bg=GRAY)
welcome_frame.place(relx=0.2, rely=0.3, relheight=0.5, relwidth=0.6)

button_frame = tk.Frame(root, bg=GRAY)
button_frame.place(relx=0.0, rely=0.0, relheight=0.1, relwidth=1.0)

random_beer_frame = tk.Frame(welcome_frame, bg="gray")
random_beer_frame.place(relx=0.43, rely=0.75, relheight=0.097, relwidth=0.35)

button = tk.Button(button_frame, text="American Pale Ale")
button.config(bg="#5C665B", fg="black", font=("AR JULIAN", 9))
button.bind("<Button-1>", beer)
button.place(relx=0.005, rely=0.2, relheight=0.5, relwidth=0.1)

button12 = tk.Button(welcome_frame, text="Random beer")
button12.config(bg="#5C665B", fg="black", font=("AR JULIAN", 12))
button12.bind("<Button-1>", randbeer)
button12.place(relx=0.25, rely=0.75, relheight=0.1, relwidth=0.15)
displayVariable = StringVar()
displayLabel = Label(random_beer_frame, textvariable=displayVariable, bg="gray", font=("AR JULIAN", 18))
displayLabel.pack()

button13 = tk.Button(button_frame, text="Main Menu")
button13.config(bg="#5C665B", fg="black", font=("AR JULIAN", 9))
button13.bind("<Button-1>", menu)
button13.place(relx=0.918, rely=0.2, relheight=0.5, relwidth=0.06)

welcome_text = "\nWelcome to the beer app!"

welcome_text = tk.Label(welcome_frame, text=welcome_text, font=("Gadui", 24), bg=GRAY, fg="white")
welcome_text.pack()

root.mainloop()

'''

这很简单。先把beer()global里面的主要展示元素都制作出来,方便大家在其他地方参考。

def beer(event):
    image = Image.open(r"C:\Users\john\Pictures\PNG\american pale ale.png")

    global canvas2
    canvas2 = tk.Canvas(root, height=300, width=400, bg=BLUE, bd=0, highlightthickness=0, relief='ridge')
    photo = ImageTk.PhotoImage(image)
    
    item4 = canvas2.create_image(225, 210, image=photo)
    
    canvas2.place(relx=0.0, rely=0.25, relheight=0.6, relwidth=0.5)

    global desc_frame
    desc_frame = tk.Frame(root, bg=GRAY)
    desc_frame.place(relx=0.4, rely=0.2, relheight=0.7, relwidth=0.58)

    global beer_desc
    beer_desc = tk.Label(desc_frame, text="Beer description here", wraplength=680, justify=LEFT, font=('Gadugi', 18), bg=GRAY,
                         fg='white')
    beer_desc.pack()

    item4.pack()

然后 GRIDMANAGER_forget() 他们在 menu().

def menu(event):
    beer_desc.pack_forget()
    canvas2.pack_forget()
    desc_frame.place_forget()
    button12.master.lift()

这将解决您眼前的问题,但老实说,您设计此应用程序的方式非常糟糕。您是通过 Buttonsmaster 和其他类似的令人困惑的事情来指代主要元素。我强烈建议考虑采用更加模块化的方法。做一个Frame。将其视为一个页面。将该页面的所有内容都放在该框架中。给框架起一个有意义的名字。对所有“页面”重复此操作。一旦你这样做了,你就可以很容易地让按钮 hide/show 整个框架(页面)。想象一下,如果每本书只有一页长,为了阅读下一页,您必须先擦除当前页面并从头开始完全重写下一页。这就是你正在做的。只需构建所有页面并Buttons“翻转”到已经完成的所需页面,作为一个整体


我重构了你的整个应用程序作为我之前声明的一个例子。它仍然并不令人惊奇,但它比你现在拥有的要好得多。

import tkinter as tk, random
from PIL import ImageTk, Image

HEIGHT = 700
WIDTH = 1200
BLUE = '#146F80'
GRAY = '#4A4A4A'

root = tk.Tk()
root.title("Welcome to the beer app!")
root.geometry(f'{WIDTH}x{HEIGHT}+300+150')

#make the menu occupy all available width
root.grid_columnconfigure(0, weight=1)

#make the main display container occupy all available height
root.grid_rowconfigure(1, weight=1)

def change_page(name):
    global pages, current
    if current:
       current.place_forget()
       
    current = pages[name][0]
    current.place(**pages[name][1])
   
def menu():
    bar = tk.Frame(root, bg=GRAY)
    bar.grid(sticky='we')
    bar.grid_columnconfigure(0, weight=1)
    
    opts = dict(bg="#5C665B", fg="black", font=("AR JULIAN", 9), activebackground="#5C665B")
    pads = dict(padx=16, pady=16, ipadx=6, ipady=6)
    
    apa_btn = tk.Button(bar, text="American Pale Ale", **opts)
    apa_btn.bind("<Button-1>", lambda e:change_page('description'))
    apa_btn.grid(sticky='w', **pads)
    
    menu_btn = tk.Button(bar, text="Main Menu", **opts)
    menu_btn.bind("<Button-1>", lambda e:change_page('main'))
    menu_btn.grid(row=0, column=1, sticky='e', **pads)
    
def main(master):
    main_frame = tk.Frame(master, bg=GRAY)
    
    welcome_msg = "\nWelcome to the beer app!"
    welcome_lbl = tk.Label(main_frame, text=welcome_msg, font=("Gadui", 24), bg=GRAY, fg="white")
    welcome_lbl.pack()
    
    random_beer_frame = tk.Frame(main_frame, bg="gray")
    random_beer_frame.place(relx=0.43, rely=0.75, relheight=0.097, relwidth=0.35)

    def randbeer(event):
        beerlist = ["Stout", "Sour Beer", "American Brown Ale", "American Brown Ale", "Porter", "Indian Pale Ale",
                    "Wheat Beer", "Amber Ale", "English Pale Ale", "Pilsner", "Lager"]
        random_beer_lbl['text'] = random.choice(beerlist)
                     
    random_btn = tk.Button(main_frame, text="Random beer")
    random_btn.config(bg="#5C665B", fg="black", font=("AR JULIAN", 12))
    random_btn.bind("<Button-1>", randbeer)
    random_btn.place(relx=0.25, rely=0.75, relheight=0.1, relwidth=0.15)
    
    random_beer_lbl = tk.Label(random_beer_frame, bg="gray", font=("AR JULIAN", 18))
    random_beer_lbl.pack()
    
    return main_frame
    
def description(master):
    global images
    main_frame = tk.Frame(master, bg=BLUE)
    
    #I don't have your image so this was commented out for testing
    #image = Image.open(r"C:\Users\john\Pictures\PNG\american pale ale.png")
    #images['apa'] = ImageTk.PhotoImage(image, name='apa')
    #tk.Label(main_frame, image='apa', bg=BLUE).place(relx=0.0, rely=0.25, relheight=0.6, relwidth=0.5)
    
    desc_frame = tk.Frame(main_frame, bg=GRAY)
    desc_frame.place(relx=0.4, rely=0.2, relheight=0.7, relwidth=0.58)

    beer_desc_lbl = tk.Label(desc_frame, text="Beer description here", wraplength=680, justify=tk.LEFT, font=('Gadugi', 18), bg=GRAY,fg='white')
    beer_desc_lbl.pack()
    
    return main_frame

#init menu
menu()  

#this serves as the master for all content
display = tk.Frame(root, bg=BLUE)
display.grid(sticky='nswe')  

#used to keep image references alive
images = dict()

#a reference to every page and it's placement
pages = dict(
    main        = (main(display), dict(relx=0.2, rely=0.3, relheight=0.5, relwidth=0.6)),
    description = (description(display), dict(x=0, y=0, relheight=1, relwidth=1))
)

#a reference to the current page
current = None

#init main page
change_page('main')

root.mainloop()