Tkinterでは矢印で2つの状態の円を接続する方法は?
質問
私は現在、Tkinterの持つFSMエディタを書いています。しかし、私は、2つの状態を結ぶ上で立ち往生。私は2つの質問があります:
1)どのように
?マウスの動きに合わせて拡張可能な矢印の移行を行うことができます2)私は状態と別の状態の矢印の終点に矢印の開始点を固執することができますどのように?
PS。あなたはTkinterののドキュメントは十分良いと思いますか?
解決
ここ概念を示している例です。一言で言えば、使用ボックスに関連付けるラインのタグ、ユーザーがマウスを移動したときに、適切に、単に座標を調整します。
の例を実行し、その後、ベージュのボックス内からクリックしてドラッグします。
もちろん、生産コードのために、あなたは、より一般的な解決策を行う必要があり、それはあなたが周りにボックスを移動するように調整矢印の付いたボックスを作成するために、うまくいけば、このショーあなたがいかに簡単ます。
from Tkinter import *
class CanvasDemo(Frame):
def __init__(self, width=200, height=200):
Frame.__init__(self, root)
self.canvas = Canvas(self)
self.canvas.pack(fill="both", expand="1")
self.canvas.create_rectangle(50, 25, 150, 75, fill="bisque", tags="r1")
self.canvas.create_line(0,0, 50, 25, arrow="last", tags="to_r1")
self.canvas.bind("<B1-Motion>", self.move_box)
self.canvas.bind("<ButtonPress-1>", self.start_move)
def move_box(self, event):
deltax = event.x - self.x
deltay = event.y - self.y
self.canvas.move("r1", deltax, deltay)
coords = self.canvas.coords("to_r1")
coords[2] += deltax
coords[3] += deltay
self.canvas.coords("to_r1", *coords)
self.x = event.x
self.y = event.y
def start_move(self, event):
self.x = event.x
self.y = event.y
root = Tk()
canvas = CanvasDemo(root)
canvas.pack()
mainloop()
他のヒント
のTkinterは完全にアプリケーションのこの種の罰金です。過去には私はあなたが(私はあなたがについて尋ねていると思う何をしている)の周りにボックスを移動すると、接続に宿泊矢印で接続箱だったツールに働いてきました。 Tkinterのについてあまり知らない人があなたを動揺させてはいけない - それは完全に罰金ツールキットだとキャンバスは非常に柔軟です。
あなたの問題を解決するには、簡単な数学です。あなたは、単にどこ矢を固定するために知ってエッジや箱の隅の座標を計算する必要があります。作るために、それは、あなたが言うように「成長」は、単にマウスの動きに結合を作成し、適切な座標を更新します。
ライン可変長を作るためにすべてあなたがしなければならないが、その都度、マウスの移動ラインの座標を調整します。一番簡単な方法は、キャンバスタグのリベラル利用することです。タグを使用すると、あなたはボックスを移動するときに任意の矢印の座標を調整するようにボックスを接続する矢印知ることができるのか、それからポイントという。