2015-03-28 19 views
6

Quindi ho utilizzato il widget canvas in tkinter per creare una cornice piena di etichette con una barra di scorrimento. Tutto funziona bene eccetto che il frame si espande solo fino alla dimensione delle etichette posizionate al suo interno - Voglio che la cornice si espanda alla dimensione della tela genitore.Tkinter: come ottenere frame nella finestra della tela per espandere le dimensioni della tela?

Questo può essere fatto facilmente se utilizzo pack (expand = True) (che ho commentato nel codice sottostante) per il frame nell'area di disegno, ma poi la barra di scorrimento non funziona.

Ecco il bit appropriato di codice:

 self.canvas = Canvas(frame, bg = 'pink') 
     self.canvas.pack(side = RIGHT, fill = BOTH, expand = True) 

     self.mailbox_frame = Frame(self.canvas, bg = 'purple') 

     self.canvas.create_window((0,0),window=self.mailbox_frame, anchor = NW) 

     #self.mailbox_frame.pack(side = LEFT, fill = BOTH, expand = True) 

     mail_scroll = Scrollbar(self.canvas, orient = "vertical", 
      command = self.canvas.yview) 
     mail_scroll.pack(side = RIGHT, fill = Y) 

     self.canvas.config(yscrollcommand = mail_scroll.set) 

     self.mailbox_frame.bind("<Configure>", self.OnFrameConfigure) 


    def OnFrameConfigure(self, event): 
     self.canvas.configure(scrollregion=self.canvas.bbox("all")) 

Ho anche fornito un'immagine con cornici colorate in modo da poter vedere quello che voglio dire. L'area rosa è la tela che ha bisogno di riempire dal mailbox_frame (Si può vedere la barra di scorrimento a destra):

Grazie

risposta

9

Impostare un vincolante per l'evento di tela <Configure>, che spara ogni volta che la tela cambia dimensione . Dall'oggetto evento è possibile ottenere la larghezza e l'altezza della tela e utilizzarla per ridimensionare la cornice.

7

Solo per riferimento futuro nel caso in cui nessun altro ha bisogno di sapere:

 frame = Frame(self.bottom_frame) 
     frame.pack(side = LEFT, fill = BOTH, expand = True, padx = 10, pady = 10) 

     self.canvas = Canvas(frame, bg = 'pink') 
     self.canvas.pack(side = RIGHT, fill = BOTH, expand = True) 

     self.mailbox_frame = Frame(self.canvas, bg = 'purple') 

     self.canvas_frame = self.canvas.create_window((0,0), 
      window=self.mailbox_frame, anchor = NW) 
     #self.mailbox_frame.pack(side = LEFT, fill = BOTH, expand = True) 

     mail_scroll = Scrollbar(self.canvas, orient = "vertical", 
      command = self.canvas.yview) 
     mail_scroll.pack(side = RIGHT, fill = Y) 

     self.canvas.config(yscrollcommand = mail_scroll.set) 

     self.mailbox_frame.bind("<Configure>", self.OnFrameConfigure) 
     self.canvas.bind('<Configure>', self.FrameWidth) 

    def FrameWidth(self, event): 
     canvas_width = event.width 
     self.canvas.itemconfig(self.canvas_frame, width = canvas_width) 

    def OnFrameConfigure(self, event): 
     self.canvas.configure(scrollregion=self.canvas.bbox("all")) 
Problemi correlati