如何确定显示器刷新率?

8 投票
5 回答
7248 浏览
提问于 2025-04-15 13:21

有没有一种跨平台的方法可以在Python(2.6)中获取显示器的刷新率?我正在使用Pygame和PyOpenGL,如果这有帮助的话。

我不需要更改刷新率,我只是想知道它是多少。

5 个回答

0

在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上的回答,特别是因为我无法测试,但在那个平台上就是这样做的。)

1

我建议你换用 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]

这确实是正确的。

11

我不太清楚你用的是哪个平台,但如果你在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

撰写回答