2012-01-02 18 views
10

Tôi đang chạy Ubuntu và tôi muốn có số màn hình được đính kèm, độ phân giải hiện tại của chúng và nếu có thể, vị trí của chúng có liên quan với nhau. Vì tôi không thích phân tích cú pháp đầu ra Console của xrandr - ít nhất là không nếu tôi không phải - tôi muốn làm điều đó với Python-XLib hoặc cách tiếp cận tương tự Pythonic.Nhận số lần hiển thị và độ phân giải cho mỗi hiển thị bằng Python mà không xrandr

Đây là sản phẩm xrandr cho cấu hình hiển thị của tôi:

$ 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 

Tôi muốn nhận được những giá trị này với Python, theo một cách như thế này:

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 

Khi cố gắng để có được thông tin qua Python -XLib (hoặc các libs khác như pyGTK và pygame), có vẻ như tất cả các màn hình luôn được xử lý như một màn hình duy nhất. Ví dụ đây là những gì tôi nhận với Xlib cho đến nay:

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 

tôi biết làm thế nào để có được thông tin hiển thị gọi xrandr trong 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 

Nhưng như tôi đã nói tôi muốn một cách tiếp cận sạch hơn mà không cần phải để phân tích đầu ra Console. Có thực sự không có cách nào để có được (chi tiết) Hiển thị thông tin với Python mà không cần phải phân tích cú pháp xrandr đầu ra?

Trả lời

7

xrandr chỉ là khách hàng truy cập vào phần mở rộng "RandR" X11 từ dòng lệnh. Bạn có thể truy cập chức năng trực tiếp từ Python-Xlib. Here là một ví dụ (từ mã riêng của Python-Xlib!).

Chỉ trong trường hợp URL thay đổi một lần nữa, đây là một đoạn mã tối thiểu giúp chúng tôi có chế độ hiển thị. Chúng tôi cần tạo cửa sổ (không quan trọng kích thước, v.v.):

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) 

Sau đó, chúng tôi có thể truy vấn tài nguyên màn hình bằng cách sử dụng nó. Ví dụ, theo gương OP của:

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

Trong máy tính của tôi, tôi nhận được:

$ 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

bạn sẽ nhớ chia sẻ giải pháp của bạn xin. – jagguli

+0

Có vẻ như liên kết đến ví dụ đã thay đổi. Tôi đã cập nhật nó. –

+0

Bất kỳ ý tưởng làm thế nào để có được tên kết nối đầu ra từ xilb/xrandr? –

Các vấn đề liên quan