如何确定显示器刷新率?
有没有一种跨平台的方法可以在Python(2.6)中获取显示器的刷新率?我正在使用Pygame和PyOpenGL,如果这有帮助的话。
我不需要更改刷新率,我只是想知道它是多少。
5 个回答
在macOS系统上,你可以使用pyobjc
来查询所有连接显示器的刷新率。为此,你需要用到Cocoa
(也就是“AppKit”)这个框架:
$ python3 -m venv screen-res
$ . ./screen-res/bin/activate
$ pip install pyobjc-framework-Cocoa
然后,在Python中:
from AppKit import NSScreen
for each in NSScreen.screens():
print(f"{each.localizedName()}: {each.maximumFramesPerSecond()}Hz")
在我的系统上,这样做会得到:
LG HDR WQHD+: 120Hz
Built-in Retina Display: 120Hz
(这结果是对的,我的显示器确实都设置为120Hz的刷新率。)
在Linux系统上,你可以使用python-xlib
:
from Xlib import display
from Xlib.ext import randr
d = display.Display()
default_screen = d.get_default_screen()
info = d.screen(default_screen)
resources = randr.get_screen_resources(info.root)
active_modes = set()
for crtc in resources.crtcs:
crtc_info = randr.get_crtc_info(info.root, crtc, resources.config_timestamp)
if crtc_info.mode:
active_modes.add(crtc_info.mode)
for mode in resources.modes:
if mode.id in active_modes:
print(mode.dot_clock / (mode.h_total * mode.v_total))
把合适的屏幕索引号和你想让PyOpenGL窗口打开的位置关联起来,这个留给读者自己去练习 :)。
(我这里不重复Anurag在Windows上的回答,特别是因为我无法测试,但在那个平台上就是这样做的。)
我建议你换用 pygame 的社区版。他们的网站是 https://pyga.me/。简单来说,之前的 pygame 核心开发者在原来的项目中遇到了一些困难,所以他们决定分叉这个项目,创建了一个新的版本。这个新版本的目标是提供更频繁的更新、持续的错误修复和改进,以及更民主的管理方式(这就是开源的魅力)。你可以通过运行 pip uninstall pygame
来卸载旧版,然后用 pip install pygame-ce --upgrade
来安装新版本,切换非常简单。他们的 API 和原来的 pygame
是一样的(所以你仍然可以用 import pygame
,一切都保持不变)。
这个新版本有很多不错的新功能和错误修复,包括在 display
模块中获取显示器刷新率的方法:
import pygame
pygame.init()
screen = pygame.display.set_mode((1280, 720))
clock = pygame.time.Clock()
running = True
print(
"Screen refresh rate for current window:", pygame.display.get_current_refresh_rate()
) # Must be called after pygame.display.set_mode()
print(
"Screen refresh rate for all displays:", pygame.display.get_desktop_refresh_rates()
) # Safe to call before pygame.display.set_mode()
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
screen.fill("purple")
pygame.display.flip()
clock.tick(60) # limits FPS to 60
pygame.quit()
在我的电脑上,这段代码输出
pygame-ce 2.3.2 (SDL 2.26.5, Python 3.11.4)
Screen refresh rate for current window: 144
Screen refresh rate for all displays: [144]
这确实是正确的。
我不太清楚你用的是哪个平台,但如果你在Windows系统上,可以使用ctypes或者win32api来获取设备的详细信息,比如用win32api。
import win32api
def printInfo(device):
print((device.DeviceName, device.DeviceString))
settings = win32api.EnumDisplaySettings(device.DeviceName, -1)
for varName in ['Color', 'BitsPerPel', 'DisplayFrequency']:
print("%s: %s"%(varName, getattr(settings, varName)))
device = win32api.EnumDisplayDevices()
printInfo(device)
这是我系统上的输出结果:
\\.\DISPLAY1 Mobile Intel(R) 945GM Express Chipset Family
Color: 0
BitsPerPel: 8
DisplayFrequency: 60