python:使用PyCharm和PyQt5时,进程以退出代码1结束

时间:2020-12-31 22:04:17

I have three Python(3.4.3) scripts. One of them is for controlling the .ui file generated by PyQt5. When I run the GUI program it accepts all the data and everything and when I press the OK button on an InputDialog the window closes and the console displays.

我有三个Python(3.4.3)脚本。其中一个是用于控制PyQt5生成的.ui文件。当我运行GUI程序时,它接受所有数据和所有内容,当我按下InputDialog上的OK按钮时,窗口关闭,控制台显示。

Process finished with exit code 1

进程以退出代码1结束

When I run the same code on Python IDLE, it shows:

当我在Python IDLE上运行相同的代码时,它显示:

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

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

This never happenned when I used this same Python(3.4.3 or 2.7) code on Visual Studio. What could be the reason?

当我在Visual Studio上使用相同的Python(3.4.3或2.7)代码时,这种情况从未发生过。可能是什么原因?

Here is the code of the python file controlling the .ui file.

这是控制.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_())

1 个解决方案

#1


14  

I have dealt with the same problem, and the answer is twofold:

我处理过同样的问题,答案是双重的:

  1. The reason it's crashing could be any number of things. It's probably a programming bug, calling a function that doesn't exist, passing a widget instead of a layout, etc. But since you're not getting useful output you don't know where to look for the culprit. This is caused by:
  2. 崩溃的原因可能是任何事情。这可能是一个编程错误,调用一个不存在的函数,传递一个小部件而不是一个布局等等。但是由于你没有得到有用的输出,你不知道在哪里寻找罪魁祸首。这是由:
  3. PyQT raises and catches exceptions, but doesn't pass them along. Instead it just exits with a status of 1 to show an exception was caught.
  4. PyQT引发并捕获异常,但不会传递它们。相反,它只是退出状态为1以显示异常被捕获。

To catch the exceptions, you need to overwrite the sys exception handler:

要捕获异常,您需要覆盖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

Then in your execution code, wrap it in a try/catch.

然后在执行代码中,将其包装在try / catch中。

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

#1


14  

I have dealt with the same problem, and the answer is twofold:

我处理过同样的问题,答案是双重的:

  1. The reason it's crashing could be any number of things. It's probably a programming bug, calling a function that doesn't exist, passing a widget instead of a layout, etc. But since you're not getting useful output you don't know where to look for the culprit. This is caused by:
  2. 崩溃的原因可能是任何事情。这可能是一个编程错误,调用一个不存在的函数,传递一个小部件而不是一个布局等等。但是由于你没有得到有用的输出,你不知道在哪里寻找罪魁祸首。这是由:
  3. PyQT raises and catches exceptions, but doesn't pass them along. Instead it just exits with a status of 1 to show an exception was caught.
  4. PyQT引发并捕获异常,但不会传递它们。相反,它只是退出状态为1以显示异常被捕获。

To catch the exceptions, you need to overwrite the sys exception handler:

要捕获异常,您需要覆盖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

Then in your execution code, wrap it in a try/catch.

然后在执行代码中,将其包装在try / catch中。

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