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