我目前正在用tkinter编写一个fsm编辑器。但是,我坚持连接两个状态。我有两个问题:如何用tkinter中的箭头连接两个状态圈?
1)如何使转换箭头可以根据鼠标移动增长?
2)我怎样才能将箭头的起始点粘在另一个状态的状态和箭头的终点上?
PS。你认为tkinter的文档是否足够好?
我目前正在用tkinter编写一个fsm编辑器。但是,我坚持连接两个状态。我有两个问题:如何用tkinter中的箭头连接两个状态圈?
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()
很好的例子..至少给了我这个主意;)谢谢! – israkir 2010-01-04 12:36:28
Tkinter对于这类应用程序来说非常合适。在过去,我一直在研究用箭头连接箱子的工具,这些工具在移动箱子时保持连接(这是我想你所问的)。不要让那些不太了解Tkinter的人摆布你 - 这是一个非常好的工具包,画布非常灵活。
你的问题的解决方案是简单的数学。您只需计算框的边或角的坐标以知道锚定箭头的位置。为了让它像你说的那样“增长”,只需对鼠标移动进行绑定并适当地更新坐标即可。
要让线条变得可长,您只需在每次移动鼠标时调整线条的坐标。最简单的做法是自由使用画布标签。使用标签可以知道哪些箭头连接到哪些框,以便在移动框时可以调整指向或指向任何箭头的坐标。
这听起来像是不适合Tkinter的东西。你看过其他图形工具包吗? – 2010-01-03 21:27:53
对其他图形工具包有何建议? – israkir 2010-01-03 21:35:05
@Evan:你为什么认为Tkinter不适合这项任务? – 2010-01-04 12:13:46