我目前正在用 tkinter 编写一个 fsm 编辑器。但是,我坚持连接两个状态。我有两个问题:
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 不太了解的人影响你——它是一个完美的工具包,而且画布非常灵活。
您的问题的解决方案是简单的数学。您只需要计算框的边缘或角的坐标即可知道将箭头锚定在哪里。如您所说,要使其“增长”,只需对鼠标移动进行绑定并适当地更新坐标即可。
要使线条可增长,您只需在每次鼠标移动时调整线条的坐标。最简单的做法是自由使用画布标签。使用标签,您可以知道哪些箭头连接到哪些框,以便在移动框时调整指向或离开它的任何箭头的坐标。