2009-03-12 16 views
5

में एक कस्टम कमांडइवेट उत्पन्न करें मेरी शीर्ष-स्तरीय विंडो को यह जानने की आवश्यकता है कि कस्टम नियंत्रण की आंतरिक स्थिति में परिवर्तन कब होता है ताकि यह जीयूआई के विभिन्न हिस्सों को अपडेट कर सके। मैं नियंत्रण में एक कस्टम इवेंट कैसे उत्पन्न करूं, इसलिए यह शीर्ष-स्तरीय विंडो द्वारा प्रसारित और संभाला जा सकता है?wxPython

उत्तर

12

मैं जानता हूँ कि यह एक पुरानी है सवाल है, लेकिन WxPython में ऐसा करने के लिए एक नया, थोड़ा अच्छा, तरीका है। http://wiki.wxpython.org/CustomEventClasses और ऊपर से दूसरे शब्दों में बयान:

घटना को परिभाषित करने के लिए:

import wx.lib.newevent 
QuantityChangedEvent, EVT_QUANTITY_CHANGED = wx.lib.newevent.NewCommandEvent() 

एक घटना बनाने के लिए:

event = QuantityChangedEvent(self.GetId()) 
self.GetEventHandler().ProcessEvent(event) 
# or ... 
#wx.PostEvent(self, event) 

घटना बाइंडिंग ही रहता है।

11

प्रचार करने के लिए, ईवेंट wx.CommandEvent होना चाहिए। (प्रसार के बारे में विवरण के लिए wxWidgets event handling overview देखें।) अधिक विशेष रूप से, यह wx.PyCommandEvent होना चाहिए, जो पाइथन-जागरूक है और WxWidgets ईवेंट सिस्टम के माध्यम से सुरक्षित रूप से अपने पायथन बिट्स को परिवहन करने में सक्षम है और ईवेंट हैंडलर का आह्वान होने पर उन्हें अभी भी वहां रखा जा सकता है ।

इस प्रकार अपने कस्टम घटना प्रकार निर्धारित करें:

EVT_QUANTITY_CHANGED = wx.PyEventBinder(wx.NewEventType(), 1) 

आप शायद मॉड्यूल स्तर पर ऐसा करना चाहते हैं, हालांकि यह कुछ परिस्थितियों में आपके नियंत्रण से __init__ विधि में यह करने के लिए वांछनीय हो सकता है।

नियंत्रण इस प्रकार अब एक घटना उत्पन्न कर सकते हैं:

event = wx.PyCommandEvent(EVT_QUANTITY_CHANGED.typeId, self.GetId()) 
self.GetEventHandler().ProcessEvent(event) 

उच्च-स्तरीय विंडो बाँध और हमेशा की तरह घटना को संभाल कर सकते हैं:

self.Bind(mycontrol.EVT_QUANTITY_CHANGED, self.OnQuantityChanged)