2017-07-27 1 views
0

Also, wenn ich meine Gui-Klasse initialisieren und dann pack() meine Label-und Button-Widget die schöne Rahmen Stilisierung habe ich mit den Frames konfiguriert sie existieren in den Pausen. Warum ist das so, wenn Sie das Rudel der Button- und Label-Widgets kommentieren, so ist es genau so, wie ich es aussehen lassen möchte.Verpackung tkinter Widgets bricht Rahmen

class Gui(tk.Frame): 
    def __init__(self, parent, *args, **kwargs): 
     tk.Frame.__init__(self, parent, *args, **kwargs) 
     self.parent = parent 

     self.parent.wm_title("Conflict found") 
     self.TV = 'Hello' 
     # Creation 
     self.statusbar = statusbar(self, bg="black", height=100, width=300) 
     self.main = Main(self, bg="grey", height=50, width=300) 

     # Packing 
     self.statusbar.pack(side="top", expand=True) 
     self.statusbar.label.pack() 
     self.main.pack(side="bottom", expand=True) 
     self.main.button.pack() 

    def quit(self): 
     self.parent.destroy() 


class Main(tk.Frame): 
    def __init__(self, parent, *args, **kwargs): 
     tk.Frame.__init__(self, parent, *args, **kwargs) 
     self.parent = parent 
     self.button = tk.Button(self, text="Exit", command=self.quit) 


class statusbar(tk.Frame): 
    def __init__(self, parent, *args, **kwargs): 
     tk.Frame.__init__(self, parent, *args, **kwargs) 
     self.parent = parent 
     self.label = tk.Label(self, text=self.parent.TV, fg='white') 

Antwort

2

Die kurze Antwort ist, dass tkinter so funktioniert. Wenn Sie pack oder grid verwenden, bewirkt tkinter, dass das übergeordnete Fenster vergrößert oder verkleinert wird, damit es den untergeordneten Elementen entspricht.

Dies ist, was Sie wollen 99,999% der Zeit, weil Sie können Sie auf die Größe der Widgets basierend auf Zeichengrößen (oder Pixel, wenn es darauf ankommt, wie mit Bildern) konzentrieren und die GUI wird genau die richtige Größe sein .

Wenn Sie eine bestimmte Größe für Rahmen und Fenster wählen, sieht Ihr Programm nicht richtig aus, wenn der Benutzer verschiedene Schriftarten oder ein anderes Betriebssystem oder einen Monitor mit einer anderen Auflösung hat oder der Benutzer versucht, zu vergrößern oder zu verkleinern das Fenster manuell.

Es gibt Möglichkeiten, dieses Verhalten zu umgehen, aber Sie möchten dieses Verhalten fast nie ausschalten. Die beste Lösung ist, sich auf Ihre Interior-Widgets zu konzentrieren und sich Gedanken über die Fenstergröße zu machen.

Anstatt zu denken "Ich brauche eine Statusleiste, die 100 Pixel hoch und 300 Pixel breit ist", denke "Ich brauche eine Statusleiste, die Platz für mindestens 20 Zeichen bietet und das Fenster horizontal füllt". Tkinter wird dann das Richtige tun, egal welche Schriftart, Auflösung oder Betriebssystem Sie verwenden.

+0

Vielen Dank, danke! – Hau5ratz

1

Die height= und width= eines Rahmens der Regel nur dann, wenn der Rahmen leer. Sobald Sie ihm untergeordnete Widgets hinzufügen, wird seine Größe neu berechnet, um das Minimum für alle untergeordneten Elemente zu sein. Um dies zu vermeiden, können Sie .pack_propagate(0) auf dem Rahmen anrufen (oder .grid_propagate(0), wenn Sie .grid() auf die Kinder verwenden).

Verwandte Themen