2016-05-30 2 views
2

Ce code produit deux toiles dans une fenêtre. Cependant, Python ne les colle pas les uns aux autres mais crée un espace entre eux. Cet écart devient encore plus large lorsque je redimensionne la fenêtre.Comment éviter un espace entre deux toiles en python

from Tkinter import * 

class App: 
    def __init__(self,master): 

     master.title('Python Canvas Testing') 
     master.minsize(width=550, height=450) 

     settingscanvas = Canvas(master,bg="yellow") 
     settingscanvas.pack(side='top',anchor='nw',expand=True,fill='x') 

     datacanvas = Canvas(master,bd=1,bg="green") 
     datacanvas.pack(side='top',anchor='nw',expand=True,fill='both') 

     for r in xrange(15): 
      Label(settingscanvas, text='Label'+str(r+1)).grid() 

     Label(datacanvas, text='Label 2').grid() 

## create main program window 
window = Tk() 

## create window container 
app = App(window) 

mainloop() 

Y at-il une option qui me manque pour coller les deux toiles ensemble afin qu'il n'y ait pas d'espace?

+0

@ TadhgMcDonald-Jensen: mélanger 'pack' et' grid' n'est pas seulement possible, mais c'est une bonne pratique. La seule fois où vous ne pouvez pas faire cela est avec deux ou plusieurs widgets qui partagent un parent commun. Dans ce cas, les widgets ont des parents différents. –

+0

Je n'ai pas remarqué qu'ils étaient dans des widgets parents différents, je rétracte complètement mon commentaire original. –

Répondre

1

Les deux widgets ont la valeur expand définie sur True, de sorte qu'ils reçoivent chacun une partie de l'espace supplémentaire. Si vous souhaitez qu'un seul espace supplémentaire soit disponible, définissez expand sur False pour l'autre. Si vous voulez que les deux reçoivent un peu d'espace supplémentaire, veillez à régler fill pour inclure la direction y.

+0

Merci, c'était très utile. Puisque dans mon application le premier canevas ne change pas dans le contenu je pourrais le mettre à expand = False et maintenant avoir mon comportement désiré. J'avais l'impression que "expand = True" est requis pour "fill", ce qui n'est évidemment pas le cas. –

1

Je ne sais pas comment le faire fonctionner avec pack. Mais vous pouvez le faire avec le gestionnaire de réseau. Pour avoir un widget extensible avec une grille, vous devez définir deux choses. Tout d'abord, le paramètre "sticky" permet au widget de remplir l'espace à l'intérieur de sa cellule dans la grille ('ew' se remplit horizontalement, 'nsew' se remplit dans les deux directions). Deuxièmement, le paramètre de poids de la colonne et/ou de la ligne la rende consommable si elle est positive.

from tkinter import * 

class App: 
    def __init__(self,master): 
     master.title('Python Canvas Testing') 
     master.minsize(width=550, height=450) 

     settingscanvas = Canvas(master,bg="yellow") 
     settingscanvas.grid(sticky='ew') 

     datacanvas = Canvas(master,bd=1,bg="green") 
     datacanvas.grid(sticky='nsew') 

     master.grid_rowconfigure(1,weight=1) 
     master.grid_columnconfigure(0, weight=1) 

     for r in range(15): 
      Label(settingscanvas, text='Label'+str(r+1)).grid() 

     Label(datacanvas, text='Label 2').grid() 

## create main program window 
window = Tk() 

## create window container 
app = App(window) 

mainloop() 
+0

Je ne suis pas allé avec votre exemple parce que pour une raison quelconque, je suis arrivé à "pack" dans mon application pour obtenir tous les widgets où ils doivent être. Néanmoins, cette solution répond également à l'exigence définie dans mon exemple ici. –