2011-10-23 13 views
1

キャンバス領域のどこかでマウスボタンをクリックするとキャンバスにアクションが実行されます。私はクリックをバインドすることができましたが、それは既存のオブジェクトの上に作られているときにのみ:マウスボタンをバインドするTcl Tkのキャンバスのどこかをクリックしてください

$this/zinc bind all <Button-1> [list select_shape $this] 

私はタグを指定せずに同じコマンドを使用してみました:

$this/zinc bind <Button-1> [list select_shape $this] 

それがエラーを与えました。

そしてタグの代わりに空の文字列を与えることによって

:私は allを書いたかのように

$this/zinc bind "" <Button-1> [list select_shape $this] 

は、それが行動しました。

何をtagキャンバスのどこでも動作するように、またはtagを指定しないようにするにはどうすればよいですか?

答えて

4

キャンバスのbindメソッドでは、アイテム(およびアイテムに適用されたタグ)にのみバインドし、すべてのTkのイベントのサブセットに対してのみバインドできます。あなたは全体のキャンバスのためのイベントをしたい場合は - または他のタイプのイベントを検出するために - 使用グローバルbindコマンド:また

bind $this/zinc <Button-1> {...} 

を、下に完全に透明の長方形(空の文字列の両方-fill-outlineセットを)置きます他のすべてのアイテムを使用して、それを最後の最後の手段として使用します。そのように、他の人がクリックをピックアップしなければ、そうなります。あるいは、すべてのものの上にそのような透明なアイテムを置くことさえできます(この場合、すべてのマウスイベントを傍受します)。矩形(四角形以外のホットエリアが必要な場合のポリゴン)は特別な方法です。ほとんどのアイテムは表示されない部分では反応しませんが、完全に透明な矩形は全体の領域で反応します。これは興味深い用途ののすべての種類を持っています。

(時々、あなたは別の項目、例えば、背景画像の項目で基本となる四角形を組み合わせることができます。)

+0

私はこのアドバイスにも亜鉛キャンバス-同様に適用されるが、それはかなりおそらくだどの程度か分かりません良い。キャンバスのイベントモデルはかなり静かで、Tkコーダーの中でも比較的よく知られています。 –