2012-03-12 179 views
6

我使用Qt + PyQt進行開發。我的應用程序非常大(20 MB的源代碼)。它包含許多不同的菜單和小部件。非常有趣的是,我在一些小部件中僅更改了方法上的一個字符串。但爲了檢查更改,我關閉了我的應用程序,重新啓動它,進入menu1 - > menu2 ...。只有在這一步之後,我才能檢查更改。如何在不重新啓動的情況下調試PyQt應用程序?

如何重新加載只有一個類/小部件的方法?沒有關閉/打開整個應用程序?

+2

好問題。我問了類似的東西,雖然更一般:http://stackoverflow.com/questions/9519384/editing-programs-while-they-are-running-how。 – gdw2 2012-03-13 19:30:49

+0

前段時間我試着用['reimport'](http://code.google.com/p/reimport/)模塊爲PySide編寫一些解決方法http://pastebin.com/VN0JPDfC(PyQt should工作也是如此)。它有效,但有時會引發不可預測的例外。我同意@jdi的說法,那就是測試是更好的方法。 – reclosedev 2012-03-20 17:45:32

回答

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" 

同樣,我認爲這種做法是有問題的,很難對付,因爲你必須摧毀並重新創建你的widget。當部分應用程序將信號綁定到正在更新的此小部件的插槽時,會出現更多問題。然後您也必須重新加載模塊並重新鏈接它們的信號。它成爲一個很大的依賴樹情況。它很難用標準的Python腳本來處理,更不用說像PyQt框架那樣使用更持久和動態的方法來完成它了。

基本上,不要依賴這個能力。你最好也許setting up something with QTest模擬你的重複性任務。

相關問題