Sie müssen die Dokumentation zu den Befehlen grid und pack lesen.
Mit pack
, die -fill
und -expand
Optionen Sie einstellen können, wie das Widget Größenänderung reagiert.
Beispiele:
pack .widget -fill both -expand true
pack .widget -fill x -expand true -anchor s
Mit grid
, die -sticky
Option und columnconfigure
und rowconfigure
Unterbefehle werden Ihnen nützlich sein.
Beispiele:
grid .widget -sticky ew
grid columnconfigure . 0 -weight 1
In einigen Fällen kann es spezielle Aktionen, die Sie auf einem Resize nehmen müssen. In diesem Fall ist der Befehl bind hilfreich. Sie können eine Bindung an ein <Configure>
-Ereignis herstellen und die Widget-Größe anpassen oder bei Bedarf andere Aktionen ausführen.
Edit:
Die grid columnconfigure
auf eine Säule mit einem Aufnahmerahmen gilt. Sie müssen es also nicht für jedes Widget ausführen. Im obigen Beispiel ist .widget
im Rahmen .
enthalten und die Spalte .
ist konfiguriert.
# in this example, the entry fields will adjust their width when
# the window is resized.
package require Tk
grid columnconfigure . 1 -weight 1
foreach {val} {1 2 3 4 5 6 7} {
ttk::label .lab$val -text "Label $val:"
ttk::entry .entry$val -textvariable mydata($val)
grid .lab$val .entry$val -in . -sticky w
# change the configuration for .entry$val only...
grid configure .entry$val -sticky ew
}
proc doresize { win } {
puts "Win $win now has width: [winfo width $win]"
}
bind . <Configure> [list ::doresize %W]
Beachten Sie, dass bei diesem Beispiel die bind
auch alle Kinder von .
als .
gilt, ist ein Fenster der obersten Ebene. Wenn Sie nur daran interessiert, Änderungen an .
sind, können Sie die Größe ändern Prozedur ändern:
proc doresize { win } {
if { $win eq "." } {
puts "Win $win now has width: [winfo width $win]"
}
}
Wenn die bind
an einem Rahmen oder Widget angewendet wird, die kein Fenster der obersten Ebene ist, werden die Ereignisse erhält, nur für die Rahmen oder Widget.
Beachten Sie auch, dass Sie alle die Ereignisse erhalten.Weitere Änderungen können Änderungen vorgenommen werden, um die Breite zu überprüfen:
set vars(last.width) 0
proc doresize { win } {
variable vars
if { $win eq "." } {
set newwidth [winfo width $win]
if { $newwidth != $vars(last.width) } {
puts "Win $win now has width: [winfo width $win]"
if { $vars(last.width) != 0 } {
# this is not the first time, as last.width is not zero
# do something due to window resize.
}
set vars(last.width) $newwidth
}
}
}
Referenzen: grid, pack, bind
Hallo Dank! Meine Widgets bilden sich dynamisch, so dass ich für jeden der Widgets dann den Gewichtungsschritt in a für jede Schleife konfigurieren kann. und könntest du vielleicht auch ein Beispiel geben, wie ich eine Größenanpassung sogar an ein Widget binden kann? Danke vielmals! – UBan
Sie können ein einfaches Beispiel wie dieses nehmen und mit verschiedenen Optionen experimentieren, um zu lernen, wie "-sticky" und "columnconfigure" funktionieren. Versuchen Sie auch, das Beispiel mit 'pack' erneut zu schreiben. 'pack' und' grid' haben ihre eigenen Stärken und Schwächen. Manche Leute mögen einen, manche Leute wie den anderen, manche benutzen beides. –
Vielen Dank! Es klappt. – UBan