【问题标题】:Two windows appear on my tkinter app我的 tkinter 应用程序上出现了两个窗口
【发布时间】:2018-09-20 14:18:01
【问题描述】:

我对 python 和 tkinter 还很陌生,我试图打开 iamges 以将它们用作我的程序中的图标,所以我发现我必须使用 tk.Toplevel 而不是 tk.Tk。但是,当我这样做时,应用程序会打开两个窗口,一个是所有内容都已编程的窗口,一个是空白窗口。

这是完整的代码,以防有人可以提供帮助:

import tkinter as tk
from tkinter import ttk
from tkinter import PhotoImage
from PIL import Image, ImageTk

Large_Font = ("Times", 20)

class RobProject(tk.Toplevel):

    def __init__(self):

        tk.Toplevel.__init__(self)

        tk.Tk.wm_title(self, "Com-Bot Control")

        container = tk.Frame(self)
        container.pack(side="top", fill="both", expand = True)
        container.grid_rowconfigure(0, weight=1)
        container.grid_columnconfigure(0, weight=1)

        self.frames = {}

        for F in (MenuPage, PageOne, PageTwo, PageThree):

            frame = F(container, self)

            self.frames[F] = frame

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

        self.show_frame(MenuPage)

    def show_frame(self, cont):

        frame = self.frames[cont]
        frame.tkraise()

class MenuPage(tk.Frame):

    def __init__(self, parent, controller):
        tk.Frame.__init__(self,parent)

        label = tk.Label(self, text = "Menú", font=Large_Font)
        label.pack(pady=10, padx=10)

        RCB = ttk.Button(self, text="Control Remoto",
                        command= lambda: controller.show_frame(PageOne))
        RCB.pack()

        EOB = ttk.Button(self, text="EvitaObstáculos",
                        command= lambda: controller.show_frame(PageTwo))
        EOB.pack()

        SLB = ttk.Button(self, text="Siguelíneas",
                        command= lambda: controller.show_frame(PageThree))
        SLB.pack()

        img = Image.open("play-button.png")
        photo = ImageTk.PhotoImage(img)

        Show_Im = tk.Button(self, image=photo)
        Show_Im.image = photo
        Show_Im.pack()

class PageOne(tk.Frame):

    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)

        label = tk.Label(self, text = "Control Remoto", font=Large_Font)
        label.pack(pady=10, padx=10)

        Back_B1 = ttk.Button(self, text="Atrás",
                        command= lambda: controller.show_frame(MenuPage))
        Back_B1.pack()

class PageTwo(tk.Frame):

    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)

        label = tk.Label(self, text = "Evitaobstáculos", font=Large_Font)
        label.pack(pady=10, padx=10)

        Back_B2 = ttk.Button(self, text="Atrás",
                        command= lambda: controller.show_frame(MenuPage))
        Back_B2.pack()        

class PageThree(tk.Frame):

    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)

        label = tk.Label(self, text = "Siguelíneas", font=Large_Font)
        label.pack(pady=10, padx=10)

        Back_B3 = ttk.Button(self, text="Atrás",
                        command= lambda: controller.show_frame(MenuPage))
        Back_B3.pack()

app = RobProject()
app.mainloop()

提前谢谢你!

【问题讨论】:

  • 您需要tk.Tk() 来启动 tkinter 应用程序。 tk.Toplevel() 通常用于打开新窗口,而不是用于启动应用程序。

标签: python tkinter python-3.5


【解决方案1】:

您不需要Topelevel() 即可使用图像。 不确定您从哪里获得该信息,但它不准确。

Toplevel() 专门用于在 tkinter 的根窗口之外创建新窗口。

当您调用tk.Toplevel() 时,tkinter 正在创建Tk() 的实例以运行Toplevel()。这就是空白屏幕的来源。空白屏幕实际上是根窗口,其中没有任何内容。

解决您的问题更改:

class RobProject(tk.Toplevel):

    def __init__(self):

        tk.Toplevel.__init__(self)

收件人:

class RobProject(tk.Tk):

    def __init__(self):

        tk.Tk.__init__(self)

【讨论】:

  • 我必须这样做,否则我会遇到一个错误,告诉我 pyimageN 之类的东西不存在。但是,现在更改它不再出现,我不知道为什么...但是它起作用了,所以谢谢!
  • @SergioLatorreMuñoz 很可能问题出在您的图像路径上。路径有错字或图像不在指定的路径中。
猜你喜欢
  • 2020-10-15
  • 1970-01-01
  • 2013-09-18
  • 2019-01-18
  • 1970-01-01
  • 2018-11-17
  • 1970-01-01
  • 1970-01-01
  • 2010-12-27
相关资源
最近更新 更多