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

问题描述 投票:0回答:1

目前我有一个

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

语句来移动我的点,在用户释放按钮-1的地方删除旧点并创建新点。这样做是可行的,但感觉很别扭,而且button-1已经用完了,不能用来做点与点之间的连接。我试过使用b1-motion,但它只是将中心移动到我第一次移动鼠标的地方。

我的问题是,如何才能做出一个干净的动画(就像windows文件拖放的动画)?

下面是一张我移动了几个点的图形的图片。

Graph

python canvas tkinter mouseevent tkinter-canvas
1个回答
3
投票

下面的例子可以让你开始使用。

  • 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()
© www.soinside.com 2019 - 2024. All rights reserved.