2016-07-07 3 views
1

最初に高さの25%を占め、次は高さの75%を占める2つのテキストボックスを1つ作成します。Tcl/tk - グリッドのウィンドウの高さと幅を取得し、相対的なテキストの高さを設定します。

toplevel winの相対的な高さと幅を計算してテキストコマンドに渡そうとしましたが、動作しませんでした(wmジオメトリによって返される次元の単位がテキストコマンドに渡されたときと同じではないためです)

後に私のコードです:

toplevel .t 
wm geometry .t 1500x800+10+10 
update 
proc topAspect {args} { 
    regexp {(\d+)} $args -> relAspect 
    regexp {([^\d|%]+)} $args -> aspect 
    regexp {(.*)x(.*)[+-](.*)[+-](.*)} [wm geometry .t] -> width height x y 
    puts "width->$width height->$height x->$x y->$y" 
    switch -regexp [string tolower $aspect] { 
     x { 
      return [expr $x + $relAspect] 
     } 
     y { 
      return [expr $y + $relAspect] 
     } 
     w { 
      return [expr $width * $relAspect/100] 
     } 
     h { 
      return [expr $height * $relAspect/100] 
     } 
     default { 
      log::log error "Unsupported relative aspect $aspect cannot be determined for top level window" 
     } 
    } 
} 

text .t.text1 -height [topAspect -width 25%] -width [topAspect -width 99%] 
grid .t.text1 -sticky news 
text .t.text2 -height [topAspect -width 75%] -width [topAspect -width 99%] 
grid .t.text2 -sticky news 

私は、次の試したとき - それは私にいくつかのまともなGUI与えました:

text .t.text1 -height 20 -width [topAspect -width 99%] 
grid .t.text1 -sticky news 
text .t.text2 -height 20 -width [topAspect -width 99%] 
grid .t.text2 -sticky news 

をしかし、私はrelatiを使用したいですveオプション。それを動作させるには?

答えて

2

これを解決する最も簡単な方法は、適切な比率の重みと均一なグループを持つグリッドジオメトリマネージャを使用することです。ウィンドウのサイズを変更するとうまく動作します。 Tkはポリシー自体を知っており、あなたのためにそれを維持しています。 (内部的には、gridはかなり洗練された制約ソルバーである;。あなたはそれにいくつかの本当に複雑なものを行うことができます)

toplevel .t 
grid [text .t.text1 -bg red] -sticky news 
grid [text .t.text2 -bg green] -sticky news 

# The group name is just an arbitrary non-empty string. 
# So long as it is the same on the two rows it will work as desired. 
# The weights give a ratio of 1:3, i.e., 25% to one and 75% to the other. 

grid rowconfigure .t .t.text1 -weight 1 -uniform group1 
grid rowconfigure .t .t.text2 -weight 3 -uniform group1 

(あなたはTkの8.5を使用している場合は、rowconfigureに行を指定する必要があります)

1

textウィジェットの-height-widthオプションは、文字単位で表示され、画面単位では表示されません。フォントの幅と高さでさらに分割して修正することができます(私はそれらを以下の一定の値に設定します)。これは整数除算であることに注意してください。

おお、すべての正規表現...私はちょっときれいにしました、あなたはそれを取るか、それを残すことができます。

proc topAspect {aspect relAspect} { 
    set relAspect [string trimright $relAspect %] 
    scan [wm geometry .t] "%dx%d%d%d" width height x y 
    set fontWidth 15 
    set fontHeight 15 
    switch -regexp [string tolower $aspect] { 
     x { 
      return [expr {$x + $relAspect}] 
     } 
     y { 
      return [expr {$y + $relAspect}] 
     } 
     w { 
      return [expr {($width * $relAspect/100)/$fontWidth}] 
     } 
     h { 
      return [expr {($height * $relAspect/100)/$fontHeight}] 
     } 
     default { 
      log::log error "Unsupported relative aspect $aspect cannot be determined for top level window" 
     } 
    } 
} 

また、あなたは-height-widthの両方のためにtopAspectに引数として-widthを使用:私はそれが間違いだったと推定します。

text .t.text1 -height [topAspect -height 25%] -width [topAspect -width 99%] 
grid .t.text1 -sticky news 
text .t.text2 -height [topAspect -height 75%] -width [topAspect -width 99%] 
grid .t.text2 -sticky news 

それ以外の場合は、ドナルフェローズのソリューションをお勧めします。

ドキュメント: * (operator)+ (operator)/ (operator)exprforgridprocreturnscansetstringswitchtext (widget)wmは、 Syntax of Tcl regular expressions

+0

ケアは、マルチモニタセットアップで負のオフセットを持つことができるよう、ジオメトリの出力を解析取られる必要があります。例:鉱山では '200x200 + -638 + 77'です。だから、正確に解析する 'scan'ステートメントは、ネガを扱うことができる' [scan $ geometry "%dx%d +%d +%d"] 'です。 – patthoyts

+0

訂正ありがとう、私はフォーマットのドキュメントを誤解しました。しかし、私の現在の理解から、プレフィックスは+だけでなく、可能であれば数字の符号が続く可能性があります。もしそうなら、 '{%dx%d%* 1 [+ - ]%d%* 1 [+ - ]%d}'または正規表現 '{(\ d +)x(\ d + )[+ - ]?\ d +)[+ - ]([+ - ]?\ d +)} 'となります。 –

+0

形式WxH-X + Y(Xオフセットの先頭にマイナス記号を使用するのは、画面の右端からの位置を示すためです) - tkWinWm.cのWM_NEGATIVE_Xのコメントを参照してください。潜在的に '1x1- -2 + 3 '正規表現が必要なように見える – patthoyts

0

場所は、この場合には最高の働いていた - でも良く割合を差し出し、以下のサイズを変更するには:

place .t.text1 -in .t -relheight .25 -relwidth .98 -relx .003 -rely .003 
place .t.text2 -in .t -relheight .75 -relwidth .98 -relx .003 -rely .254 

は、誰もがグリッドに比べて、このアプローチでは見ている任意の落とし穴があります。

ありがとう

+0

'place'の主な問題は、このように使用すると、サイズを含むウィジェットにサイズを伝播しないことです。これは、GUIの残りの部分で何が起こっているかによって、あなたにとって重要であるかもしれません。右ウィジェットの ''イベントにバインドすることで修正することもできますが、それは事態が非常に複雑になる場合があります。 –

+0

オクラホマ - 私はあなたが示唆したようにグリッドで動作し、うまく動作すれば同じものを使用する - ありがとう – BabyGroot

関連する問題