web-dev-qa-db-ja.com

python:PyCharmとPyQt5を使用すると、プロセスが終了コード1で終了しました

3つのPython(3.4.3)スクリプトがあります。それらの1つは、PyQt5によって生成された.uiファイルを制御するためのものです。 GUIプログラムを実行すると、すべてのデータとすべてが受け入れられ、InputDialogの[OK]ボタンを押すと、ウィンドウが閉じてコンソールが表示されます。

Process finished with exit code 1

同じコードをPython IDLEで実行すると、次のように表示されます。

<<<<<<RESTART>>>>>>

これは、Visual Studioで同じPython(3.4.3または2.7)コードを使用した場合には起こりませんでした。その理由は何でしょうか?

以下は、.uiファイルを制御するpythonファイルのコードです。

import sys
from PyQt5 import QtCore, QtGui, uic, QtWidgets
from Email import encrypt_email
from Email import decrypt_email
from Email import newuser

qtCreatorFile = "rsegui.ui" # Enter file here.

Ui_MainWindow, QtBaseClass = uic.loadUiType(qtCreatorFile)

class MyApp(QtWidgets.QMainWindow, Ui_MainWindow):
    def __init__(self):
        QtWidgets.QMainWindow.__init__(self)
        Ui_MainWindow.__init__(self)
        self.setupUi(self)
        user, ok = QtWidgets.QInputDialog.getText(self, 'New User', 
    'Are you a new user?')
        user=str(user)
        if user in "YESYesyesYy":
            email, ok = QtWidgets.QInputDialog.getText(self, 'New User', 
    'Enter Your Email ID:')
            email1=str(email)
            self.sender.setText(email)
            newuser(email1)

    self.encrypt_and_send.clicked.connect(self.EncryptEmail)
    self.decrypt.clicked.connect(self.DecryptEmail)
    self.clear.clicked.connect(self.ClearEncrypt)
    self.clear_2.clicked.connect(self.ClearDecrypt)
    self.sender.setPlaceholderText("Your Email ID")
    self.receiver.setPlaceholderText("Receivers, Separate them by ';'")
    self.subject.setPlaceholderText("Enter Subject")
    self.message.setPlaceholderText("Enter Message")
    self.sender_2.setPlaceholderText("Your Email ID")
    self.message_2.setPlaceholderText("Encrypted Text")



    def EncryptEmail(self):
       sender = str(self.sender.text())
       receiver = str(self.receiver.text())
       receivers = receiver.split(';')
       subject = str(self.subject.text())
       message = str(self.message.text())
       password, ok = QtWidgets.QInputDialog.getText(self, 'Password', 
'Enter your password:',QtWidgets.QLineEdit.Password)
       encrypt_email(sender,receivers,subject,message,password)

    def DecryptEmail(self):
       email = str(self.sender_2.text())
       message = str(self.message_2.text())
       self.decrypted.setText(decrypt_email(email,message))

    def ClearDecrypt(self):
       self.sender_2.clear()
       self.message_2.clear()

    def ClearEncrypt(self):
       self.sender.clear()
       self.message.clear()
       self.receiver.clear()
       self.subject.clear()

if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    window = MyApp()
    window.show()
    sys.exit(app.exec_())
8
daipayan

私は同じ問題に対処しましたが、答えは2つあります。

  1. クラッシュする理由はいくつでも考えられます。これはおそらくプログラミングのバグ、存在しない関数の呼び出し、レイアウトの代わりにウィジェットを渡すことなどです。しかし、有用な出力が得られないため、犯人を探す場所がわかりません。これは次の原因で発生します:
  2. PyQTは例外を発生させてキャッチしますが、渡しません。代わりに、例外がキャッチされたことを示すために、ステータス1で終了します。

例外をキャッチするには、sys例外ハンドラーを上書きする必要があります。

# Back up the reference to the exceptionhook
sys._excepthook = sys.excepthook

def my_exception_hook(exctype, value, traceback):
    # Print the error and traceback
    print(exctype, value, traceback)
    # Call the normal Exception hook after
    sys._excepthook(exctype, value, traceback)
    sys.exit(1)

# Set the exception hook to our wrapping function
sys.excepthook = my_exception_hook

次に、実行コードで、それをtry/catchでラップします。

try:
    sys.exit(app.exec_())
except:
    print("Exiting")
19
IronSean

self.sender.setText(email)を使用しました

「送信者」はQObjectの関数内の名前であり、setText属性がないため、問題がある可能性があるため、これはおそらく私の問題の原因です。

具体的にはウィジェットを呼び出し、それにウィジェットを設定する必要があります。これには、レイアウト作成者のpyファイルのインスタンスを使用できます。

これを使用しようとしたときに同じ問題が発生しましたself.ui.lineEdit().text()ここでの問題は、-> lineEdit関数を呼び出すことでしたが、1つの属性を使用する必要がありました。

0
Tuhin Mitra