我使用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