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

如何在Pyglet窗口中忽略系统UI缩放设置?

Pyglet窗口系统缩放适配方案

该问题由系统DPI缩放机制导致:默认状态下未开启DPI感知的应用会被系统按照全局缩放比例放大实际渲染尺寸,出现逻辑像素和物理像素不匹配的情况。两种解决方案实现如下:

方案1:让应用完全忽略系统界面缩放

直接禁用系统对当前应用的缩放适配,窗口设置的宽高就是实际物理像素尺寸,无需调整内部渲染逻辑。
实现代码:

import pyglet
import ctypes
from ctypes import wintypes

# Windows平台单独配置DPI感知级别
if pyglet.compat_platform == 'win32':
    user32 = ctypes.WinDLL('user32', use_last_error=True)
    user32.SetProcessDpiAwarenessContext.argtypes = [wintypes.HANDLE]
    # 设为最高级别DPI感知,系统不会对应用做自动缩放
    user32.SetProcessDpiAwarenessContext(ctypes.c_void_p(-4))

# 关闭Pyglet自带的DPI缩放适配
pyglet.options['dpi_scaling'] = False

# 此时创建的窗口会严格匹配设置的像素尺寸
window = pyglet.window.Window(width=1280, height=720)

方案2:动态适配系统界面缩放

主动获取系统缩放比例,将逻辑尺寸换算为实际物理尺寸创建窗口,内部渲染元素同步应用缩放系数,完美适配多显示器不同缩放比例的场景。
实现代码:

import pyglet

# 获取当前显示器的缩放系数
display = pyglet.canvas.get_display()
screen = display.get_default_screen()
scale_factor = screen.get_scale()

# 按业务需要设置逻辑尺寸
logic_width = 1280
logic_height = 720

# 换算为实际物理尺寸创建窗口
real_width = int(logic_width * scale_factor)
real_height = int(logic_height * scale_factor)
window = pyglet.window.Window(width=real_width, height=real_height)

# 渲染时所有元素的坐标、尺寸统一乘以缩放系数即可
@window.event
def on_draw():
    window.clear()
    # 示例:绘制逻辑坐标(10,10)、尺寸100*100的矩形
    pyglet.shapes.Rectangle(
        x = 10 * scale_factor,
        y = 10 * scale_factor,
        width = 100 * scale_factor,
        height = 100 * scale_factor,
        color = (255, 0, 0)
    ).draw()

# 多显示器场景可监听窗口移动事件,动态更新缩放系数
@window.event
def on_move(x, y):
    global scale_factor
    current_screen = window.display.get_screen_at_point(x, y)
    new_scale = current_screen.get_scale()
    if new_scale != scale_factor:
        scale_factor = new_scale
        # 此处可触发界面重绘逻辑

内容的提问来源于stack exchange,提问作者Kitsun CrownClown

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 13:06:04