gpt4 book ai didi

python - 在没有 xrandr 的情况下获取 Python 中每个显示器的显示计数和分辨率

转载 作者:太空狗 更新时间:2023-10-29 17:32:10 24 4
gpt4 key购买 nike

我正在运行 Ubuntu,我想获得连接显示器的数量、它们的当前分辨率,如果可能的话,它们之间的相对位置。因为我不喜欢解析 xrandr 的控制台输出——至少在我不需要的时候不喜欢——我想用 Python-XLib 来做。或类似的 Pythonic 方法。

这是我的显示配置的 xrandr 输出:

$ xrandr
Screen 0: minimum 320 x 200, current 2960 x 1050, maximum 8192 x 8192
DVI-0 connected 1680x1050+0+0 (normal left inverted right x axis y axis) 473mm x 296mm
1680x1050 60.0*+
1400x1050 60.0
1280x1024 75.0 60.0
1440x900 59.9
1280x960 75.0 60.0
1152x864 75.0
1280x720 75.0
1024x768 75.1 70.1 60.0
832x624 74.6
800x600 72.2 75.0 60.3 56.2
640x480 72.8 75.0 66.7 60.0
720x400 70.1
VGA-0 connected 1280x1024+1680+26 (normal left inverted right x axis y axis) 376mm x 301mm
1280x1024 60.0 + 75.0*
1024x768 75.1 70.1 60.0
832x624 74.6
800x600 72.2 75.0 60.3 56.2
640x480 72.8 75.0 66.7 60.0
720x400 70.1

我想用 Python 以这样的方式获取这些值:

displays = get_displays()
print displays[0].width # out: 1680
print displays[1].width # out: 1280
print displays[0].x_position # out: 0
print displays[1].x_position # out: 1680

当尝试通过 Python-XLib(或 pyGTK 和 pygame 等其他库)获取信息时,似乎所有显示总是作为一个单独的显示处理。例如,到目前为止,这是我使用 XLib 得到的:

import Xlib
import Xlib.display

display = Xlib.display.Display(':0')

print display.screen_count() # output: 1
root = display.screen().root
print root.get_geometry().width # output: 2960 -> no way to get width of single display?
print root.get_geometry().height # output: 1050

我知道如何在 Python 中调用 xrandr 获取显示信息:

import subprocess
output = subprocess.Popen('xrandr | grep "\*" | cut -d" " -f4',shell=True, stdout=subprocess.PIPE).communicate()[0]

displays = output.strip().split('\n')
for display in displays:
values = display.split('x')
width = values[0]
height = values[1]
print "Width:" + width + ",height:" + height

但正如我所说,我更喜欢一种更简洁的方法,而不必解析控制台输出。真的没有办法在不解析 xrandr 输出的情况下使用 Python 获取(详细)显示信息吗?

最佳答案

xrandr 只是一个从命令行访问“RandR”X11 扩展的客户端。您可以直接从 Python-Xlib 访问该功能。 Here是一个示例(来自 Python-Xlib 自己的代码!)。

以防万一 URL 再次更改,这里有一小段代码可以让我们获得显示模式。我们需要创建窗口(大小等无关紧要):

from __future__ import print_function
from Xlib import X, display
from Xlib.ext import randr

d = display.Display()
s = d.screen()
window = s.root.create_window(0, 0, 1, 1, 1, s.root_depth)

然后我们可以使用它来查询屏幕资源。例如,按照 OP 的示例:

res = randr.get_screen_resources(window)
for mode in res.modes:
w, h = mode.width, mode.height
print("Width: {}, height: {}".format(w, h))

在我的电脑中我得到:

$ python minimal.py 
Xlib.protocol.request.QueryExtension
Width: 1600, height: 900
Width: 1440, height: 900
Width: 1360, height: 768
Width: 1360, height: 768
Width: 1152, height: 864
Width: 1024, height: 768
Width: 800, height: 600
Width: 800, height: 600
Width: 640, height: 480

关于python - 在没有 xrandr 的情况下获取 Python 中每个显示器的显示计数和分辨率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8705814/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com