Pyglet切换GIF时窗口尺寸莫名增加像素的问题排查
问题:Pyglet开发GIF裁剪工具切换图片时窗口尺寸异常,出现黑边及鼠标偏移
我用Pyglet做了个简易GIF裁剪工具,首次加载GIF一切正常:窗口尺寸和GIF完全匹配,裁剪用的矩形能精准跟随鼠标点击、拖拽和释放操作。但切换到下一张或上一张GIF时,窗口resize事件会触发两次,第二次会让宽度多16像素、高度多39像素,导致窗口顶部和右侧出现黑边。
切换GIF时我打印了宽高值,按右键切换一次的输出示例:
Window Resized to 363 by 284 363 363 284 284 Window Resized to 379 by 323 363 379 284 323
出现问题后,鼠标绘制的矩形位置会偏移。手动拖拽窗口边缘调整尺寸的话,窗口会“回弹”到正确大小,额外的像素消失,矩形绘制也恢复正常。我试了各种方法都没修好,以下是截图和代码:
首张GIF(正常状态):
第二张GIF(出现黑边):
代码
import os import pyglet from pyglet import shapes from datetime import datetime from PIL import Image # 遍历当前文件夹生成GIF文件列表 files = [] n = 0 for file in os.listdir(): if file[-4:] == ".gif": files.append(file) gif = pyglet.image.load_animation(files[n]) sprite = pyglet.sprite.Sprite(gif) # 创建与GIF尺寸匹配的窗口 window = pyglet.window.Window(width = sprite.width, height = sprite.height, caption="My Pyglet Window", resizable=True) # 创建裁剪用矩形 rec = shapes.Rectangle(0, 0, 0, 0, color = (255,255,255,96)) @window.event def on_draw(): window.clear() sprite.draw() rec.draw() @window.event def on_mouse_press(x, y, button, modifiers): global rec # 点击矩形内部不做操作 if x >= rec.x and (x - rec.x) < rec.width and y > rec.y and (y - rec.y) < rec.height: pass # 否则设置新矩形的起点 else: rec = shapes.Rectangle(x, y, 0, 0, color = (255,255,255,96)) @window.event def on_mouse_release(x, y, button, modifiers): # 调整矩形原点为左下角(处理反向拖拽的情况) if rec.width <0: rec.x = rec.x - abs(rec.width) rec.width = abs(rec.width) if rec.height <0: rec.y = rec.y - abs(rec.height) rec.height = abs(rec.height) @window.event def on_mouse_drag(x, y, dx, dy, buttons, modifiers): global rec # 拖拽矩形内部时移动矩形 if x >= rec.x and (x - rec.x) < rec.width and y > rec.y and (y - rec.y) < rec.height: rec = shapes.Rectangle(rec.x + dx, rec.y + dy, rec.width, rec.height, color = (255,255,255,96)) return # 否则扩展矩形尺寸 rec = shapes.Rectangle(rec.x, rec.y, x-rec.x, y-rec.y, color = (255,255,255,96)) # 按键事件:切换GIF、裁剪等 @window.event def on_key_press(symbol, modifier): global files global n global sprite global window global rec global sprite # 左键切换上一张GIF if symbol == pyglet.window.key.LEFT: if n - 1 >= 0: n -= 1 gif = pyglet.image.load_animation(files[n]) sprite = pyglet.sprite.Sprite(gif) window.set_size(width = sprite.width, height = sprite.height) rec = shapes.Rectangle(0, 0, 0, 0, color = (255,255,255,96)) else: print("已经是第一张") # 右键切换下一张GIF if symbol == pyglet.window.key.RIGHT: if n + 1 < len(files): n += 1 gif = pyglet.image.load_animation(files[n]) sprite = pyglet.sprite.Sprite(gif) window.set_size(width = sprite.width, height = sprite.height) rec = shapes.Rectangle(0, 0, 0, 0, color = (255,255,255,96)) else: print("已经是最后一张") @window.event def on_resize(width, height): global sprite print(f"Window Resized to {width} by {height}") print(window.width, width) print(window.height, height) pyglet.app.run()
内容的提问来源于stack exchange,提问作者HJOEUser
相关产品推荐
相关产品推荐

