2017-05-08 6 views
0

Ich möchte mehrere Frames in einer GUI verwenden, wo die Seite wechselt je nach der Schaltfläche geklickt. Ich weiß, dass es bereits mehrere Threads gibt, und ich habe mir this one angesehen. Für meine Seiten benötige ich jedoch verschiedene Bilder auf Leinwänden in jedem meiner Bilder, so dass, wenn ich ein anderes Bild aufnehme, es mit einer neuen Leinwand und einem neuen Bild auf dieser Leinwand kommt. Ich habe viel ausprobiert, aber ich weiß nicht, wie ich es zum Laufen bringen soll, damit die Leinwände mit ihren Bildern erscheinen.Tkinter mehrere Frames/'Seiten': mit Canvas Bilder

Hier ist, was ich bisher habe, meist von oben Link zu kopieren:

import tkinter as tk # python3 

TITLE_FONT = ("Helvetica", 18, "bold") 

class SampleApp(tk.Tk): 

    def __init__(self, *args, **kwargs): 
     tk.Tk.__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.frames = {} 
     self.frames["StartPage"] = StartPage(parent=container, controller=self) 
     self.frames["PageOne"] = PageOne(parent=container, controller=self) 
     self.frames["PageTwo"] = PageTwo(parent=container, controller=self) 

     self.frames["StartPage"].grid(row=0, column=0, sticky="nsew") 
     self.frames["PageOne"].grid(row=0, column=0, sticky="nsew") 
     self.frames["PageTwo"].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 

     self._canvas = tk.Canvas(parent, bg='white', width=900, height=3517, scrollregion=(0, 2800, 100, 800)) 
     self._photo = tk.PhotoImage(file='images/homegraphic.gif') 
     self._canvas.create_image(0, 0, image=self._photo, anchor='nw') 

     label = tk.Label(self, text="This is the start page", font=TITLE_FONT) 
     label.pack(side="top", fill="x", pady=10) 

     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.pack() 
     button2.pack() 


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) 
     button = tk.Button(self, text="Go to the start page", 
          command=lambda: controller.show_frame("StartPage")) 
     button.pack() 


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() 

Wie erhalte ich die Leinwand Bild zu erscheinen? Ich habe lange Zeit versucht, das herauszufinden und würde mich über jede Hilfe freuen!

+0

vergaß hinzuzufügen, wenn ich Gitter die Leinwand in der Klasse Startpage tun, öffnet sich das Fenster, um die richtige Größe, aber zeigt nichts, nur den normalen grauen tkinter Hintergrund mit dem Text und Knöpfe an der Spitze. – amrungwaew

+0

Ihr Canvas muss den aktuellen Frame selbst als Master und nicht als Eltern verwenden, genauso wie Ihre Buttons: 'self._canvas = tk.Canvas (self, bg = 'weiß', width = 900, height = 3517, scrollregion = (0, 2800, 100, 800)). Und dann müssen Sie 'pack' verwenden, um zu planen, da die StartPage von pack verwaltet wird. – Novel

Antwort

0

Das Problem ist hier:

self._canvas = tk.Canvas(parent, ...) 

Alles innerhalb einer Seite braucht ein Kind auf der Seite oder einer seiner Nachkommen zu sein.

Es muss sich dabei um:

self._canvas = tk.Canvas(self, ...) 
Verwandte Themen