简体   繁体   English

如何在 python Tkinter 中删除额外的 window?

[英]how to remove an extra window in python Tkinter?

M trying to create a desktop app but facing some problem while switching between frames using button. M 试图创建一个桌面应用程序,但在使用按钮在帧之间切换时遇到了一些问题。 Its working all fine but it gives me an extra blank window(consist nothing) when I run my project.它工作得很好,但是当我运行我的项目时,它给了我一个额外的空白窗口(不包含任何内容)。 Below is my code.下面是我的代码。 Please suggest me any changes or error in my code.请向我建议我的代码中的任何更改或错误。


import tkinter as tk

class Toplevel1(tk.Tk):
    def __init__(self, top=None, *args, **kwargs):
        tk.Tk.__init__(self, *args, **kwargs)

        top.geometry("600x450+306+137")
        top.minsize(120, 1)
        top.maxsize(1370, 749)
        top.resizable(1,  1)
        top.title("New Toplevel")
        top.configure(background="#d9d9d9")

        self.MenuFrame = tk.LabelFrame(top)
        self.MenuFrame.place(relx=0.0, rely=0.0, relheight=0.989, relwidth=0.25)
        self.MenuFrame.configure(relief='groove')
        self.MenuFrame.configure(foreground="black")
        self.MenuFrame.configure(background="#400080")

        self.Button1 = tk.Button(self.MenuFrame)
        self.Button1.place(relx=0.133, rely=0.067, height=24, width=107, bordermode='ignore')
        self.Button1.configure(background="#00ff80")
        self.Button1.configure(foreground="#000000")
        self.Button1.configure(pady="0")
        self.Button1.configure(text='''Button 1''')
        self.Button1.configure(command= lambda : self.show_frame(ButtonOne))
        
        self.MainWindow = tk.LabelFrame(top)
        self.MainWindow.place(relx=0.267, rely=0.111, relheight=0.767, relwidth=0.7)
        self.MainWindow.configure(relief='groove')
        self.MainWindow.configure(foreground="black")
        self.MainWindow.configure(background="#808040")

        self.frames = {}

        for F in (StartPage, ButtonOne):
            frame = F(self.MainWindow)
            self.frames[F] = frame

            frame.grid(row=0, column=0, sticky="nsew")

        self.show_frame(StartPage)

    def show_frame(self, cont):
        frame = self.frames[cont]
        frame.tkraise()


class StartPage(tk.Frame):
    def __init__(self, parent):
        tk.Frame.__init__(self, parent)
        # label of frame Layout 2


# second window frame page1
class ButtonOne(tk.Frame):

    def __init__(self, parent):
        tk.Frame.__init__(self, parent)
        label = tk.Label(self, text="Button 1 is pressed")
        label.pack()
         
    
if __name__ == '__main__':
    root = tk.Tk()
    app = Toplevel1(root)
    root.mainloop()

This causes a window to be created:这会导致创建 window:

class Toplevel1(tk.Tk):
    def __init__(self, top=None, *args, **kwargs):
        tk.Tk.__init__(self, *args, **kwargs)
        ...
...
app = Toplevel1(root)

And this causes a window to be created:这会导致创建 window:

root = tk.Tk()

If you don't want Toplevel1 to be a separate window, don't inherit from tk.Tk .如果您不希望Toplevel1成为单独的 window,请不要从tk.Tk继承。 Instead, you can inherit from tk.Frame , and then you can call pack , place , or grid to add this to the root window.相反,您可以从tk.Frame继承,然后您可以调用packplacegrid将其添加到根 window。

However, it looks like you're intending for your Toplevel1 to be the true root window, so you can remove root = tk.Tk() .但是,您似乎打算让您的Toplevel1成为真正的根 window,因此您可以删除root = tk.Tk() You can then do app.mainloop() rather than root.mainloop() You'll also have to make a few other adjustments, such as using self rather than top inside Toplevel1.__init__ .然后您可以执行app.mainloop()而不是root.mainloop()您还必须进行一些其他调整,例如在Toplevel1.__init__中使用self而不是top

Put another way, if you want only one window then either inherit from tk.Tk or create an instance of tk.Tk , but don't do both.换句话说,如果你只想要一个 window ,那么要么tk.Tk继承,要么创建一个tk.Tk的实例,但不要两者都做。

As on tkinter callbacks, tk.Tk in class Toplevel1 is about the same as Toplevel1=tk.Tk() which, in a sesne opens a new window.与 tkinter 回调一样, class Toplevel1中的 tk.Tk 与Toplevel1=tk.Tk()大致相同,后者在本质上会打开一个新的 Z05B8C74CBD96FBF2DE4C1A352702FFF4 the third line from whitespace, tk.Tk.__init__(self, *args, **kwargs) , it becomes useless.空格的第三行, tk.Tk.__init__(self, *args, **kwargs) ,它变得没用了。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM