2012-03-12 11 views
6

Uso Qt + PyQt para desarrollar. Mi aplicación es muy grande (20 MB de código fuente). Incluye muchos menús y widgets diferentes. Muy a menudo cambio solo 1 cadena en el método en algún widget. Pero para verificar los cambios, apago mi aplicación, la reinicio, voy al menú1 -> menú2 .... y solo después de este paso puedo verificar los cambios.Cómo depurar aplicaciones PyQt sin relanzar?

¿Cómo puedo volver a cargar los métodos para una sola clase/widget? Sin una aplicación completa cerrada/abierta?

+2

Buena pregunta. Pregunté algo similar, aunque mucho más general: http://stackoverflow.com/questions/9519384/editing-programs-while-they-are-running-how. – gdw2

+0

Hace algún tiempo intenté usar el módulo ['reimport'] (http://code.google.com/p/reimport/) y escribí algunas soluciones para PySide http://pastebin.com/VN0JPDfC (PyQt debería trabajar también). Funcionó, pero a veces plantea excepciones impredecibles. Estoy de acuerdo con @jdi, esa prueba es la mejor manera. – reclosedev

Respuesta

3

Mi respuesta general a esto sería no, no es posible de una manera directa. El problema principal es que cuando inicias tu aplicación, carga todo en la memoria, y tus clases tienen sus métodos vinculados, etc. Así que para actualizar, digamos, los valores que cambiaste de un método de una clase, tendrías que destruir esa clase (o artilugio) y recrearlo bajo la fuente actualizada (que también mataría a los niños).

Su mal aspecto, pero sería algo como esto:

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

Una vez más, creo que este enfoque es problemático y difícil de tratar ya que hay que destruir y volver a crear el widget. Se producen más problemas cuando partes de su aplicación tienen señales vinculadas a las ranuras de este widget que se está actualizando. También debe volver a cargar sus módulos y volver a vincular sus señales. Se convierte en una gran situación de árbol de dependencia. Es bastante difícil hacer con el script python estándar, y mucho menos tratar de hacerlo con algo mucho más persistente y dinámico como el framework PyQt.

Básicamente, no confíe en esta capacidad. Es mejor que tal vez setting up something with QTest para simular sus tareas repetitivas.

Cuestiones relacionadas