如何在tkinter画布中制作拖放动画?

2024-10-04 09:19:36 发布

您现在位置:Python中文网/ 问答频道 /正文

目前我有一个

canvas.tag_bind(tag, "<ButtonRelease-1>", func=move_point)

用于移动我的点的语句,该语句删除旧点并在用户释放按钮1的位置创建新点。这是可行的,但感觉janky和button-1已经用光了,例如,不能用于在点之间建立连接。我尝试使用b1运动,但它只会将中心移动到我第一次移动鼠标的位置

我的问题是如何制作一个干净的动画(比如windows文件拖放)

下面是一张图,我在图中移动了几个点

Graph


Tags: 用户movebindtagbutton语句按钮point
1条回答
网友
1楼 · 发布于 2024-10-04 09:19:36

以下示例将帮助您开始:

  • shift click在画布上创建一个圆
  • click在圆上选择圆-它将跟随鼠标移动,直到您松开按钮
  • 松开鼠标按钮将在鼠标位置放置圆圈
  • 最后一个操作将按开始时的状态重置状态

您将需要更多的机器来创建圆之间的链接,并移动它们-甚至可能需要一个状态机来处理转换-但这只是一个开始

enter image description here

import tkinter as tk


class App(tk.Tk):
    radius = 20

    def __init__(self):
        super().__init__()
        self.canvas = tk.Canvas(self, width=500, height=500, bg='beige')
        self.canvas.pack()

        self.canvas.bind('<1>', self.select_circle)
        self.canvas.bind('<Shift-1>', self.make_circle)

        self.selected = None

    def make_circle(self, event):
        x, y, r = event.x, event.y, self.radius
        self.canvas.create_oval(x-r, y-r, x+r, y+r, outline='black', fill='white')

    def select_circle(self, event):
        self.canvas.bind('<Motion>', self.move_circle)
        self.canvas.bind('<ButtonRelease-1>', self.deselect)

        self.canvas.addtag_withtag('selected', tk.CURRENT)

    def move_circle(self, event):
        x, y, r = event.x, event.y, self.radius
        self.canvas.coords('selected', x-r, y-r, x+r, y+r)

    def deselect(self, event):
        self.canvas.dtag('selected')    # removes the 'selected' tag
        self.canvas.unbind('<Motion>')
        self.canvas.bind('<Shift-1>', self.make_circle)


if __name__ == '__main__':

    App().mainloop()

相关问题 更多 >