在下面的代碼中,我通過每次按下特定按鈕時打開定義的視窗來制作簡單的路線引導,例如)主選單 -> 教室樓層 -> 教室編號。
我正在嘗試制作一個“主頁”按鈕,該按鈕將關閉所有打開的視窗,除了寫有 WELCOME 的第一個主選單視窗。
比如我按btn7、btn702之后,就開了4個視窗。我想添加一個“主頁”按鈕,該按鈕將關閉 3 個新打開的視窗并使第一個視窗保持活動狀態。我怎樣才能制作這種按鈕?
from os import system
from tkinter import *
from PIL import ImageTk, Image
mainmenu = Tk()
mainmenu.title("CAU 310 GUIDE MAP")
mainmenu.geometry("1280x800 0 0")
canvas = Canvas(mainmenu, width = 1280, height = 800)
canvas.pack(fill='both', expand = True)
canvas.create_text(640, 250, text = 'WELCOME', font=times 45)
btnclassroom = Button(mainmenu, padx=5, pady=5,text="Classroom", font="times 30", command=selectfloor)
btnclassroom.place(x=140, y=570)
def selectfloor():
mainmenu = Tk()
mainmenu.title("DESTINATION")
mainmenu.geometry("1280x800 0 0")
mainmenu.config(bg='white')
canvas = Canvas(mainmenu, width = 1280, height = 800)
canvas.pack(fill='both', expand = True)
canvas.create_text(640, 150, text = 'Select floor of classroom', font='Arial 40')
btn7=Button(mainmenu, padx=4, pady=4, text="7F", font="Arial 42 bold", command=floor7)
btn7.place(x=160-5, y=490)
def floor7():
mainmenu = Tk()
mainmenu.title("FLOOR 7")
mainmenu.geometry("1280x800 0 0")
canvas = Canvas(mainmenu, width = 1280, height = 800)
canvas.pack(fill='both', expand = True)
canvas.create_text(640, 150, text = 'Select classroom No.', font='Arial 40')
btn702=Button(mainmenu, padx=3, pady=3, text="No.702", font="Arial 38 bold", command=room702)
btn702.place(x=100 220*1, y=240)
mainmenu.mainloop()
def room702():
mainmenu = Tk()
mainmenu.title("Elevator 1")
mainmenu.geometry("1280x800 0 0")
lobby = ImageTk.PhotoImage(Image.open("1F_elevator1.jpg"), master=mainmenu)
canvas = Canvas(mainmenu, width = 1280, height = 800)
canvas.pack(fill='both', expand = True)
canvas.create_image(0, 0, image=lobby,anchor = "nw")
mainmenu.mainloop()
mainmenu.mainloop()
**我一直在搜索這類問題,我想我已經有了將“selectfloor”、“floor7”、“room702”視窗作為兒童小部件的提示。但我仍然不確定如何實作它。
uj5u.com熱心網友回復:
您可以將視窗存盤在串列中,然后遍歷串列以銷毀它們。
這是一個簡化的示例。此示例使用Toplevelwindows 而不是Tk. 不清楚為什么要使用 的多個實體Tk,但一般來說,您應該只擁有一個。然而,這種相同的技術適用于任何型別的小部件。
import tkinter as tk
windows = []
def delete_all_but_first():
for window in windows[1:]:
window.destroy()
def new_window():
window = tk.Toplevel(root)
windows.append(window)
window.title(f"Window #{len(windows)}")
root = tk.Tk()
windows.append(root)
del_all = tk.Button(root, text="Delete all", command=delete_all_but_first)
new = tk.Button(root, text="New window", command=new_window)
new.pack(side="top", padx=20, pady=20)
del_all.pack(side="top", padx=20, pady=20)
root.mainloop()
如果使用Toplevel而不是Tk,并且始終使視窗直接成為根視窗的子視窗,則可以進行優化。在這種情況下,您可以遍歷 root 的所有子級,并洗掉任何頂級視窗。
在這種情況下,您不需要維護windows串列。
def delete_toplevels():
for child in root.winfo_children():
if child.winfo_class() == "Toplevel":
child.destroy()
def new_window():
window = tk.Toplevel(root)
window.title(f"Window #{len(windows)}")
...
del_all = tk.Button(root, text="Delete all", command=delete_toplevels)
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/312912.html
上一篇:在Figma上顯示實時圖表
