2012-02-19 11 views
5

मैं कुछ gtk और gnome अवधारणाओं के साथ थोड़ा उलझन में हूँ। मैं अपने gnome2 डेस्कटॉप पर गैर-न्यूनतम विंडो की सूची प्राप्त करने का प्रयास कर रहा हूं, लेकिन pygtk दस्तावेज़ पढ़ने और परिणामों का निरीक्षण करने के बाद, मैं परिणामों को समझ नहीं पा रहा हूं।मैं अपने gnome2 डेस्कटॉप पर pygtk का उपयोग कर सभी विंडोज़ की सूची कैसे प्राप्त करूं?

नीचे दिए गए दो स्निपेट में से कोई भी काम नहीं करता है।

सबसे पहले मैं इस ..

>>> gtk.gdk.window_get_toplevels() 
[<gtk.gdk.Window object at 0xb74339b4 (GdkWindow at 0x8a4c170)>] 

>>> gtk.gdk.window_get_toplevels()[0].get_children() 
[] 

की कोशिश की तो यह

>>> d = gtk.gdk.DisplayManager() 
>>> d.get_default_display().get_screen(0).get_root_window().get_children() 
[<gtk.gdk.Window object at 0x89dcc84 (GdkWindow at 0x8a4c170)>, <gtk.gdk.Window object at 0x89dccac (GdkWindow at 0x8a4c0c0)>] 

के रूप में सांत्वना उत्पादन में देखा, दूसरा विकल्प दो खिड़कियां देता है। लेकिन मैं यह समझने में सक्षम नहीं हूं कि वे क्या हैं। उनमें से कोई भी कोई बच्चा नहीं है और मैं हमेशा उन दो खिड़कियों को प्राप्त करता हूं चाहे मेरे डेस्कटॉप पर कितनी खिड़कियां हों।

कोई भी सामान्य gtk आधारित डेस्कटॉप वातावरण की वस्तुओं का पदानुक्रम समझा सकता है? मुझे समझ में नहीं आ रहा है कि उपर्युक्त कोड क्यों काम नहीं करता है।

कृपया वैकल्पिक समाधान पोस्ट करने से बचें जो संसाधन, wlck, xlib, qt, आदि के लिए संसाधन हैं। मुझे यह समझने में अधिक दिलचस्पी है कि मैं अन्य पुस्तकालयों की जांच करने में सलाह देने से गलत क्या कर रहा हूं।

उत्तर

9

आपकी बाधा यह कहने की तरह है कि "मैं केवल एक केले का उपयोग करके एक सीडी प्लेयर बनाना चाहता हूं। कृपया वैकल्पिक समाधान पोस्ट करने से बचें जो लेजर का सहारा लेते हैं।" जीटीके ऐसा नहीं कर सकता है, आप नौकरी के लिए गलत उपकरण का उपयोग कर रहे हैं।

यहाँ एक "खिड़की" वास्तव में इसका मतलब है और क्यों अपने कोड काम नहीं करता है की व्याख्या दी गई:

सबसे पहले, आप एक gtk.Window और एक gtk.gdk.Window के बीच अंतर को समझना होगा। एक जीटीके विंडो एक शीर्ष स्तर जीटीके विजेट है जिसमें अन्य विजेट शामिल हो सकते हैं। यह आमतौर पर आपके डेस्कटॉप पर एक विंडो से जुड़ा होता है, लेकिन जीटीके 3 में नहीं होना चाहिए - OffscreenWindow है।

दूसरी ओर, जीडीके विंडो प्लेटफॉर्म-निर्भर है। एक एक्स डेस्कटॉप पर यह एक एक्स विंडो के चारों ओर एक पतला आवरण है, जो एक डेस्कटॉप विंडो की जरूरी नहीं है। अन्य प्रणालियों पर यह खिड़की प्रणाली को दूर करने के लिए मौजूद है। एक जीडीके विंडो घटनाएं प्राप्त करती है, इसलिए कुछ जीटीके गैर-खिड़की विजेटों की अपनी जीडीके खिड़कियां होती हैं। "विंडो" वास्तव में इन वस्तुओं के लिए एक भयानक नाम है, लेकिन इसे एक्स से विरासत में मिला था और शायद यह बदलने वाला नहीं है।

प्रत्येक जीटीके प्रक्रिया केवल अपने विंडोज़ के बारे में जानता है। gtk.window_list_toplevels() का उपयोग कर के अपने स्वयं के एप्लिकेशन की अपूर्ण जीटीके विंडो की एक सूची प्राप्त कर सकते हैं। इन खिड़कियों के बच्चों को प्राप्त करने से आपको जीटीके विजेट्स मिलना चाहिए। हालांकि, आप अन्य प्रक्रियाओं की खिड़कियों के विजेट पदानुक्रम में उतर नहीं सकते हैं। उदाहरण के लिए, क्या होगा यदि किसी अन्य प्रक्रिया में एक बच्चे विजेट के साथ एक खिड़की है जो एक कस्टम विजेट है जिसे आपकी प्रक्रिया के बारे में पता नहीं है? यह विजेट के प्रकार के रूप में क्या रिपोर्ट करनी चाहिए?

gtk.gdk.window_get_toplevels() के साथ अपूर्ण जीडीके विंडोज़ की एक सूची प्राप्त करना मूल रूप से अपूर्ण एक्स विंडो की सूची प्राप्त करने जैसा ही है, जहां तक ​​मैं इसे समझता हूं। आपके पास यह जानने का कोई तरीका नहीं है कि वे किस प्रकार की खिड़कियां हैं - वे जीनोम पैनल हो सकते हैं, या वे क्यूटी विंडोज हो सकते हैं, या वे कुछ और हो सकते हैं जो डेस्कटॉप विंडो से मेल नहीं खाते हैं।

लिबनेक (link यह क्या करता है इसके अवलोकन के लिए) आपको गैर-न्यूनतम विंडो और उनके शीर्षक की एक सूची प्राप्त कर सकता है, लेकिन यह आपको उनके अंदर देखने की अनुमति नहीं देगा। ऐसा करने का कोई तरीका नहीं है। लिबनेक आंतरिक रूप से जीडीके का उपयोग करता है, इसलिए तकनीकी रूप से आप इसे जीडीके का उपयोग करके कर सकते हैं, लेकिन अगर आप पहले से ही एक पुस्तकालय है जो आपके लिए ऐसा करता है तो आप परेशान क्यों होंगे? यदि आप वास्तव में इसे स्वयं करना चाहते हैं, तो libwnck स्रोत कोड देखें।

+1

मुझे कठोर होने का मतलब नहीं है लेकिन मुझे नहीं लगता कि आपका उत्तर संतोषजनक है। आपके उत्तर के अंत तक, आपने अपने प्रारंभिक केले-सीडी-पाठक समानता को खारिज कर दिया। मुझे gtk और dtk.gdk विंडो के मतभेदों से अवगत है, यदि आप मेरा प्रश्न सावधानी से पढ़ते हैं, तो आप देखेंगे कि यह थोड़ा सा विषय था ... हालांकि मैंने उल्लेख किया कि मैं उलझन में था, इसलिए मुझे लगता है कि मैं दावा mea-culpa। – Pico

+0

मुझे लगता है कि नीचे की रेखा है, 'gtk.gdk.window_get_toplevels() 'आपके द्वारा वर्णित परिणाम को आउटपुट क्यों नहीं किया जा रहा है? खिड़कियों को सॉर्ट करने के लिए, मैं इस धारणा के तहत था कि उनके पास एकमात्र उद्देश्य के लिए विशेषताएं हैं। – Pico

+0

ठीक है, मुझे लगता है कि मैंने आपके प्रश्न का अर्थ यह समझने के लिए किया है कि आप विंडोज़ के बच्चे को _widgets_ क्यों नहीं प्राप्त कर सकते थे। मुझे नहीं पता कि जीडीके कॉल आप जो चाहते हैं वह नहीं कर रहा है। शायद आपको libwnck स्रोत कोड को देखना चाहिए कि यह कैसे काम करता है? – ptomato

7

आपके द्वारा प्राप्त की जाने वाली खिड़कियां आपकी प्रक्रिया के भीतर बनाई गई खिड़कियां हैं। खिड़कियों की सूची प्राप्त करने के लिए आपको रूट विंडो के गुणों को क्वेरी करने के लिए की जरूरत है इस तरह:

import gtk.gdk 
root = gtk.gdk.get_default_root_window() 
for id in root.property_get('_NET_CLIENT_LIST')[2]: 
    w = gtk.gdk.window_foreign_new(id) 
    if w: 
     print(w.property_get('WM_NAME')[2]) 

कृपया ध्यान दें कि GDK अंतर्निहित ओएस ग्राफिक्स इंजन (X11/क्वार्ट्ज/एक्वा/GDI आदि के ऊपर एक पतली परत है) और परिणाम विभिन्न NIX उपकरणों पर भिन्न हो सकता है।

+0

प्रतिक्रिया की अंतिम वाक्य बहुत गलत है। जीडीके ** ** ** "विजेट इंजन पर पतला रैपर नहीं है", यह ** जीटीके लागू करने के लिए प्रयुक्त ड्राइंग/विंडोिंग लाइब्रेरी है। क्यूटी और मोटीफ किसी भी तरह से जीडीके से जुड़े नहीं हैं। – user4815162342

+0

@ user4815162342 बहुत बहुत धन्यवाद, निश्चित। – grigoryvp

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

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