2017-08-14 3 views
0

Je cours un exemple sur la barre de défilement basée here. Mais je veux ajouter un bouton (Prev) pour encadrer et quand la barre de défilement descend, ce bouton reste toujours là, pendant que d'autres contenus se déplacent avec la barre de défilement.Créer un bouton de réparation avec barre de défilement dans Tkinter

enter image description here

Voici mon code:

import Tkinter as tk 

class Example(tk.Frame): 
    def __init__(self, root): 

     tk.Frame.__init__(self, root) 
     self.canvas = tk.Canvas(root, borderwidth=0, background="#ffffff") 
     self.frame = tk.Frame(self.canvas, background="#ffffff") 
     self.vsb = tk.Scrollbar(root, orient="vertical", command=self.canvas.yview) 
     self.canvas.configure(yscrollcommand=self.vsb.set) 

     self.vsb.pack(side="right", fill="y") 
     self.canvas.pack(side="left", fill="both", expand=True) 
     self.canvas.create_window((4,4), window=self.frame, anchor="nw", tags="self.frame") 

     self.frame.bind("<Configure>", self.onFrameConfigure) 

     self.populate() 

    def populate(self): 

     button = tk.Button(self.frame, text='Prev') 
     button.grid(row=0, columns=1) 

     for row in range(1,100): 
      tk.Label(self.frame, text="%s" % row, width=3, borderwidth="1", relief="solid").grid(row=row, column=0) 
      t="this is the second column for row %s" %row 
      tk.Label(self.frame, text=t).grid(row=row, column=1) 

    def onFrameConfigure(self, event): 
     '''Reset the scroll region to encompass the inner frame''' 
     self.canvas.configure(scrollregion=self.canvas.bbox("all")) 

if __name__ == "__main__": 
    root=tk.Tk() 
    Example(root).pack(side="top", fill="both", expand=True) 
    root.mainloop() 

Quelqu'un peut-il me aider à résoudre ce problème? Merci beaucoup!

+0

vous devez utiliser 'grille()' ici et il suffit de placer le bouton sur le dessus de la zone qui est défilée. –

Répondre

1

Vous pouvez le faire avec pack() aussi bien mais je préfère utiliser grid()

Ce que vous devez faire est de placer le bouton dans la racine sur la ligne 0 et placez le cadre de la classe sur la ligne 1 de la racine. Cela devrait résoudre votre problème. Lorsque vous utilisez grid(), nous devons gérer les poids des lignes et des colonnes afin d'obtenir le comportement de croissance et de rétrécissement lorsque nous redimensionnons la fenêtre. Nous pouvons le faire avec rowconfigute() et columnconfigute(). Pour ce programme, nous devons configurer les poids de la racine.

Pour obtenir le bouton pour rester à gauche, nous pouvons utiliser sticky = "w" à l'intérieur de grid() pour choisir le côté à coller à.

Jetez un oeil sur le code ci-dessous:

import tkinter as tk 

class Example(tk.Frame): 
    def __init__(self, root): 

     tk.Frame.__init__(self, root) 
     self.canvas = tk.Canvas(root, borderwidth=0, background="#ffffff") 
     self.frame = tk.Frame(self.canvas, background="#ffffff") 
     self.vsb = tk.Scrollbar(root, orient="vertical", command=self.canvas.yview) 
     self.canvas.configure(yscrollcommand=self.vsb.set) 

     self.vsb.grid(row = 1, column = 1, sticky = "nsew") 
     self.canvas.grid(row = 1, column = 0, sticky = "nsew") 
     self.canvas.create_window((4,4), window=self.frame, anchor="nw", tags="self.frame") 

     self.frame.bind("<Configure>", self.onFrameConfigure) 

     self.populate() 

    def populate(self): 

     button = tk.Button(root, text='Prev') 
     button.grid(row=0, columns=1, sticky = "w") 

     for row in range(1,100): 
      tk.Label(self.frame, text="%s" % row, width=3, borderwidth="1", relief="solid").grid(row=row, column=0) 
      t="this is the second column for row %s" %row 
      tk.Label(self.frame, text=t).grid(row=row, column=1) 

    def onFrameConfigure(self, event): 
     '''Reset the scroll region to encompass the inner frame''' 
     self.canvas.configure(scrollregion=self.canvas.bbox("all")) 

if __name__ == "__main__": 
    root=tk.Tk() 
    root.columnconfigure(0, weight = 1) 
    root.rowconfigure(1, weight = 1) 
    Example(root).grid(row = 1) 
    root.mainloop() 
+0

merci beaucoup. Et maintenant, je veux mettre le bouton au centre. Comment puis-je le faire? –