You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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正常显示

第二张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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 16:52:09