2012-01-02 8 views
10

के बिना पाइथन में प्रत्येक डिस्प्ले के लिए डिस्प्ले गिनती और रिज़ॉल्यूशन प्राप्त करें। मैं उबंटू चला रहा हूं और मैं संलग्न डिस्प्ले की संख्या, उनके वर्तमान रिज़ॉल्यूशन और यदि संभव हो, तो एक दूसरे के संबंध में उनकी स्थिति प्राप्त करना चाहता हूं। क्योंकि मुझे xrandr का कंसोल आउटपुट पार्सिंग पसंद नहीं है - कम से कम अगर मुझे ऐसा नहीं करना है - मैं Python-XLib या इसी तरह के पाइथोनिक दृष्टिकोण के साथ ऐसा करना चाहता हूं। इस तरहबिना किसी 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 

मैं अजगर के साथ इन मूल्यों को प्राप्त करना चाहते हैं, एक तरह से:

यह मेरा प्रदर्शन config के लिए xrandr उत्पादन होता है

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 

जब अजगर के माध्यम से जानकारियां प्राप्त करने की कोशिश -XLib (या अन्य libs जैसे 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 बुला प्रदर्शन जानकारियां पाने के लिए:

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 आउटपुट को पार्स किए बिना पाइथन के साथ विस्तृत जानकारी (विस्तृत) प्रदर्शन जानकारी प्राप्त करने का कोई तरीका नहीं है?

उत्तर

7

xrandr कमांड लाइन से "RandR" X11 एक्सटेंशन तक पहुंचने के लिए केवल एक ग्राहक है। आप पाइथन-एक्सलिब से सीधे कार्यक्षमता तक पहुंच सकते हैं। Here एक उदाहरण है (पायथन-एक्सलिब के अपने कोड से!)।

बस यूआरएल फिर से बदलने के मामले में, यहां कोड का एक न्यूनतम टुकड़ा है जो हमें डिस्प्ले मोड प्राप्त करता है। हमें खिड़की बनाने की जरूरत है (इससे आकार, इत्यादि कोई फर्क नहीं पड़ता):

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) 

फिर हम इसका उपयोग कर स्क्रीन संसाधनों से पूछ सकते हैं। उदाहरण के लिए, ओपी के उदाहरण का पालन करना:

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

+0

ऐसा लगता है कि उदाहरण के लिंक को बदल दिया गया है। मैंने इसे अपडेट किया है। –

+0

xilb/xrandr से कनेक्ट किए गए आउटपुट नामों को कैसे प्राप्त किया जाए? –

संबंधित मुद्दे