2017-09-08 3 views
0

私はtcl \ tkで新しく、これを使ってUIを開発しています。 UIウィンドウには、テーブルの列数に応じて動的なラベル数とテキストウィジェットが埋め込まれたフレームがあります。各列の入力ウィジェットがあり、ユーザーが入力したデータは、表の各列に入力されます。ウィンドウ内のフレーム、ラベル、テキストなどのウィジェットのサイズをtcl tkのウィンドウのサイズを変更して調整する方法

しかし私が直面している問題は、ウインドウ内のフレーム内のウィジェットのサイズと位置をウインドウのサイズに合わせて調整する方法が見つからないということです。つまり、ユーザーがウィンドウをドラッグ&拡大してウィンドウを拡大すると、ウィンドウ内のウィジェットのサイズも大きくなり、ウィンドウサイズに応じてその位置が調整されます。窓サイズのIDが減少した場合はその逆です。 HTML、CSSのブートストラップのようなもの。 誰も私に何か考えを与えることができますか? 何か助けていただければ幸いです。ありがとう!

答えて

0

gridおよびpackコマンドに関する説明書を読む必要があります。

packとすると、 ウィジェットがサイズ変更に反応する方法を調整するのに役立ちます(-fillとオプション)。

例:grid

pack .widget -fill both -expand true 
pack .widget -fill x -expand true -anchor s 

-stickyオプションとcolumnconfigurerowconfigureサブコマンドはあなたに有用であろう。

例:

grid .widget -sticky ew 
grid columnconfigure . 0 -weight 1 

いくつかのケースでは、サイズ変更時に取る必要があります特別なアクションがあるかもしれません。この場合、bindコマンドが便利です。 <Configure>イベントにバインドして、ウィジェットのサイズを調整するか、必要に応じて他のアクションを実行できます。

編集:

grid columnconfigureを含むフレームのカラムに適用されます。だから、ウィジェットごとに実行する必要はありません。上記の例では、.フレームに.widgetが含まれ、.フレームの列が設定されています。

# 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] 

.がトップレベルウィンドウであるように、この例で、bind.の子どもたちのすべてに適用されることに注意してください。あなただけ.への変更に興味がある場合は、サイズ変更手順を変更することができます。

proc doresize { win } { 
    if { $win eq "." } { 
     puts "Win $win now has width: [winfo width $win]" 
    } 
} 

bindがトップレベルウィンドウでないフレームやウィジェットに適用された場合、イベントはそのためだけに受信され、フレームまたはウィジェット。

すべてイベントが発生することにも注意してください。さらに、変更は幅への変更をチェックするために行うことができます。

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 
     } 
    } 
} 

参考文献:gridpackbind

+0

こんにちは感謝を!私のウィジェットは動的に形成されているので、ウィジェットのそれぞれのループごとに構成ウェイトステップを実行できますか?また、ウィジェットのサイズ変更をどのようにバインドすることができるかといった例を挙げてください。ありがとう、トン! – UBan

+0

このような簡単な例を取って、 '-sticky'と' columnconfigure'がどのように動作するかを知るために、さまざまなオプションで遊んでみてください。また、 'pack'を使ってサンプルを書き直してみてください。 'pack'と' grid'にはそれぞれ長所と短所があります。ある人は1人、いくつかの人は他の人、いくつかの人は両方を使用しています。 –

+0

ありがとう!できます。 – UBan

関連する問題