2012-03-12 4 views
6

私は開発にQt + PyQtを使用します。私のアプリケーションは非常に非常に大きい(20 MBのソースコード)。それは多くの異なるメニューとウィジェットを含んでいます。非常に私はいくつかのウィジェットのメソッドで1文字列だけを変更します。しかし、変更を確認するために、私は自分のアプリケーションをオフにして、それを再起動し、menu1 - > menu2 ...に行く。このステップの後でしか変更を確認することはできません。RelaunchingせずにPyQtアプリケーションをデバッグするには?

1つのクラス/ウィジェットに対してのみメソッドをリロードできますか?閉じる/開いていないアプリケーション全体はありませんか?

+2

良い質問です。私はもっ​​と一般的ですが、似たようなものを尋ねました:http://stackoverflow.com/questions/9519384/editing-programs-while-theyare-running-how。 – gdw2

+0

私は、PySide http://pastebin.com/VN0JPDfCのいくつかの回避策を書く際に、['reimport'](http://code.google.com/p/reimport/)モジュールを使用しようとしました(PyQtは仕事も)。それはうまくいったが、時には予期しない例外が発生する。私は@jdiに同意します。テストはより良い方法です。 – reclosedev

答えて

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" 

を、私はあなたがあなたのウィジェットを破壊し、再作成する必要があるため、このアプローチが対処する問題と困難だと思います。アプリの一部にこのウィジェットのスロットにバインドされた信号が更新されているときに、より多くの問題が発生します。また、モジュールをリロードして信号を再リンクする必要があります。それは大きな依存ツリーの状況になります。 Pythonのフレームワークのような、より永続的でダイナミックなものを使って標準的なPythonスクリプトを実行するのは難しいです。

基本的には、この機能に頼らないでください。繰り返しの仕事をシミュレートするには、おそらくsetting up something with QTestの方が良いでしょう。

関連する問題