في 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" باستمرار، بغض النظر عن الزر الذي تم الضغط عليه. يتضمن فهم السبب وراء هذا السلوك استكشاف تعقيدات قواعد تحديد النطاق في بايثون.
في بايثون، يتم تحديد نطاق المتغير بواسطة أقرب دالة تضمينية. في هذا المثال، تم تعريف كل من دالة lambda والدالة '_number' ضمن الدالة '__init__'. نظرًا لأن الحلقة تعين نفس القيمة ('9') إلى 'i' لكل تكرار، فإن دالة lambda تلتقط دائمًا القيمة الأخيرة المخصصة لـ 'i' داخل الدالة '__init__'، وهي '9'.
لحل هذه المشكلة، تتمثل إحدى الطرق في تمرير "i" كوسيطة كلمة رئيسية ذات قيمة افتراضية داخل دالة lambda، مما يضمن إنشاء ربط منفصل لـ "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