gpt4 book ai didi

python - 如何在 tkinter Canvas 中制作拖放动画?

转载 作者:行者123 更新时间:2023-12-02 19:30:45 27 4
gpt4 key购买 nike

目前我有一个

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

用于移动我的点的语句,该语句会删除旧点并在用户释放按钮 1 的位置创建新点。这是可行的,但感觉很卡顿,而且 Button-1 已用完,无法用于在点之间建立连接等。我尝试过使用 b1-motion,但它只会将中心移动到我第一次移动鼠标的位置。

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

下面是我移动了几个点的图表图片。

Graph

最佳答案

以下示例将帮助您入门:

  • 在 Canvas 上按住 Shift 键并单击以创建一个圆圈。
  • 单击一个圆圈来选择一个圆圈 - 它将跟随鼠标移动,直到您释放按钮。
  • 松开鼠标按钮会将圆圈放在鼠标所在的位置。
  • 最后一个操作会将状态重置为开始时的状态。

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

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()

关于python - 如何在 tkinter Canvas 中制作拖放动画?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61834886/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com