2009-06-29 17 views
14

जीटीके में से आकार परिवर्तन (या PyGTK या gtkmm ...)जीटीके का पता लगाने खिड़की उपयोगकर्ता

मैं कैसे पता लगा सकते हैं कि एक आवेदन खिड़की मैन्युअल उपयोगकर्ता द्वारा आकार दिया गया है, के रूप में आम तौर पर खींच कर किया जाता है खिड़की के किनारे?

मैं मैनुअल अंतर करने के लिए एक रास्ता खोजने की जरूरत है आकार बदलता है, इस तरह के खिड़की सामग्री में बदलाव कि जीटीके से ही शुरू से आकार बदलता है।

+0

क्या आपने ऐसा करने का कोई तरीका निकाला है? – clahey

+0

नहीं। यदि मैं करता हूं, तो यह यहां दिखाई देगा। –

उत्तर

7

क्या आपने GDK_CONFIGURE ईवेंट से कनेक्ट करने का प्रयास किया है?

"विंडो चलाना" अनुभाग के अंतर्गत देखें। उदाहरण दिखाता है कि विंडो को स्थानांतरित होने पर कॉलबैक कुछ कर रहा है, लेकिन कॉन्फ़िगरेशन ईवेंट ऑर्डर ईवेंट को स्थानांतरित करने, आकार बदलने और ढेर करने के लिए कैच-सब है।

+1

निम्न कोड इस के लिए काम करता है: g_signal_connect (G_OBJECT (विंडो), "कॉन्फ़िगरेशन-ईवेंट" , G_CALLBACK (callback_func), NULL); – Sean

+0

@ सेन क्या आप एक उत्तर दे सकते हैं जो काम करता है? –

+0

मुझे लगता है कि आप "कॉन्फ़िगरेशन-ईवेंट" – boldnik

1

पीईजीटीके में, मैंने हमेशा विंडो आकार बदलने के लिए expose_event के लिए देखा है, फिर नया आकार प्राप्त करने के लिए get_allocation विधि का उपयोग करें।

+0

मैं GdkEventExpose संरचना को देख रहा हूं ... क्या यह send_event फ़ील्ड है जो मुझे बताएगा कि उपयोगकर्ता ने ऐसा किया है? –

+1

असल में, आप शायद event_configure चाहते हैं, event_expose नहीं ... मेरा बुरा। मुझे लगता है कि दोनों चालों और आकारों के लिए बुलाया जाता है, इसलिए आपको पिछली आकार याद रखना होगा यदि आप इसमें रुचि रखते हैं। – eduffy

0

चौड़ाई और ऊंचाई प्राप्त करने के लिए आप विंडो के ऊपरी बाएं कोने और gdk_window_get_geometry प्राप्त करने के लिए gdk_window_get_root_origin का उपयोग कर कुछ साथ फेंकने में सक्षम हो सकते हैं। फिर आप कॉलबैक को GDK_BUTTON_PRESS_MASK में लगा सकते हैं और यह देखने के लिए जांच सकते हैं कि बटन के किनारों में से एक पर बटन प्रेस होता है या नहीं।

बेशक

, यह काफी hackish लगता है और यह वास्तव में मुझे परेशान है कि मैं नहीं GdkWindow यह करने के लिए के लिए दस्तावेज में कुछ आसान तरीका मिल सकता है। gdk_window_begin_resize_drag फ़ंक्शन है जो वास्तव में मुझे लगता है कि ऐसा करने के लिए एक क्लीनर तरीका है, लेकिन मुझे मेरे उत्तर से कुछ और स्पष्ट नहीं दिखाई दिया।

4

मैं पर size_allocate और size_request सिग्नल देखने के द्वारा इसे खींचने में कामयाब रहा। यदि size_request कभी छोटा हो गया, तो मैंने resize(1,1) कहा। यदि size_allocate अपेक्षा से बड़ा था, तो मैंने सिस्टम को बंद कर दिया।

एक बात जिसे मैंने संभालने के लिए सुनिश्चित किया था size_request बड़ा लौटा रहा था, फिर छोटा, और size_allocate बड़ा और फिर छोटा होना था। मुझे नहीं पता कि यह संभव है, लेकिन मैंने इसे size_allocate के लिए अनुमानित मानों को कम करने के लिए सुनिश्चित किया है, जब मुझे size_allocate छोटा हो गया, न कि जब मुझे size_request छोटा हो गया।

ध्यान रखें, ताकि आप सही मूल्यों को प्राप्त है कि आपके size_request हैंडलर आधार वर्ग 'हैंडलर के बाद आता है सुनिश्चित करें। मैंने विधि को ओवरराइड करके और फिर बेस क्लास विधि को कॉल करके किया।

मैं दोनों 1 और 2 आयामों में यह कोशिश की है और यह किसी भी तरह से काम करने लगता है।

2

मेरे मामले में मैं एक उपयोगकर्ता उपयोगकर्ता पूरे विंडो का आकार बदलने से एक Gtk.Paned आकार बदलने के बीच अंतर करने की कोशिश कर रहा था। दोनों ने notify::position सिग्नल उत्सर्जित किया।

मेरे समाधान, था के बाद से मैं अगर उपयोगकर्ता विजेट से विंडो का आकार है पता नहीं कर सकते हैं, रिवर्स क्या मैं जानना चाहता था। अगर उपयोगकर्ता ने विजेट को दोबारा स्थान दिया है और अपडेट को अनदेखा कर दिया है तो उपयोगकर्ता ने अपने विजेट पर उन्हें शुरू नहीं किया है।

है कि परीक्षण के बजाय कहा, "यदि विंडो का आकार बदला जा रहा है" मैं स्थानीय स्तर पर button-press-event और button-release-event की दर्ज की गई तो मैं बजाय परीक्षण कर सकते हैं "अगर विजेट जा रहा है फिर से तैनात"

from gi.repository import Gtk 

class MyPaned(Gtk.Paned): 
    _user_activated = False 

    def on_position(self, _, gparamspec): 
     if self._user_activated: 
      # widget touched 

     else: 
      # window resized (probably) 

    def on_button_press(self, *_): 
     self._user_activated = True 

    def on_button_release(self, *_): 
     self._user_activated = False 


    dev __init__(self, *args): 
     super(MyPaned, self).__init__(*args) 
     self.connect('notify::position', self.on_position) 
     self.connect('button-press-event', self.on_button_press) 
     self.connect('button-release-event', self.on_button_release) 

प्रभावी ढंग से द्वारा दर्ज की गई जब उपयोगकर्ता ने सीधे मेरे विजेट के साथ बातचीत शुरू की और समाप्त कर दिया, तो मुझे लगता है कि बाकी समय खिड़की का आकार बदल रहा था। (जब तक मुझे और मामले नहीं मिलते)

+0

यह चालाक है ... –

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