Как отлаживать приложения PyQt без перезапуска? - PullRequest
6 голосов
/ 12 марта 2012

Я использую Qt + PyQt для разработки. Мое приложение очень-очень большое (20 МБ исходного кода). Он включает в себя много разных меню и виджетов. Очень часто я изменяю только 1 строку на метод в некотором виджете. Но для проверки изменений я выключаю свое приложение, перезапускаю его, захожу в menu1 -> menu2… и только после этого шага я могу проверить изменения.

Как я могу перезагрузить методы только для одного класса / виджета? Без закрытия / открытия всего приложения?

1 Ответ

3 голосов
/ 13 марта 2012

Мой общий ответ на это был бы нет, это невозможно в прямой форме. Основная проблема заключается в том, что когда вы запускаете ваше приложение, оно загружает все в память, и ваши классы имеют привязанные методы и т. Д. Итак, чтобы обновить, скажем, значения, которые вы изменили для метода класса, вам придется уничтожить этот класс (или виджет) и воссоздать его в обновленном источнике (который также убил бы детей).

Плохо выглядит, но выглядит примерно так:

## main.py ##

class MainWindow(QtGui.QMainWindow):

    def __init__(self, *args, **kwargs):
        super(MainWindow, self).__init__(*args, **kwargs)
        self.resize(640,480)
        self.central = widget.Widget()
        self.setCentralWidget(self.central)

        self.toolbar = QtGui.QToolBar()
        self.toolbar.addAction("Reload Entire Widget", self._reloadWidget)
        self.addToolBar(QtCore.Qt.TopToolBarArea, self.toolbar)

    def _reloadWidget(self):
        print "Reloading", widget
        reload(widget)
        self.central.deleteLater()
        self.central = widget.Widget()
        self.setCentralWidget(self.central)

## widget.py ##

class Widget(QtGui.QWidget):

    def __init__(self, *args, **kwargs):
        super(Widget, self).__init__(*args, **kwargs)
        self.layout = QtGui.QVBoxLayout(self)
        self.button = QtGui.QPushButton("Click")
        self.layout.addWidget(self.button)

        self.button.clicked.connect(self.testMethod)

    def testMethod(self):
        print "testmethod(): FOO"

Опять же, я думаю, что этот подход проблематичен и труден для решения, так как вы должны уничтожить и воссоздать свой виджет. Больше проблем возникает, когда части вашего приложения имеют сигналы, привязанные к слотам этого виджета, который обновляется. Затем вам также необходимо перезагрузить их модули и заново связать их сигналы. Это становится большой ситуацией дерева зависимостей. Это достаточно сложно сделать с помощью стандартного скрипта Python, не говоря уже о том, чтобы пытаться сделать это с помощью чего-то гораздо более стойкого и динамичного, например, инфраструктуры PyQt.

По сути, не полагайтесь на эту способность. Возможно, вам лучше настроить что-то с помощью QTest для имитации ваших повторяющихся задач.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...