PyQt4 में, स्लॉट और सिग्नल के बीच कनेक्शन स्थापित करना इवेंट हैंडलिंग का एक मूलभूत पहलू है। हालाँकि, जब एक लूप के भीतर बटनों से उत्सर्जित कई संकेतों को जोड़ने का प्रयास किया जाता है, तो अप्रत्याशित व्यवहार उत्पन्न हो सकता है।
इस समस्या को स्पष्ट करने के लिए, निम्नलिखित कोड पर विचार करें:
def __init__(self): for i in range(0, 10): self._numberButtons = [QPushButton(str(i), self)] self.connect(self._numberButtons[i], SIGNAL('clicked()'), lambda: self._number(i)) def _number(self, x): print(x)
किसी भी बटन पर क्लिक करने पर, आउटपुट लगातार '9' प्रदर्शित करता है, चाहे कोई भी बटन दबाया गया हो। इस व्यवहार के पीछे के कारण को समझने में पायथन के स्कोपिंग नियमों की जटिलताओं की खोज करना शामिल है।
पायथन में, एक वेरिएबल का स्कोपिंग निकटतम एन्क्लोजिंग फ़ंक्शन द्वारा निर्धारित किया जाता है। इस उदाहरण में, लैम्ब्डा फ़ंक्शन और '_नंबर' फ़ंक्शन दोनों को '__init__' फ़ंक्शन के भीतर परिभाषित किया गया है। चूँकि लूप प्रत्येक पुनरावृत्ति के लिए 'i' को समान मान ('9') प्रदान करता है, लैम्ब्डा फ़ंक्शन हमेशा '__init__' फ़ंक्शन के भीतर 'i' को निर्दिष्ट अंतिम मान को कैप्चर करता है, जो कि '9' है।
इस समस्या को हल करने के लिए, एक दृष्टिकोण 'i' को लैम्ब्डा फ़ंक्शन के भीतर एक डिफ़ॉल्ट मान के साथ एक कीवर्ड तर्क के रूप में पास करना है, यह सुनिश्चित करना कि प्रत्येक उदाहरण के लिए 'i' की एक अलग बाइंडिंग बनाई गई है।
self._numberButtons[i].clicked.connect(lambda checked, i=i: self._number(i))
वैकल्पिक रूप से, functools.partial को एक विशेष फ़ंक्शन बनाने के लिए नियोजित किया जा सकता है जो 'i' को बांधता है प्रत्येक बटन से जुड़ा विशिष्ट मान।
self._numberButtons[i].clicked.connect(partial(self._number, i))
ये संशोधन गारंटी देते हैं कि प्रत्येक कॉलबैक फ़ंक्शन सही मान कैप्चर करता है 'i' का, बटन क्लिक पर उचित प्रतिक्रियाएँ सक्षम करना।
अस्वीकरण: उपलब्ध कराए गए सभी संसाधन आंशिक रूप से इंटरनेट से हैं। यदि आपके कॉपीराइट या अन्य अधिकारों और हितों का कोई उल्लंघन होता है, तो कृपया विस्तृत कारण बताएं और कॉपीराइट या अधिकारों और हितों का प्रमाण प्रदान करें और फिर इसे ईमेल पर भेजें: [email protected] हम इसे आपके लिए यथाशीघ्र संभालेंगे।
Copyright© 2022 湘ICP备2022001581号-3