我使用Qt + PyQt进行开发。我的应用程序非常大(20 MB的源代码)。它包含许多不同的菜单和小部件。非常有趣的是,我在一些小部件中仅更改了方法上的一个字符串。但为了检查更改,我关闭了我的应用程序,重新启动它,进入menu1 - > menu2 ...。只有在这一步之后,我才能检查更改。如何在不重新启动的情况下调试PyQt应用程序?
如何重新加载只有一个类/小部件的方法?没有关闭/打开整个应用程序?
我使用Qt + PyQt进行开发。我的应用程序非常大(20 MB的源代码)。它包含许多不同的菜单和小部件。非常有趣的是,我在一些小部件中仅更改了方法上的一个字符串。但为了检查更改,我关闭了我的应用程序,重新启动它,进入menu1 - > menu2 ...。只有在这一步之后,我才能检查更改。如何在不重新启动的情况下调试PyQt应用程序?
如何重新加载只有一个类/小部件的方法?没有关闭/打开整个应用程序?
我对此的一般答复是否定的,它不可能以直接的方式进行。主要的问题是,当你启动你的应用程序时,它将所有内容加载到内存中,并且你的类有方法绑定等等。所以为了更新说,你改变了一个类的方法的值,你将不得不销毁该类(或小部件)并在更新的源代码下重新创建它(这也会杀死子项)。
它难看,但它会是这个样子:
## 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"
同样,我认为这种做法是有问题的,很难对付,因为你必须摧毁并重新创建你的widget。当部分应用程序将信号绑定到正在更新的此小部件的插槽时,会出现更多问题。然后您也必须重新加载模块并重新链接它们的信号。它成为一个很大的依赖树情况。它很难用标准的Python脚本来处理,更不用说像PyQt框架那样使用更持久和动态的方法来完成它了。
基本上,不要依赖这个能力。你最好也许setting up something with QTest模拟你的重复性任务。
好问题。我问了类似的东西,虽然更一般:http://stackoverflow.com/questions/9519384/editing-programs-while-they-are-running-how。 – gdw2 2012-03-13 19:30:49
前段时间我试着用['reimport'](http://code.google.com/p/reimport/)模块为PySide编写一些解决方法http://pastebin.com/VN0JPDfC(PyQt should工作也是如此)。它有效,但有时会引发不可预测的例外。我同意@jdi的说法,那就是测试是更好的方法。 – reclosedev 2012-03-20 17:45:32