如何在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
相关产品推荐
相关产品推荐

