2016-10-06 11 views
1

誰かがこの状況で私を助けることができますか?私は、キャンバス内のすべてのRGBマトリックスの色デモに使用されるGUIを作成しようとしています。不幸にも、GUIは応答しておらず、ループが終了するまで期待通りに色が変わらない。どうかしましたか?私はループ内でウィジェットを設定するとこの問題に遭遇することがよくあります。Tk GUIが応答しない

package require Tk 
package require math 
proc changeColor {rM gM bM} { 
    for {set r 0} {$r<=$rM} {incr r} { 
     for {set g 0} {$g<=$gM} {incr g} { 
      for {set b 0} {$b<=$bM} {incr b} { 
       set rHex [format %02X $r] 
       set gHex [format %02X $g] 
       set bHex [format %02X $b] 
       set mark # 
       set color [append mark $rHex $gHex $bHex] 
       .cv config -bg $color 
       .lb config -text "[format %03d $r] [format %03d $g] [format %03d $b]" 
       after 500 
      } 
     } 
    } 
} 

canvas .cv 
ttk::label .lb 
ttk::button .bt -text Run -command {changeColor 255 255 255} 

grid .cv -row 0 -column 0 -sticky news 
grid .lb -row 1 -column 0 -sticky we 
grid .bt -row 2 -column 0 

Code_Snapshot

GUI_Snapshot

+0

* after * lineの前に* update idletasks *を使用してください。 –

+0

こんにちはマリオ、本当にあなたの親切に助けていただきありがとうございます。できます。 – Samuel

答えて

2

Tkの(およびTcl)同期after 500中全くイベントを処理しません。 ちょうどはその500ミリ秒間プロセスを停止します。

代わりにその時間のイベントを処理する必要があります。置き換えafter 500で:

after 500 {set go_on yes} 
vwait go_on 

go_onがグローバルがあること、そしてこれは、コード再入の問題を引き起こす可能性があることに注意してください。コードの実行中にプロシージャを実行するボタンを無効にする必要があります。

Tcl 8.6を使用して、すべてをコルーチンに変換することができます。次に、スタックを埋める危険なしに非同期睡眠を行うことができます。

proc changeColor {rM gM bM} { 
    for {set r 0} {$r<=$rM} {incr r} { 
     for {set g 0} {$g<=$gM} {incr g} { 
      for {set b 0} {$b<=$bM} {incr b} { 
       set rHex [format %02X $r] 
       set gHex [format %02X $g] 
       set bHex [format %02X $b] 
       set mark # 
       set color [append mark $rHex $gHex $bHex] 
       .cv config -bg $color 
       .lb config -text "[format %03d $r] [format %03d $g] [format %03d $b]" 
       ####### Notice these two lines... ######## 
       after 500 [info coroutine] 
       yield 
      } 
     } 
    } 
} 

##### Also this one needs to be altered ##### 
ttk::button .bt -text Run -command {coroutine dochange changeColor 255 255 255} 

# Nothing else needs to be altered 
+0

'update idletasks'は動作するように見えますが、ウィンドウの移動やサイズ変更などの外部イベントを生成する何かをすると問題が発生します。 –

+0

こんにちはドナル、あなたの詳細な説明をありがとうございます。 – Samuel

関連する問題