2016-05-07 6 views
3

Tkボタンウィジェットを試すための簡単なスクリプトを作成しましたが、予期しないエラーが発生しました。エラー:不明なオプション "-state"は、button.tclという名前のスクリプトを実行すると発生します。

#!/usr/bin/env tclsh 
package require Tk 

set w .demo 
toplevel $w 

ttk::button $w.ok -text OK -command {puts "OK Pressed"} 
grid $w.ok 

私はこれを実行すると、私は2つのウィンドウを取得:1つのタイトルバーにある「ボタン」と呼ばれるpackage require Tkコマンドによって作成されたウィンドウ(私はスクリプトの名前ので、「button.tcl」)および他のtoplevel $wコマンドで作成され、タイトルバーで「デモ」と呼ばれます。

「デモ」トップレベルウィンドウは、期待どおりに動作します。 OKボタンをクリックすると、スクリプトコマンドが実行されます。

エラー:私は、私は次のようなエラーダイアログを取得する「ボタン」ウィンドウ内に私のマウスを移動した場合、問題は、ある未知のオプション「 - 状態」

詳細>>

unknown option "-state" 
unknown option "-state" 
    while executing 
"$w cget -state" 
    (procedure "tk::ButtonEnter" line 3) 
    invoked from within 
"tk::ButtonEnter ." 
    (command bound to event) 

Failing button application with error message

私はまた、このようなwishインタプリタを使用して代わりにtclsh、残して、これを実行しているのバリエーションを試してみましたActiveTcl 8.6.4.1とWindows 8を使用していますオフpackage require Tk、代わりに他のウィジェットを使用するなど

奇妙なことは、スクリプトファイルの名前を "button.tcl"以外に変更すると、エラーは発生せず、すぐに問題は解決しますが

  1. なぜ、スクリプトが「button.tcl」と呼ばれるとこのエラーが発生するのですか?
  2. スクリプトファイルに「button.tcl」という名前を使用することに問題がある場合は、注意すべきファイル名が他にありますか?

答えて

4

ブレントB.ウェルチら、ページ476による "TclとTkで実用的なプログラミングの" From:tk8.6ライブラリにbutton.tcl内部で探し

Don't use widget names for script names.
The application class name becomes the class name for the main toplevel window. For example, if you use a script name like button.tcl, the class for . becomes Button. This causes it to inherit all the standard Button bindings and attribute values, which can cause problems in your application.

、問題が明らかです。このスクリプトは、クラスButtonEnterイベントを、ウィンドウ名を引数としてtk::ButtonEnterの呼び出しにバインドします。 tk::ButtonEnterの内部では、そのウィンドウはその-stateオプション値のために照会されます。スクリプトの名前はbutton.tclなので、マウスがメインウィンドウに入るとこのバインディングが実行されます。

+1

イメージの操作後に名前を付けないでください。どうして? 'open'という名前のイメージを作成すると、標準的なTclコマンドを置き換えるので、あなたのプログラムは不思議に失敗します。 (そこに行って、それをして...) –

+0

どうやら私はこの本を読む必要があります。 – Brandin