मैं एक pyqt5 एप्लिकेशन को डीबग करने के लिए स्पाइडर3 अंतर्निर्मित डीबगर का उपयोग करने की सख्त कोशिश कर रहा हूं। ऐसा लगता है कि जैसे ही क्यूटी ऐप चल रहा है ब्रेकप्वाइंट अब हिट नहीं होते हैं। स्लॉट के अंदर होने वाले अपवादों के साथ मुझे एक ही समस्या थी जो किसी भी तरह डिफ़ॉल्ट रूप से कंसोल के रास्ते में खो जाती है। उसके लिए एक वर्कअराउंड है जो ज्यादातर समय काम करता है। हालांकि, डिबगिंग काफी असंभव लगता है।

कोड जो समस्या का प्रदर्शन करना चाहिए:

from PyQt5 import QtCore, QtWidgets
from PyQt5.QtWidgets import QApplication, QMainWindow

import sys

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(800, 600)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton.setGeometry(QtCore.QRect(240, 190, 75, 23))
        self.pushButton.setObjectName("pushButton")
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 21))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        self.pushButton.clicked.connect(MainWindow.clicked_slot)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.pushButton.setText(_translate("MainWindow", "PushButton"))

class main_app_class(QMainWindow):
    def __init__(self):
        super().__init__()
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)
        self.show()

    def clicked_slot(self):
        """Breakpoints in here are never hit"""
        print("Hit me!")

if __name__ == "__main__":
    if not QApplication.instance():
        app = QApplication(sys.argv)
    else:
        app = QApplication.instance() 

    main_app = main_app_class()
    main_app.show()

    app.exec_()

किसी भी मदद या संकेत के लिए बहुत बहुत धन्यवाद,

फेलिक्स

2
felixg 10 सितंबर 2018, 16:31

1 उत्तर

सबसे बढ़िया उत्तर

(यहां स्पाइडर मेंटेनर) PyQt स्लॉट में स्पाइडर के साथ डिबगिंग दर्ज करने के लिए आपको दो चीजें करने की आवश्यकता है:

  1. जब वे चल रहे हों तो कंसोल को ब्लॉक करने के लिए ग्राफिकल एप्लिकेशन बनाएं। उसके लिए आपको जाना होगा

    Tools > Preferences > IPython Console > Graphics

    और Activate support नाम के विकल्प को निष्क्रिय कर दें।

  2. आपको अपनी clicked_slot पद्धति को इस प्रकार संशोधित करने की आवश्यकता है

    def clicked_slot(self):
        import pdb; pdb.set_trace()
        print("Hit me!")
    

    कथन import pdb; pdb.set_trace() डिबगिंग दर्ज करने का एक प्रोग्रामेटिक तरीका है। इसलिए, जैसे ही पायथन उस निर्देश का सामना करता है, यह स्वचालित रूप से डिबगिंग में प्रवेश करेगा। और ऐसा होता है, आपके मामले में, जब आप Push button दबाते हैं

  3. आपको अपने एप्लिकेशन को F5 या Run > Run के साथ चलाने (और डीबग नहीं) करने की आवश्यकता है।


नोट: इस दृष्टिकोण की दो महत्वपूर्ण सीमाएँ हैं:

  1. डिबगिंग दर्ज करते ही आपका एप्लिकेशन फ्रीज हो जाएगा। इसलिए आप इसके साथ आगे इंटरैक्ट नहीं कर पाएंगे।
  2. डिबगिंग से बाहर निकलने का एकमात्र तरीका आपके ऐप द्वारा बनाई गई विंडो को बंद करना है।
1
Carlos Cordoba 12 सितंबर 2018, 20:03