3

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

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

2)如何将箭头的起点粘贴在一个状态上,将箭头的终点粘贴在另一个状态上?

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

4

2 回答 2

5

这是一个显示该概念的示例。简而言之,使用标签将线条与框相关联,并在用户移动鼠标时适当地调整坐标。

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

当然,对于生产代码,您需要制定一个更通用的解决方案,但希望这向您展示了创建一个带有箭头的盒子是多么容易,因为您移动盒子时会调整箭头。

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()
于 2010-01-04T01:40:38.903 回答
3

Tkinter 非常适合这种应用程序。在过去,我研究过的工具是用箭头连接的盒子,当你移动盒子时,它们会保持连接(我认为你在问这个问题)。不要让对 Tkinter 不太了解的人影响你——它是一个完美的工具包,而且画布非常灵活。

您的问题的解决方案是简单的数学。您只需要计算框的边缘或角的坐标即可知道将箭头锚定在哪里。如您所说,要使其“增长”,只需对鼠标移动进行绑定并适当地更新坐标即可。

要使线条可增长,您只需在每次鼠标移动时调整线条的坐标。最简单的做法是自由使用画布标签。使用标签,您可以知道哪些箭头连接到哪些框,以便在移动框时调整指向或离开它的任何箭头的坐标。

于 2010-01-04T01:13:28.723 回答