Da Ihre GUI zwei logische Gruppen von Widgets zu haben scheint, würde ich sie als solche organisieren. Beginnen Sie, indem Sie die Leinwand auf der linken Seite und einen Rahmen auf der rechten Seite platzieren. Sie können pack
, place
, grid
oder ein paned-Fenster verwenden, um sie zu verwalten. Für eine Links-nach-rechts-Ausrichtung ist pack
aufgrund seiner Einfachheit eine gute Wahl
Beachten Sie, dass Sie es nicht so machen müssen, aber die Erfahrung hat mich gelehrt, es macht Layout-Probleme viel einfacher zu lösen.
Im folgenden Beispiel I expand
-False
für die Schaltfläche Rahmen gesetzt, was bedeutet, dass die Leinwand wird wachsen und schrumpfen, wenn der Benutzer die Größe (weil es expand=True
), aber die Tasten nur genau so viel Platz in Anspruch nehmen als Sie brauchen.
canvas = Canvas(root, ...)
buttonframe = Frame(root, ...)
canvas.pack(side="left", fill="both", expand=True)
buttonframe.pack(side="right", fill="both", expand=False)
Als nächstes können Sie alle Schaltflächen auf der rechten Seite platzieren, ohne sich Gedanken machen zu müssen, wie sich ihre Platzierung auf Objekte auf der linken Seite auswirken könnte.
Wichtig bei der Verwendung von grid
ist, dass Sie mindestens eine Zeile und mindestens eine Spalte angeben müssen, um zusätzlichen Speicherplatz zu erhalten. Dies kann eine Zeile und/oder Spalte sein, die Widgets enthält, oder eine leere Zeile und Spalte an einer Kante.
button1 = Button(buttonframe, ...)
button2 = Button(buttonframe, ...)
button3 = Button(buttonframe, ...)
...
button1.grid(row=0, column=0)
button2.grid(row=0, column=1)
button3.grid(row=1, column=0)
...
buttonframe.grid_rowconfigure(100, weight=1)
buttonframe.grid_columnconfigure(2, weight=1)
Anmerkung: Wenn Sie einen Verweis auf ein Widget zu halten brauchen, müssen Sie das Widget erstellen und grid
(oder pack
oder place
) auf zwei getrennten Linien nennen. Denn Button(...).grid(...)
gibt den Wert des letzten Funktionsaufrufs zurück, und grid(...)
gibt None
zurück. Verwenden Sie 'grid (rowspan = ...)' für Canvas oder setzen Sie 'Frame' in die rechte Spalte und fügen Sie Schaltflächen in diesem Frame ein. – furas
BTW: 'var = Widgets(). Grid()' weist 'None' zu' var' zu, weil 'grid()' 'None' zurückgibt. Wenn Sie Variablen benötigen, dann tun Sie es in zwei Schritten: 'var = Widget()' und 'var.grid()'. – furas
Das 'Grid (rowspan = ...)' löste es, danke @furas – JMz