2016-10-03 15 views
13

मैं उबंटू पर पाइथन 3 से "हाल ही में उपयोग की जाने वाली" फ़ाइलों की सूची में जोड़ने की कोशिश कर रहा हूं।पाइथन से जीटीके की "हाल ही में उपयोग की गई" फ़ाइल सूची में कोई आइटम कैसे जोड़ता है?

मैं सक्षम सफलतापूर्वक पढ़ने के लिए हूँ इस तरह हाल ही में प्रयुक्त फ़ाइल सूची:

from gi.repository import Gtk 
recent_mgr = Gtk.RecentManager.get_default() 
for item in recent_mgr.get_items(): 
    print(item.get_uri()) 

यह फ़ाइलों की एक ही सूची मैं देख रहा हूँ कि जब मैं "हाल" देखो नॉटिलस में, या देखो बाहर प्रिंट जीआईएमपी जैसे ऐप्स के फाइल डायलॉग में "हाल ही में प्रयुक्त" जगह।

हालांकि, जब मैं इस तरह एक आइटम (जहां /home/laurence/foo/bar.txt एक मौजूदा पाठ फ़ाइल है) ...

recent_mgr.add_item('file:///home/laurence/foo/bar.txt') 

जोड़ने की कोशिश की ... फ़ाइल को नॉटिलस की या में हाल के अनुभाग में प्रदर्शित नहीं करता है फ़ाइल संवाद यह get_items() द्वारा दिए गए परिणामों में भी दिखाई नहीं देता है।

मैं पाइथन से जीटीके की हाल ही में उपयोग की गई फ़ाइल सूची में फ़ाइल कैसे जोड़ सकता हूं?

+1

हाल नॉटिलस और अन्य एप्लिकेशन में फ़ाइल संवाद (GIMP, इंकस्केप सहित, और यहां तक ​​कि क्रोम) द्वारा देखा फ़ाइलों की सूची @oldtechaa एक जैसा प्रतीत होता है। कई ऐप्स सूची को अपने स्वयं के फ़ाइल प्रकार में फ़िल्टर करने के लिए डिफ़ॉल्ट होते हैं, लेकिन यदि आप फ़िल्टर को "सभी फ़ाइलें" में बदलते हैं तो आप बिल्कुल वही सूची देखते हैं जो नॉटिलस दिखाता है, और यह प्रश्न में कोड द्वारा प्रदर्शित होता है। –

+0

'add_item()' वापसी क्या करता है? – andlabs

+0

@andlabs कॉलिंग 'add_item() 'रिटर्न' True'। (असल में, हमेशा 'ट्रू' लौटाता प्रतीत होता है, भले ही यूआरआई मैं इसे पास करता हूं, कोई भी निरर्थक या पूर्ण बकवास नहीं है। एकमात्र अपवाद यह है कि अगर मैं इसे गैर-str' पास करता हूं। फिर यह 'टाइप एरर' बढ़ाता है।) –

उत्तर

12

Gtk.RecentManager को C12+ वर्ग की निजी विशेषता में अद्यतन होने के लिए changed सिग्नल को उत्सर्जित करने की आवश्यकता है। ,

from gi.repository import Gtk 

recent_mgr = Gtk.RecentManager.get_default() 
uri = r'file:/path/to/my/file' 
recent_mgr.add_item(uri) 
Gtk.main() 

आप Gtk.main() फोन नहीं है, तो changed संकेत उत्सर्जित नहीं है और कुछ नहीं होता: एक आवेदन में एक RecentManager वस्तु का उपयोग करने के लिए आपको Gtk.main को फोन करके घटना पाश शुरू करने के लिए की जरूरत है।

@andlabs क्वेरी का उत्तर देने के लिए, कारण RecentManager.add_item एक बूलियन लौटाता है क्योंकि g_file_query_info_async फ़ंक्शन कहा जाता है। कॉलबैक फ़ंक्शन gtk_recent_manager_add_item_query_info फिर mimetype, एप्लिकेशन नाम और कमांड को GtkRecentData संरचना में एकत्रित करता है और अंततः gtk_recent_manager_add_full पर कॉल करता है। स्रोत here है।

कुछ भी गलत हो जाता है, यह अच्छी तरह से करने के बाद add_item समाप्त हो गया है, इसलिए विधि सिर्फ रिटर्न True अगर वस्तु से कहा जाता है एक RecentManager है और अगर uri NULL नहीं है; और अन्यथा False

प्रलेखन कह में गलत है:

रिटर्न TRUE अगर नए आइटम सफलतापूर्वक हाल ही में प्रयुक्त संसाधनों की सूची में जोड़ा गया था

के रूप में वापस TRUE केवल इसका मतलब है कि एक अतुल्यकालिक कार्य करने के लिए बुलाया गया था एक नई वस्तु के अतिरिक्त के साथ सौदा।

लारेंस गोंजाल्विस ने सुझाव दिया, निम्नलिखित चलाता छद्म तुल्यकालिक:

from gi.repository import Gtk, GObject 

recent_mgr = Gtk.RecentManager.get_default() 
uri = r'file:/path/to/my/file' 
recent_mgr.add_item(uri) 
GObject.idle_add(Gtk.main_quit) 
Gtk.main() 
संबंधित मुद्दे