PYQT ربط الطريقة خطأ عند استخدامه في حلقة التي تنشئ الحاجيات من قائمة

StackOverflow https://stackoverflow.com/questions/736651

  •  09-09-2019
  •  | 
  •  

سؤال

لدي برنامج واجهة المستخدم الرسومية،

يقوم Auto بإنشاء أزرار من قائمة الاسم، والاتصال بدالة يطبع اسمه.

ولكن عندما أقوم بتشغيل هذا البرنامج، أضغط على جميع الأزرار،

انهم جميعا يعيدون اسم الزر الأخير.

أتساءل لماذا يحدث هذا الشيء. هل أستطيع مساعدتك؟

import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *
import logging

logging.basicConfig(level=logging.DEBUG,)

class MainWindow(QWidget):
    def init(self):
        names = ('a','b','c')
        lo = QHBoxLayout(self)
        for name in names:
            button = QPushButton(name,self)
            lo.addWidget(button)
            self.connect(button,SIGNAL("clicked()"),
                         lambda :logging.debug(name))

if __name__=="__main__":
    app = QApplication(sys.argv)
    m = MainWindow();m.init();m.show()
    app.exec_() 

نتيجة مثل:

python t.py
DEBUG:root:c
DEBUG:root:c
DEBUG:root:c
هل كانت مفيدة؟

المحلول

أرى خطأ واحد على الأقل في التعليمات البرمجية الخاصة بك.

يستبدل:

 lambda :logging.debug(name)

بواسطة:

 lambda name=name: logging.debug(name)

يرى لماذا نتائج الخريطة () وفهم القائمة مختلفة؟ للتفاصيل.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top