2012-03-12 17 views
6

Io uso Qt + PyQt per lo sviluppo. La mia applicazione è molto molto grande (20 MB di codice sorgente). Include molti menu e widget diversi. Molto spesso cambio solo 1 stringa sul metodo in alcuni widget. Ma per controllare le modifiche spengo la mia applicazione, la riavvia, vai a menu1 -> menu2 .... e solo dopo questo passaggio posso controllare le modifiche.Come eseguire il debug di applicazioni PyQt senza riavvio?

Come posso ricaricare i metodi per una sola classe/widget? Senza chiudere/aprire l'intera applicazione?

+2

Buona domanda. Ho chiesto qualcosa di simile, anche se molto più generale: http://stackoverflow.com/questions/9519384/editing-programs-while-they-are-running-how. – gdw2

+0

Qualche tempo fa ho provato a utilizzare il modulo ['reimport'] (http://code.google.com/p/reimport/) scrivendo alcune soluzioni alternative per PySide http://pastebin.com/VN0JPDfC (PyQt dovrebbe lavoro anche). Ha funzionato, ma a volte solleva eccezioni imprevedibili. Sono d'accordo con @jdi, che il test è il modo migliore. – reclosedev

risposta

3

La mia risposta generale a questo sarebbe no, non è possibile in modo diretto. Il problema principale è che quando avvii la tua app, carica tutto in memoria e le tue classi hanno i loro metodi vincolati, ecc ... Quindi per aggiornare dire, i valori che hai cambiato di un metodo di una classe, dovresti distruggi quella classe (o widget) e ricrearla sotto la fonte aggiornata (che ucciderebbe anche i bambini).

Il suo male guardare, ma sarebbe simile a questa:

## 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" 

Anche in questo caso, credo che questo approccio è problematico e difficile da affrontare, poiché è necessario distruggere e ricreare il widget di. Si verificano più problemi quando parti della tua app hanno dei segnali legati agli slot di questo widget in fase di aggiornamento. Dovrai quindi ricaricare i loro moduli e ricollegare i loro segnali. Diventa una grande struttura ad albero delle dipendenze. È abbastanza difficile da fare con lo script Python standard, figuriamoci provare a farlo con qualcosa di molto più persistente e dinamico come il framework PyQt.

Fondamentalmente, non fare affidamento su questa abilità. Forse stai meglio con lo setting up something with QTest per simulare le tue attività ripetitive.

Problemi correlati