如何在不重新启动的情况下调试PyQt应用程序?

Sky*_*Fox 6 python qt pyqt

我使用Qt + PyQt进行开发.我的应用程序非常大(20 MB的源代码).它包括许多不同的菜单和小部件.非常常见我在某个小部件中只更改了方法上的1个字符串.但是为了检查更改,我关闭了我的应用程序,重新启动它,转到menu1 - > menu2 .... 只有在这一步之后我才能检查变化.

如何只为一个类/小部件重新加载方法?没有关闭/打开整个应用程序?

jdi*_*jdi 3

我对此的一般回答是否定的,这不可能以直接的方式进行。主要问题是,当您启动应用程序时,它将所有内容加载到内存中,并且您的类绑定了它们的方法等等...因此,为了更新您更改的类方法的值,您必须销毁该类(或小部件)并在更新的源下重新创建它(这也会杀死子级)。

它看起来很糟糕,但它看起来像这样:

## 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"
Run Code Online (Sandbox Code Playgroud)

同样,我认为这种方法是有问题的并且难以处理,因为您必须销毁并重新创建您的小部件。当应用程序的某些部分将信号绑定到正在更新的小部件的插槽时,会出现更多问题。然后,您还必须重新加载它们的模块并重新链接它们的信号。它变成了一个很大的依赖树情况。使用标准 python 脚本已经够困难的了,更不用说尝试使用像 PyQt 框架这样更加持久和动态的东西了。

基本上,不要依赖这个能力。您最好使用 QTest 设置一些东西来模拟您的重复性任务。