当新窗口打开时,我想关闭上一个窗口,因此始终只有 1 个窗口处于活动状态

问题描述 投票:0回答:1

我正在开发一个工作项目,虽然我在学校学过这个,但我对编程仍然相当陌生。

我在定义中有不同的窗口,当我单击“下一步”按钮时,它们的下一个定义将打开下一个窗口。但是,我不知道如何让新窗口打开后自动关闭前一个窗口。

有部分代码,当我按下按钮“91ERP00500CAA”时,下一个窗口“def caa1”打开,但是第一个窗口不会关闭。

class Window:
    def __init__(self, master):
        self.master = root
        root.title("Housing specification")
        master.geometry("1900x1080") #set the size of the screen
        
        #Frame
        self.frame = tk.Frame(self.master, width = 200, height = 200)
        self.frame.pack()
        
        #Label , welcome to spec
        self.label = tk.Label(self.frame, text = "Housing specification")
        self.label.place(x = 10, y = 10)
        
        self.buttoncaa = tk.Button(self.frame, text = "91ERP00500CAA", command = self.caa1)
        self.buttoncaa.place(x = 30, y = 80)
        
        def quit_win():
            win.quit()
   
        
        
       
    #Reference test for CAA specification
    def caa1(self):
        top = Toplevel()
        top.title("91ERP00500CAA - REFERENCE TEST")
        top.geometry("1900x1080")
        reference = PhotoImage(file = r"C:\Users\rnorris\Desktop\3.10.PNG")
        ref = Label(top, image = reference)
        ref.pack()
        
        
        
        self.ns1 = tk.Button(top, text="Next step", command = self.caa2)
        self.ns1.pack()
        
        self.permit1 = tk.Button(top, text="Permits", command = self.permitref)
        self.permit1.pack()
        mainloop()

我尝试过使用

root.destroy()
,但没有运气。

python-3.x tkinter spyder
1个回答
0
投票

假设你用类似

的东西初始化
Window

root = tk.Tk()
Window(root)
root.mainloop()

您需要将

__init__
更改为

def __init__(self, master):
        self.master = master
        self.master.title("Housing specification")
        self.master.geometry("1900x1080") #set the size of the screen

因为目前它使用了

root
master
self.master
的混合,而它应该只使用
self.master

要在按下按钮时销毁窗口,请将

caa1
更改为

def caa1(self):
    self.master.destroy()
    top = tk.Tk()
    top.title("91ERP00500CAA - REFERENCE TEST")
    top.geometry("1900x1080")
    self.reference = tk.PhotoImage(file = r"C:\Users\rnorris\Desktop\3.10.PNG")
    ref = tk.Label(top, image = self.reference)
    ref.pack()

这将销毁第一个窗口并创建一个新窗口。我已将

Toplevel
更改为
Tk
,因为否则当原始窗口被销毁时会创建一个额外的空窗口。一次应该只有一个
Tk
实例,但您在创建下一个实例之前会销毁前一个实例,因此这不是问题。

另请注意,由于

reference
caa1
的本地对象,因此它将被垃圾收集。我已将其更改为
self.reference
,这样它就不会被垃圾收集,并且图像将会显示。

虽然上面的方法应该有效,但请考虑使用单个窗口,该窗口对

Tk
进行子类化并更改框架,例如

import tkinter as tk

class Window(tk.Tk):
    def __init__(self):
        tk.Tk.__init__(self)
        self.title("Housing specification")
        self.geometry("1900x1080") #set the size of the screen

        self.frame_1 = tk.Frame(self, width = 200, height = 200)
        self.frame_1.pack()

        #Label , welcome to spec
        self.label = tk.Label(self.frame_1, text = "Housing specification")
        self.label.place(x = 10, y = 10)
        
        self.buttoncaa = tk.Button(self.frame_1, text = "91ERP00500CAA", command = self.caa1)
        self.buttoncaa.place(x = 30, y = 80)

    def caa1(self):
        self.frame_1.pack_forget()
        self.title("91ERP00500CAA - REFERENCE TEST")
        self.reference = tk.PhotoImage(file = r"C:\Users\rnorris\Desktop\3.10.PNG")
        self.frame_2 = tk.Frame(self)
        self.frame_2.pack()
        self.ref = tk.Label(self.frame_2, image = self.reference)
        self.ref.pack()

app = Window()
app.mainloop()

这更容易扩展并且更好用。

© www.soinside.com 2019 - 2024. All rights reserved.