如何在 tkinter canvas 中制作拖放动画?
How to make a drag and drop animation in tkinter canvas?
目前我有一个
canvas.tag_bind(tag, "<ButtonRelease-1>", func=move_point)
用于移动我的点的语句,它会删除旧点并在用户释放按钮 1 的位置创建新点。这行得通,但感觉很糟糕,button-1 用完了,不能用于在点之间建立连接。我试过使用 b1-motion 但它只会将中心移动到我第一次移动鼠标的位置。
我的问题是如何制作干净的动画(例如 windows 文件拖放中的动画)?
下面是我移动了几个点的图表。
以下示例将帮助您入门:
shift click
在 canvas 上创建一个圆圈。
click
一个圆圈到 select 个圆圈 - 它会跟随鼠标移动,直到您松开按钮。
- 释放鼠标按钮会将圆圈放在鼠标所在的位置。
- 最后一个操作会将状态重置为开始时的状态。
您将需要更多的机制来创建圆圈之间的链接并四处移动它们 - 甚至可能需要一个状态机来处理转换 - 但这是一个开始。
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()
目前我有一个
canvas.tag_bind(tag, "<ButtonRelease-1>", func=move_point)
用于移动我的点的语句,它会删除旧点并在用户释放按钮 1 的位置创建新点。这行得通,但感觉很糟糕,button-1 用完了,不能用于在点之间建立连接。我试过使用 b1-motion 但它只会将中心移动到我第一次移动鼠标的位置。
我的问题是如何制作干净的动画(例如 windows 文件拖放中的动画)?
下面是我移动了几个点的图表。
以下示例将帮助您入门:
shift click
在 canvas 上创建一个圆圈。click
一个圆圈到 select 个圆圈 - 它会跟随鼠标移动,直到您松开按钮。- 释放鼠标按钮会将圆圈放在鼠标所在的位置。
- 最后一个操作会将状态重置为开始时的状态。
您将需要更多的机制来创建圆圈之间的链接并四处移动它们 - 甚至可能需要一个状态机来处理转换 - 但这是一个开始。
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()