如何使用按钮 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()
这将解决您眼前的问题,但老实说,您设计此应用程序的方式非常糟糕。您是通过 Buttons
的 master
和其他类似的令人困惑的事情来指代主要元素。我强烈建议考虑采用更加模块化的方法。做一个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()
我是 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()
这将解决您眼前的问题,但老实说,您设计此应用程序的方式非常糟糕。您是通过 Buttons
的 master
和其他类似的令人困惑的事情来指代主要元素。我强烈建议考虑采用更加模块化的方法。做一个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()