0

pyqt4でアプリケーションを実行しspyder、終了してプロンプトQtGui.QMainWindow.close()に戻ります。spyder python interpreterただし、アプリケーションを再度実行しようとすると、runfile('C:/Python33/~/qtapp.py', wdir=r'C:/Python33/~/Appdir')ウィンドウは表示されません。pyqt4アプリを再度実行する前に、Python インタープリター ウィンドウをシャットダウンし、新しいウィンドウを開く必要があります。これは私がそうであることを私に示唆しています。

  1. アプリを正しくシャットダウンしない
  2. アプリが正しく実行されていない

同じプロンプトからアプリを実行できるようにしたいのですがpyqt4、これにより開発時間が短縮されます

コード例は次のとおりです。

from PyQt4 import QtCore, QtGui, Qwt5
import sys

try:
    _fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
    def _fromUtf8(s):
        return s
try:
    _encoding = QtGui.QApplication.UnicodeUTF8
    def _translate(context, text, disambig):
        return QtGui.QApplication.translate(context, text, disambig, _encoding)
except AttributeError:
    def _translate(context, text, disambig):
        return QtGui.QApplication.translate(context, text, disambig)


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(200, 200)
        self.checkBox = QtGui.QCheckBox(MainWindow)
        self.checkBox.setGeometry(QtCore.QRect(100, 100, 70, 17))
        self.checkBox.setObjectName("checkBox")


        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        MainWindow.setWindowTitle(QtGui.QApplication.translate("MainWindow", "Dialog",None, QtGui.QApplication.UnicodeUTF8))
        self.checkBox.setText(QtGui.QApplication.translate("MainWindow", "CheckBox", None, QtGui.QApplication.UnicodeUTF8))



class MainWindow(QtGui.QMainWindow,Ui_MainWindow):

    def __init__(self):
        super(MainWindow, self).__init__()     
        self.setupUi(self)


app = QtGui.QApplication(sys.argv)
form = MainWindow()
form.show()
app.exec_()

ウィンドウが表示されたら実行した後、再度実行した後、ウィンドウは表示されません。私のバージョン情報は次のとおりです。

Python 3.3.2 (v3.3.2:d047928ae3f6、2013 年 5 月 16 日、00:03:43) [MSC v.1600 32 ビット (Intel)] win32 で「help」、「copyright」、「credits」、または「license」と入力詳細については。

インポートされた NumPy 1.7.1、SciPy 0.12.0、Matplotlib 1.3.0 + guidata 1.6.1、guiqwt 2.3.1 詳細については、「scientific」と入力してください。

4

4 に答える 4

1

私は同じ問題を経験しましたが、本当の解決策は見つかりませんでした。ただし、問題を解決する回避策を見つけました。また、Eelco van Vliet の回答のサンプル コードでも機能します。

問題は、プログラムの呼び出し間で破棄されないグローバル QApplication が Python インタープリターに格納されていることです。実行の開始時に新しい QApplication をインスタンス化する代わりに、これが存在するかどうかを確認し、存在する場合は、新しいものを作成するのではなく、既存のものを使用します。

if __name__=="__main__":
    if QCoreApplication.instance() != None:
        app = QCoreApplication.instance()
    else:
        app = QApplication(sys.argv)
    form = Form()
    form.show()
    app.exec_()
于 2015-03-23T16:39:19.160 に答える
1

これは実際には、IPython カーネルとその PyQt との相互作用に問題があるようです。基本的に、IPython は Qt インスタンスにハングアップしているようで、再インスタンス化する前にクリアする必要があります。これは、Qt インスタンスを保持する変数を別のものに再バインドすることで、非常に簡単に実行できます。

app = 0
app = QtGui.QApplication([])
...
sys.exit(app.exec_())

これはhereから派生したもので、 here から派生したものです (より完全に説明されています) 。

于 2017-01-24T14:30:34.217 に答える
0

私も同じ問題を抱えていました。以下の簡単な例では、問題を再現しています (python 3.4 を使用)。

これを初めて実行すると、ウィンドウを閉じて 2 回目の実行に失敗します。spyder でリセット カーネルを使用できますが、これにより開発時間が遅くなります。

私にとってうまくいくのは、入力することです

%リセット

現在のカーネルのコマンドラインで。これにより、QtCriticalMsg、QtSystemMsg などの変数がリセットされます。その後、コードを再実行できます。

これはカーネルを再起動するよりもわずかに高速ですが、それでも面倒です。ウィンドウを閉じた後、Qt変数がメモリからクリアされないようです。終了後にプログラムからクリーンなメモリを強制する方法を誰か提案しますか? これにより、毎回リセットを入力する必要がなくなり、問題が解決する可能性があります

import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *
class Form(QDialog):

    def __init__(self, parent=None):
        super(Form, self).__init__(parent)
        self.setAttribute(Qt.WA_DeleteOnClose)

        buttonBox = QDialogButtonBox(QDialogButtonBox.Ok|
                                     QDialogButtonBox.Cancel)
        grid = QGridLayout()
        grid.addWidget(buttonBox, 4, 0, 1, 2)
        self.setLayout(grid)

        self.connect(buttonBox, SIGNAL("accepted()"),
                     self, SLOT("accept()"))
        self.connect(buttonBox, SIGNAL("rejected()"),
                     self, SLOT("reject()"))
        self.setWindowTitle("Set Number Format (Modal)")


if __name__=="__main__":
    app = QApplication(sys.argv)
    form = Form()
    form.show()
    app.exec_()
于 2015-01-31T18:01:06.723 に答える