2017-05-08 2 views
0

Je voudrais utiliser plusieurs cadres dans une interface graphique, où la page bascule en fonction du bouton cliqué. Je sais qu'il y a déjà plusieurs sujets à ce sujet, et j'ai regardé this one. Cependant, pour mes pages, j'ai besoin de différentes images sur les toiles dans chacun de mes cadres, de sorte que lorsque j'élève une image différente, il y a une nouvelle toile et une nouvelle image sur cette toile. J'ai beaucoup essayé mais je ne sais pas comment le faire fonctionner pour que les toiles apparaissent avec leurs images.Tkinter plusieurs images/'pages': en utilisant des images de canevas

Voici ce que j'ai à ce jour, la copie principalement de lien ci-dessus:

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

Comment puis-je obtenir pour afficher l'image toile? J'ai passé beaucoup de temps à essayer de comprendre cela et j'apprécierais toute aide!

+0

a oublié d'ajouter, quand je fais la grille la toile en classe StartPage, la fenêtre apparaît la bonne taille, mais ne montre rien, juste l'arrière-plan normal tkinter gris avec le texte et les boutons en haut. – amrungwaew

+0

Votre canevas doit utiliser le cadre actuel lui-même en tant que maître, pas le parent, comme le font vos boutons: 'self._canvas = tk.Canvas (self, bg = 'white', largeur = 900, height = 3517, scrollregion = (0, 2800, 100, 800)) ». Et puis vous devez utiliser 'pack' pour mettre en page, puisque le StartPage est géré par pack. – Novel

Répondre

0

Le problème est ici:

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

Tout dans une page doit être un enfant de la page ou l'un de ses descendants.

Il doit être le suivant:

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