2017-09-08 1 views
0

Ich bin neu in tcl \ tk und ich entwickle eine UI mit es. Das UI-Fenster verfügt über einen Rahmen mit einer dynamischen Anzahl von Beschriftungen und Textwidgets, die entsprechend der Anzahl der Spalten in einer Tabelle gefüllt sind. Es gibt ein Eintrags-Widget für jede Spalte, die vom Benutzer eingegebene Daten füllt jede Spalte in der Tabelle.Wie Größe der Widgets wie Rahmen, Beschriftung, Text in einem Fenster mit Größenanpassung des Fensters in tcl tk GUI

Jedoch ist das Problem, das ich gegenüberstelle, dass ich keinen Weg finden kann, um die Größe und Position der Widgets innerhalb des Rahmens im Fenster einzustellen, je nach der Größe des Fensters. Das heißt, wenn der Benutzer das Fenster durch Ziehen und Vergrößern seiner Größe vergrößert, sollten die Widgets innerhalb des Fensters ebenfalls größer werden und ihre Positionen entsprechend der Fenstergröße anpassen. Umgekehrt, wenn die Fenstergröße id kleiner wird. So etwas wie Bootstrap in HTML, CSS. Kann mir bitte jemand eine Idee geben ?? Jede Hilfe wird sehr geschätzt. Vielen Dank!

Antwort

0

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

+0

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

+0

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. –

+0

Vielen Dank! Es klappt. – UBan