web-dev-qa-db-fra.com

python: processus terminé avec le code de sortie 1 lors de l'utilisation de PyCharm et PyQt5

J'ai trois scripts Python (3.4.3). L'un d'eux est pour contrôler le fichier .ui généré par PyQt5. Lorsque j'exécute le programme GUI, il accepte toutes les données et tout et lorsque j'appuie sur le bouton OK d'un InputDialog, la fenêtre se ferme et la console s'affiche.

Process finished with exit code 1

Lorsque j'exécute le même code sur Python IDLE, cela montre:

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

Cela ne s'est jamais produit lorsque j'ai utilisé ce même code Python (3.4.3 ou 2.7) sur Visual Studio. Quelle pourrait être la raison?

Voici le code du fichier python contrôlant le fichier .ui.

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

J'ai traité le même problème et la réponse est double:

  1. La raison pour laquelle il se bloque pourrait être un certain nombre de choses. C'est probablement un bug de programmation, appeler une fonction qui n'existe pas, passer un widget au lieu d'une mise en page, etc. Mais comme vous n'obtenez pas de sortie utile, vous ne savez pas où chercher le coupable. Cela est dû à:
  2. PyQT lève et intercepte des exceptions, mais ne les transmet pas. Au lieu de cela, il se termine avec un état de 1 pour indiquer qu'une exception a été interceptée.

Pour intercepter les exceptions, vous devez remplacer le gestionnaire d'exceptions 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

Ensuite, dans votre code d'exécution, enveloppez-le dans un try/catch.

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

Vous avez utilisé self.sender.setText(email)

À mon avis, cela cause probablement le problème car, "expéditeur" est le nom dans la fonction de QObject et il n'a pas d'attribut setText, donc il peut y avoir le problème.

Vous devez appeler spécifiquement le widget et y définir Text. Pour cela, vous pouvez utiliser des instances du fichier py du créateur de mise en page.

J'ai eu le même problème lorsque j'essayais d'utiliser cette self.ui.lineEdit().text() Ici, le problème était -> J'appelais la fonction lineEdit, alors que je devais utiliser c'est un attribut.

0
Tuhin Mitra