I am creating a desktop app using PyQt5 and QtDesginer. I have a login page connected to a database, and the user is asked to enter username and password. In the designer, I created a window that opens a certain link. The following code is running. But when inserting it into the second code it gives Process finished with exit code -1073740791 (0xC0000409).
from PyQt5.QtWidgets import QApplication, QWidget
from PyQt5 import uic
from PyQt5.QtCore import QUrl
from PyQt5.QtWebEngineWidgets import QWebEngineView
import sys
class UI(QWidget):
def __init__(self):
super().__init__()
uic.loadUi("website.ui", self)
self.show()
app = QApplication(sys.argv)
window = UI()
app.exec_()
from PyQt5 import QtCore, QtGui, QtWidgets
import mysql.connector as mc
from PyQt5.QtWidgets import QDialog
class Ui_Form(object):
def setupUi(self, Form):
Form.setObjectName("Form")
Form.resize(500, 193)
self.verticalLayout_2 = QtWidgets.QVBoxLayout(Form)
self.verticalLayout_2.setObjectName("verticalLayout_2")
self.horizontalLayout = QtWidgets.QHBoxLayout()
self.horizontalLayout.setObjectName("horizontalLayout")
self.label = QtWidgets.QLabel(Form)
self.label.setObjectName("label")
self.horizontalLayout.addWidget(self.label)
self.lineEditEmail = QtWidgets.QLineEdit(Form)
self.lineEditEmail.setObjectName("lineEditEmail")
self.horizontalLayout.addWidget(self.lineEditEmail)
self.verticalLayout_2.addLayout(self.horizontalLayout)
self.horizontalLayout_2 = QtWidgets.QHBoxLayout()
self.horizontalLayout_2.setObjectName("horizontalLayout_2")
self.label_2 = QtWidgets.QLabel(Form)
self.label_2.setObjectName("label_2")
self.horizontalLayout_2.addWidget(self.label_2)
self.lineEditPassword = QtWidgets.QLineEdit(Form)
self.lineEditPassword.setEchoMode(QtWidgets.QLineEdit.Password)
self.lineEditPassword.setObjectName("lineEditPassword")
self.horizontalLayout_2.addWidget(self.lineEditPassword)
self.verticalLayout_2.addLayout(self.horizontalLayout_2)
spacerItem = QtWidgets.QSpacerItem(20, 40,
QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
self.verticalLayout_2.addItem(spacerItem)
self.verticalLayout = QtWidgets.QVBoxLayout()
self.verticalLayout.setObjectName("verticalLayout")
self.pushButton = QtWidgets.QPushButton(Form)
self.pushButton.setObjectName("pushButton")
# this is the signal that we have already connected
self.pushButton.clicked.connect(self.login)
self.verticalLayout.addWidget(self.pushButton)
self.labelResult = QtWidgets.QLabel(Form)
font = QtGui.QFont()
font.setPointSize(14)
font.setBold(True)
font.setWeight(75)
self.labelResult.setFont(font)
self.labelResult.setText("")
self.labelResult.setObjectName("labelResult")
self.verticalLayout.addWidget(self.labelResult)
self.verticalLayout_2.addLayout(self.verticalLayout)
self.retranslateUi(Form)
QtCore.QMetaObject.connectSlotsByName(Form)
def login(self):
try:
email = self.lineEditEmail.text()
password = self.lineEditPassword.text()
mydb = mc.connect(
host="localhost",
user="root",
password="",
database="program"
)
mycursor = mydb.cursor()
query = "SELECT username,password from user where username " \
"like '" + email + "'and password like '" \
+ password + "'"
mycursor.execute(query)
result = mycursor.fetchone()
if result == None:
self.labelResult.setText("Incorrect email or password")
else:
self.labelResult.setText("You are logged in")
import Load_exam
except mc.Error as e:
self.labelResult.setText("Error")
def retranslateUi(self, Form):
_translate = QtCore.QCoreApplication.translate
Form.setWindowTitle(_translate("Form", "Form"))
self.label.setText(_translate("Form", "Email:"))
self.label_2.setText(_translate("Form", "Password:"))
self.pushButton.setText(_translate("Form", "Login"))
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
Form = QtWidgets.QWidget()
ui = Ui_Form()
ui.setupUi(Form)
Form.show()
sys.exit(app.exec_())
The source of the problem mostly resides in the fact that only one and unique QApplication instance should ever exist for each process.
When you import Load_exam
a QApplication instance already exists and is being executed, and that scipt will try to execute the last three lines (since there's no if __name__ == '__main__'
check), hence the crash.
Before providing the solution, consider the following two aspects:
__name__
check;pyuic
is considered bad practice and should never, ever be done unless you really know what you're doing (and if you do know, you will probably not do it); those files are inteded to be exclusively imported, as explained in the official guidelines about using Designer;With the above points in mind, recreate the ui for Ui_Form
with pyuic (the following assumes the generated file is named loginForm.py
), and create a new script like this:
from PyQt5 import QtCore, QtGui, QtWidgets, uic
from loginForm import Ui_Form
import mysql.connector as mc
class BrowserWindow(QtWidgets.QWidget):
def __init__(self):
super().__init__()
uic.loadUi("website.ui", self)
class LoginWindow(QtWidgets.QWidget, Ui_Form):
def __init__(self):
super().__init__()
self.setupUi(self)
self.pushButton.clicked.connect(self.login)
def login(self):
try:
email = self.lineEditEmail.text()
password = self.lineEditPassword.text()
mydb = mc.connect(
host="localhost",
user="root",
password="",
database="program"
)
mycursor = mydb.cursor()
query = "SELECT username,password from user where username " \
"like '" + email + "'and password like '" \
+ password + "'"
mycursor.execute(query)
result = mycursor.fetchone()
if result == None:
self.labelResult.setText("Incorrect email or password")
else:
self.labelResult.setText("You are logged in")
self.showBrowser()
except mc.Error as e:
self.labelResult.setText("Error")
def showBrowser(self):
self.browser = BrowserWindow()
self.browser.show()
if __name__ == '__main__':
import sys
app = QtWidgets.QApplication(sys.argv)
loginWindow = LoginWindow()
loginWindow.show()
sys.exit(app.exec_())
Since you're already using uic
for the browser window, you can just skip the pyuic
part, and just use the same on the login window as well:
class LoginWindow(QtWidgets.QWidget):
def __init__(self):
super().__init__()
uic.loadUi('loginForm.ui', self)
self.pushButton.clicked.connect(self.login)
# ...