私の一般的な返信はこれには当てはまりません。それは簡単ではありません。主な問題は、アプリケーションを起動すると、すべてがメモリにロードされ、クラスにメソッドバインディングなどがあるということです。クラスのメソッドの値を変更するには、そのクラス(またはウィジェット)を破壊し、更新されたソースの下で再作成します(これも子供を殺すでしょう)。
探して、その悪いが、それはこのようなものになります。もう一度
## 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"
を、私はあなたがあなたのウィジェットを破壊し、再作成する必要があるため、このアプローチが対処する問題と困難だと思います。アプリの一部にこのウィジェットのスロットにバインドされた信号が更新されているときに、より多くの問題が発生します。また、モジュールをリロードして信号を再リンクする必要があります。それは大きな依存ツリーの状況になります。 Pythonのフレームワークのような、より永続的でダイナミックなものを使って標準的なPythonスクリプトを実行するのは難しいです。
基本的には、この機能に頼らないでください。繰り返しの仕事をシミュレートするには、おそらくsetting up something with QTestの方が良いでしょう。
出典
2012-03-13 19:21:11
jdi
良い質問です。私はもっと一般的ですが、似たようなものを尋ねました:http://stackoverflow.com/questions/9519384/editing-programs-while-theyare-running-how。 – gdw2
私は、PySide http://pastebin.com/VN0JPDfCのいくつかの回避策を書く際に、['reimport'](http://code.google.com/p/reimport/)モジュールを使用しようとしました(PyQtは仕事も)。それはうまくいったが、時には予期しない例外が発生する。私は@jdiに同意します。テストはより良い方法です。 – reclosedev