我正在运行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
但正如我所说,我更喜欢更简洁的方法,而无需解析控制台输出。是否真的没有办法获得(详细)使用Python显示信息而无需解析xrandr输出?
xrandr
只是一个从命令行访问“RandR”X11扩展的客户端。您可以直接从Python-Xlib访问该功能。 Here是一个例子(来自Python-Xlib自己的代码!)。
万一URL再次更改,这里是一段最小的代码,可以让我们看到显示模式。我们需要创建窗口(它与大小无关):
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
要在Windows中获取显示计数,您可以使用
import win32api
print(len(win32api.EnumDisplayMonitors()))