2012-01-02 2 views
10

Sono in esecuzione su Ubuntu e voglio ottenere il numero di display collegati, la loro risoluzione corrente e, se possibile, la loro posizione in relazione l'uno con l'altro. Perché non mi piace parsing dell'output di console di xrandr - almeno non se non devo farlo - mi piacerebbe farlo con Python-XLib o un approccio Pythonic simile.Ottieni display count e risoluzione per ogni display in Python senza xrandr

Questa è l'uscita xrandr per la mia esposizione config:

$ 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 

voglio ottenere questi valori con Python, in un modo simile a questo:

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 

Quando si cerca di avere informazioni tramite Python -XLib (o altre librerie come pyGTK e pygame), sembra che tutti i display siano sempre gestiti come un unico display. Per esempio, questo è quello che ho ottenuto con XLib finora:

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 

so come ottenere informazioni di visualizzazione chiamante xrandr entro 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 

Ma come ho detto io preferirei un approccio più pulito, senza dover per analizzare l'output della console. Non c'è davvero modo di ottenere informazioni dettagliate (display) con Python senza dover analizzare l'output di xrandr?

risposta

7

xrandr è solo un client per accedere all'estensione X11 "RandR" dalla riga di comando. È possibile accedere alle funzionalità direttamente da Python-Xlib. Here è un esempio (dal codice proprio di Python-Xlib!).

Nel caso in cui l'URL cambi di nuovo, ecco una parte minima di codice che ci consente di visualizzare le modalità. Dobbiamo creare una finestra (non importa le dimensioni, ecc.):

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) 

Quindi possiamo interrogare le risorse dello schermo che lo utilizzano. Ad esempio, seguendo l'esempio di OP:

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

in Risorse del computer ottengo:

$ 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

ti dispiacerebbe condividere la vostra soluzione pls. – jagguli

+0

Sembra che il collegamento all'esempio sia cambiato. L'ho aggiornato. –

+0

Qualche idea su come ottenere i nomi delle uscite connesse da xilb/xrandr? –