2012-03-06 8 views
2

Tkinter内のウィジェット(特に画像)の一貫したスタック順序を維持する方法はありますか?たとえば、キャンバス上の同じ場所に2つの長方形、2つの三角形、および円を持つことができます。マウスが最後にクリックされた場所に円が移動しますが、私は常に四角形の上と三角形の後ろに描画します。デフォルトの振る舞いは、最後に描画されたオブジェクトを上の所定の場所に配置することです。Tkinterでの注文保守のスタック

これまでのところ、Tkinterのスタッキングに対応するlift()メソッドとlower()メソッドしか見つかりませんでした。私は理論的には、再描画するたびに三角形が存在するかどうかを確認し、そこにある各形状のリフト()/下()を行いますが、それは不合理な解決策に見えます。キャンバスオブジェクトに一種の「レイヤー」変数が存在することを期待していましたので、レイヤー3のアイテムは常にレイヤー1のアイテムの背後にあることを覚えています。

私の問題を解決する簡単な方法があれば謝りますしかし、私の検索はまだ役に立たなかった。私はどんな入力にも感謝しています!

答えて

4

すべての三角形を「三角形」、すべての四角形を「長方形」、すべての円を「円」とタグ付けします。 liftまたはlowerメソッドを使用して、すべての三角形、円または四角形を一度に上下させることができます。あなたは何千ものアイテムを持っていても、それはほんの数冊のステートメントを必要とし、目の瞬きよりも少なく起こります。

組み込みのレイヤーメカニズムについて質問したので、tkにはこのようなことはありませんが、追加するのは本当に簡単です。すべてのツールがあります。したがって、liftまたはlowerコマンドをどこにでも振りかけるのではなく、すべての図面にレイヤリングを処理する特別なコマンドを実行させるようにしてください。

例えば、ここでは層数を受け入れ、それが描くすべてがその層であることを確認しますコマンドの例を示します。

def add_to_layer(self, layer, command, coords, **kwargs): 
    layer_tag = "layer %s" % layer 
    if layer_tag not in self._layers: self._layers.append(layer_tag) 
    tags = kwargs.setdefault("tags", []) 
    tags.append(layer_tag) 
    item_id = command(coords, **kwargs) 
    self._adjust_layers() 
    return item_id 

def _adjust_layers(self): 
    for layer in sorted(self._layers): 
     self.canvas.lift(layer) 

あなたは、このようにそれを呼び出します。

# draw a circle on layer 1: 
self.add_to_layer(1, self.canvas.create_oval, (x0,y0,x1,y1), outline="red") 
# draw a square on layer 2: 
self.add_to_layer(2, self.canvas.create_rectangle, (x0,y0,x1,y1), fill="blue") 

同じことを達成するには他にも多くの方法がありますが、上記は私の頭の上からのすばやく汚れた例です(100%正確であることは保証されていませんが、

基本的な考え方は、すべてのオブジェクトの作成は、項目が作成されるたびに積み重ね順序を調整できる単一の機能を実行することです。そうすることで、それらのリフト/ロワーコマンドを1つの場所に追加するだけで済みます。

+0

ブライアンありがとうございます。コード全体でこれらのステートメントを分散する必要はないと思っていましたが、単純な方法ではないようです。私は助けに感謝します! – Taugosz

+0

@Taugosz:レイヤリングシステムを実装するために必要なものすべてをどのように持っているかを示すために答えを更新しました。組み込みのものは何もありませんが、独自のレイヤーを実装するにはわずかな想像力しか必要としません。 –

+0

私は恥ずかしいです。私は早くそのような解決策を思いつきませんでした。私は確かに私が必要なツールを持っていた。あなたのポイントを説明するためにこのような完全なコードをまとめる時間がかかったことに非常に感謝しています。 – Taugosz

関連する問題