python:使用 PyCharm 和 PyQt5 时,进程以退出代码 1 结束
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/34363552/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
python: Process finished with exit code 1 when using PyCharm and PyQt5
提问by daipayan
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
Process finished with exit code 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_())
回答by IronSean
I have dealt with the same problem, and the answer is twofold:
我处理过同样的问题,答案是双重的:
- 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:
- 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.
- 它崩溃的原因可能有很多。这可能是一个编程错误,调用了一个不存在的函数,传递了一个小部件而不是布局等。但是由于您没有得到有用的输出,您不知道去哪里寻找罪魁祸首。这是由以下原因引起的:
- 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")
回答by Tuhin Mitra
You have used self.sender.setText(email)
你用过 self.sender.setText(email)
This is probably causing the problem in my opinion because, "sender" is the name in QObject's function and it does not have any setText attribute, so there may be the problem.
在我看来,这可能是导致问题的原因,因为“sender”是 QObject 函数中的名称,并且它没有任何 setText 属性,因此可能存在问题。
You have to specifically call the widget and setText to it. For this, you can use instances of the py file of the layout creator.
您必须专门调用小部件和 setText 到它。为此,您可以使用布局创建者的 py 文件实例。
I had the same issue when I was trying to use this self.ui.lineEdit().text()
Here, the problem was -> I was calling the lineEdit function, whereas I had to use it's one attribute.
当我尝试使用它时,我遇到了同样的问题self.ui.lineEdit().text()
,问题是 -> 我正在调用 lineEdit 函数,而我不得不使用它的一个属性。