如何在tkinter中用箭头连接两个状态圆?

时间:2010-01-03 21:25:01

标签: python tkinter fsm

我目前正在用tkinter编写fsm编辑器。但是,我坚持连接两个州。我有两个问题:

1)如何根据鼠标移动使过渡箭头变长?

2)如何将箭头的起点固定在另一个状态的箭头状态和箭头的终点?

PS。你认为tkinter的文档是否足够好?

2 个答案:

答案 0 :(得分:4)

这是一个展示概念的例子。简而言之,使用标签将行与框关联,并在用户移动鼠标时简单地调整坐标。

运行示例,然后在米色框内单击并拖动。

当然,对于生产代码,您需要制作更通用的解决方案,但希望这能够向您展示创建一个带有箭头的框,当您移动框时,该框可以调整。

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()

答案 1 :(得分:3)

Tkinter对于这种应用来说非常好。在过去,我一直在使用工具,这些工具是用箭头连接的盒子,当你移动盒子时它们保持连接(这是我想你要问的)。不要让那些对Tkinter不太了解的人摇摆你 - 这是一个非常好的工具包,画布非常灵活。

您的问题的解决方案是简单的数学。您只需要计算框的边或角的坐标,以了解箭头的固定位置。为了让它像你说的那样“成长”,只需对鼠标移动进行绑定并适当更新坐标。

要使线条可增长,您所要做的就是每次鼠标移动时调整线条的坐标。最简单的方法是自由使用canvas标签。使用标签,您可以知道哪些箭头连接到哪些框,这样当您移动框时,您可以调整指向或指向它的任何箭头的坐标。