2012-01-02 86 views
10

我運行Ubuntu和我想連接的顯示器,其當前的分辨率的數量,如果可能的話,它們相對於彼此的位置。 因爲我不喜歡解析xrandr的控制檯輸出 - 至少不是如果我沒有 - 我想這樣做與Python-XLib或類似的Python化的做法。獲取顯示計數和Python中的每個顯示器的分辨率不xrandr

這是我的顯示配置的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 

我知道怎麼去顯示信息調用xrandr內的Python:

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輸出?

回答

7

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 
+0

,你會介意分享您的解決方案請。 – jagguli 2014-02-15 12:55:32

+0

看起來像示例的鏈接已更改。我已經更新了它。 – 2014-02-15 13:12:50

+0

任何想法如何從xilb/xrandr獲取連接的輸出名稱? – 2014-09-22 23:20:28