2017-03-08 110 views
0

我正在尝试创建多框架GUI。我正在使用的代码为此目的正常工作。但是,当我在某些帧中添加一些图片时,GUI会出现在两个窗口中:一个具有正常的功能和排列;里面没有东西。如果我关闭他们中的任何一个,他们都关闭。使用Python为Tkinter GUI中的多窗口/框架添加ImageTk图片

我使用Python 2.7。

有人请向我解释发生了什么?

编辑:我现在知道原因。这是因为我使用tk.Toplevel而不是tk.Tk。随着tk.Tk,我没有双窗口的问题,但我不能让我的照片显示。任何帮助?

这里是我的代码:

import tkinter as tk # python3 
#import Tkinter as tk # python 
from PIL import ImageTk, Image 

TITLE_FONT = ("Helvetica", 18, "bold") 
img = Image.open('arrow.png') 

class SampleApp(tk.Toplevel): 
    def __init__(self, *args, **kwargs): 
     tk.Toplevel.__init__(self, *args, **kwargs) 

     # the container is where we'll stack a bunch of frames 
     # on top of each other, then the one we want visible 
     # will be raised above the others 
     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.arrow = ImageTk.PhotoImage(img) 

     self.frames = {} 
     for F in (StartPage, PageOne, PageTwo): 
      page_name = F.__name__ 
      frame = F(parent=container, controller=self) 
      self.frames[page_name] = frame 

      # put all of the pages in the same location; 
      # the one on the top of the stacking order 
      # will be the one that is visible. 
      frame.grid(row=0, column=0, sticky="nsew") 

     self.show_frame("StartPage") 

    def show_frame(self, page_name): 
     '''Show a frame for the given page name''' 
     frame = self.frames[page_name] 
     frame.tkraise() 


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

     tk.Frame.__init__(self, parent) 
     self.controller = controller 
     label = tk.Label(self, text="This is the start page", font=TITLE_FONT) 
#  label.pack(side="top", fill="x", pady=10) 
     label.grid(row=0) 

     arrow1 = tk.Label(self, image = self.controller.arrow) 
     arrow2 = tk.Label(self, image = self.controller.arrow) 
     arrow1.grid(row=1,column=0) 
     arrow2.grid(row=2,column=0) 
     button1 = tk.Button(self, text="Go to Page One", 
          command=lambda: controller.show_frame("PageOne")) 
     button2 = tk.Button(self, text="Go to Page Two", 
          command=lambda: controller.show_frame("PageTwo")) 
     button1.grid(row=1,column=1) 
     button2.grid(row=2,column=1) 


class PageOne(tk.Frame): 

    def __init__(self, parent, controller): 
     tk.Frame.__init__(self, parent) 
     self.controller = controller 
     label = tk.Label(self, text="This is page 1", font=TITLE_FONT) 
     label.pack(side="top", fill="x", pady=10) 
     label.grid(row=0) 
     button = tk.Button(self, text="Go to the start page", 
          command=lambda: controller.show_frame("StartPage")) 
     button.grid(row=1,column=1) 


class PageTwo(tk.Frame): 

    def __init__(self, parent, controller): 
     tk.Frame.__init__(self, parent) 
     self.controller = controller 
     label = tk.Label(self, text="This is page 2", font=TITLE_FONT) 
     label.pack(side="top", fill="x", pady=10) 
     button = tk.Button(self, text="Go to the start page", 
          command=lambda: controller.show_frame("StartPage")) 
     button.pack() 


if __name__ == "__main__": 
    app = SampleApp() 
    app.mainloop() 

回答

0

你忘了包括image=...选项进入PAGEONE和PageTwo标签。我已经添加了它。 ;)

另外,删除了Toplevel。或者,您仍然可以像使用Toplevel一样使用Toplevel,并在创建后隐藏root=tk.Tk()窗口。

#import tkinter as tk # python3 
import Tkinter as tk # python 
from PIL import ImageTk, Image 

TITLE_FONT = ("Helvetica", 18, "bold") 
img = Image.open('arrow.png') 

class SampleApp(tk.Frame): #change to tk.Frame 
    def __init__(self, parent, *args, **kwargs): #added parent 
     tk.Frame.__init__(self, parent, *args, **kwargs) #added parent 

     # the container is where we'll stack a bunch of frames 
     # on top of each other, then the one we want visible 
     # will be raised above the others 
     container = tk.Frame(parent) #changed self to parent 
     container.pack(side="top", fill="both", expand=True) 
     container.grid_rowconfigure(0, weight=1) 
     container.grid_columnconfigure(0, weight=1) 
     self.arrow = ImageTk.PhotoImage(img) 

     self.frames = {} 
     for F in (StartPage, PageOne, PageTwo): 
      page_name = F.__name__ 
      frame = F(parent=container, controller=self) 
      self.frames[page_name] = frame 

      # put all of the pages in the same location; 
      # the one on the top of the stacking order 
      # will be the one that is visible. 
      frame.grid(row=0, column=0, sticky="nsew") 

     self.show_frame("StartPage") 

    def show_frame(self, page_name): 
     '''Show a frame for the given page name''' 
     frame = self.frames[page_name] 
     frame.tkraise() 


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

     tk.Frame.__init__(self, parent) 
     self.controller = controller 
     label = tk.Label(self, text="This is the start page", font=TITLE_FONT) 
#  label.pack(side="top", fill="x", pady=10) 
     label.grid(row=0) 

     arrow1 = tk.Label(self, image = self.controller.arrow) 
     arrow2 = tk.Label(self, image = self.controller.arrow) 
     arrow1.grid(row=1,column=0) 
     arrow2.grid(row=2,column=0) 
     button1 = tk.Button(self, text="Go to Page One", 
          command=lambda: controller.show_frame("PageOne")) 
     button2 = tk.Button(self, text="Go to Page Two", 
          command=lambda: controller.show_frame("PageTwo")) 
     button1.grid(row=1,column=1) 
     button2.grid(row=2,column=1) 


class PageOne(tk.Frame): 

    def __init__(self, parent, controller): 
     tk.Frame.__init__(self, parent) 
     self.controller = controller 
     label = tk.Label(self, text="This is page 1", font=TITLE_FONT, 
         image = self.controller.arrow) # Added 
     label.pack(side="top", fill="x", pady=10) 
     label.grid(row=0) 
     button = tk.Button(self, text="Go to the start page", 
          command=lambda: controller.show_frame("StartPage")) 
     button.grid(row=1,column=1) 


class PageTwo(tk.Frame): 

    def __init__(self, parent, controller): 
     tk.Frame.__init__(self, parent) 
     self.controller = controller 
     label = tk.Label(self, text="This is page 2", font=TITLE_FONT, 
         image = self.controller.arrow) # Added 
     label.pack(side="top", fill="x", pady=10) 
     button = tk.Button(self, text="Go to the start page", 
          command=lambda: controller.show_frame("StartPage")) 
     button.pack() 


if __name__ == "__main__": 
    root = tk.Tk() #Added 
    app = SampleApp(root) #added root 
    root.mainloop() 
相关问题