如何在pyglet窗口中通过鼠标拖拽将.png图片从x,y坐标移动到x1,y1坐标
Pyglet 窗口PNG图片拖拽功能实现
核心实现逻辑
要实现拖拽功能,只需要维护3个核心状态变量即可:
- 当前是否处于拖拽状态
- 正在被拖拽的图片精灵对象
- 鼠标点击瞬间与图片锚点的偏移量(避免拖拽时图片左上角直接跳转到鼠标位置,影响交互体验)
完整可运行代码示例
你只需要将代码中test.png替换为你本地的PNG图片路径即可直接运行:
import pyglet from pyglet.window import mouse # 创建窗口 window = pyglet.window.Window(width=800, height=600, caption="拖拽图片测试") # 加载PNG图片并创建精灵,可自行新增多个精灵做多对象拖拽测试 image = pyglet.resource.image("test.png") sprites = [ pyglet.sprite.Sprite(image, x=100, y=200), pyglet.sprite.Sprite(image, x=400, y=300) ] # 拖拽状态变量初始化 dragging = False drag_sprite = None drag_offset_x = 0 drag_offset_y = 0 @window.event def on_mouse_press(x, y, button, modifiers): global dragging, drag_sprite, drag_offset_x, drag_offset_y if button != mouse.LEFT: return # 倒序遍历精灵,保证上层重叠的图片优先被选中 for sprite in reversed(sprites): if sprite.get_rect().contains(x, y): dragging = True drag_sprite = sprite # 计算鼠标点击位置和图片锚点的偏移量 drag_offset_x = sprite.x - x drag_offset_y = sprite.y - y # 将选中的图片移到最上层显示,避免被其他图片遮挡 sprites.remove(sprite) sprites.append(sprite) break @window.event def on_mouse_drag(x, y, dx, dy, buttons, modifiers): global dragging, drag_sprite, drag_offset_x, drag_offset_y if not dragging or not drag_sprite: return # 结合偏移量更新图片位置,避免瞬移 drag_sprite.x = x + drag_offset_x drag_sprite.y = y + drag_offset_y @window.event def on_mouse_release(x, y, button, modifiers): global dragging, drag_sprite if button == mouse.LEFT: dragging = False drag_sprite = None @window.event def on_draw(): window.clear() for sprite in sprites: sprite.draw() if __name__ == "__main__": pyglet.app.run()
功能说明
- 支持左键点击选中图片,拖拽到任意位置松开即可完成放置
- 点击重叠图片时优先选中最上层图片,选中后自动将该图片移到最上层显示
- 拖拽过程无瞬移问题,偏移量逻辑保证鼠标点击在图片的哪个位置,拖拽时就一直保持在对应位置
内容的提问来源于stack exchange,提问作者W W
相关产品推荐
相关产品推荐

