Почему возникает ошибка: "Process finished with exit code -1073740791 (0xC0000409)"?

Почему при попытке открытия окна регистрации программа закрывается и пишет "Process finished with exit code -1073740791 (0xC0000409)"?

При попытке открытия окна для вывода ошибки регистрации программа закрывается и пишет:

Process finished with exit code -1073740791 (0xC0000409)

Оставлю ссылку на репозиторий, так будет полегче, так как там несколько файлов.


Ответы (2 шт):

Автор решения: Sergey

Используйте отладчик для поиска места, где программа завершается, и анализируйте стек вызовов, чтобы определить проблемное место в коде.

→ Ссылка
Автор решения: S. Nick

Я не менял вашу логику, хотя со временем вы сами ее поменяете.
Я прокомментировал все изменения, которые внес в ваш код.
Обратите внимание что в моем примере поменяно 'db/db.sqlite' на 'db/db.db', потому что мне так удобнее.

Попробуйте, если что-то не не понятно - спросите.


Update:

Я забыл написать еще раз, что для того чтобы получать реальную ошибку,
необходимо запускать приложение в терминале/консоли/CMD


main.py

import sys
import random
from PyQt5 import uic, QtCore, QtGui, QtWidgets

#import check_db
#from check_db import *
from check_db import CheckThread   # !!! правильно так, надо видеть что вы импортируете


class AppMain(QtWidgets.QWidget):  # + добавил, чтобы показать окно после авторизации                      
    def __init__(self, parent=None):
        super().__init__(parent)
        uic.loadUi('ui/main.ui', self)
        
        
class Loading(QtWidgets.QWidget):
    def __init__(self, *args):
        super().__init__()
        self.initUI()

    def initUI(self):
        self.setFixedSize(800, 600)                                       # ?
        self.label_animation = QtWidgets.QLabel(self)

        self.movie = QtGui.QMovie('logo/loader.gif')
        self.label_animation.setMovie(self.movie)

        timer = QtCore.QTimer(self)
        self.startAnimation()
        timer.singleShot(4900 + random.randrange(500), self.stopAnimation)

        self.show()

    def startAnimation(self):
        self.movie.start()

    def stopAnimation(self):
        self.appMain = AppMain()                                          # +++
        self.appMain.show()                                               # +++
        
        self.movie.stop()
        self.close()
        
# ----------------> vvvvvvvvvvv <---------------------------- и все
class App(QtWidgets.QMainWindow):                            #, QtWidgets.QWidget):
    def __init__(self, parent=None):
        super().__init__(parent)
        uic.loadUi('ui/vhod.ui', self)
        
        self.loading_flag = False               # +++ флаг открытия окна после авторизации
        
        self.initUI()
        self.fio.setFocus()                                               # +++ 

    def initUI(self):
        self.setWindowTitle('Вход / Регестрация ?')
        self.setFixedSize(750, 550)                      # ? учите менеджеры компоновки

        self.reg_2.clicked.connect(self.registration)
        self.vhod_2.clicked.connect(self.auth)
# ? 
        self.check_db = CheckThread(self)
        self.check_db.mysignal.connect(self.on_signal)                    # +++ 
        
    def on_signal(self, text):                                            # +++ 
        if text == 'Ok':                                                  # ... 
            self.loading_flag = True
        else:
            self.loading_flag = False
        
    ''' !!!!!!!!!!!!!!!!!!!!!     я не знаю что это        !!!!!!!!!!!!!!!!!!
    def reg_check(funct):
        def wraper(self):
            if (self.fio != []) and ('@' in self.email) and (self.pas != ''):
                pass
            else:
                check_db.Osh('Не правильно введены данные')
                check_db.Osh.show()
        return wraper

    # Обработчик сигнала
    def signal_handler(self, value):
        QtWidgets.QMessageBox.about(self, 'Оповещение', value)
    '''
    
    def registration(self):
        fio = self.fio.text()
        email = self.email.text()
        pas = self.pas.text()
        if not email or not pas or not fio:                               # +++
            msg = QtWidgets.QMessageBox.information(                      # +++
                self, 
                'Внимание', 
                'Заполните все поля ввода.')
            return                                                        # +++
        self.check_db.thr_reg(fio, email, pas)

    def auth(self):
        email = self.email_2.text()
        pas = self.pas_2.text()
        if not email or not pas:                                          # +++
            msg = QtWidgets.QMessageBox.information(                      # ...
                self, 
                'Внимание', 
                'Заполните все поля ввода.')
            return                                                        # +++
        
        self.check_db.thr_login(email, pas)
        
        if self.loading_flag:                                             # +++
            self.loading = Loading(self)
            self.loading.show()
            self.close()                                                  # +++
        else:                                                             # +++
            msg = QtWidgets.QMessageBox.information(                      # +++
                self, 
                'Внимание', 
                'Что-то пошло не так.')
        

if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    app.setWindowIcon(QtGui.QIcon('logo/logo.png'))
    ex = App()
# ???  widget = QtWidgets.QWidget()                                       # ???
    ex.show()
    try:
        sys.exit(app.exec())
    except SystemExit:
        print('Closing Window...')

check_db.py

from PyQt5 import QtCore, QtWidgets                                       # +
#from db.db_handler import *
from db.db_handler import Osh, login, registr                             # !!! так


# ?class CheckThread(QtCore.QThread):   с чего вы решили наследоваться от QThread ???
class CheckThread(QtWidgets.QWidget):
    mysignal = QtCore.pyqtSignal(str)
    
    def __init__(self, parent=None):                                      # +++
        super(CheckThread, self).__init__(parent)                         # +++
        self.parent = parent                                              # +++

    def thr_login(self, email, passw):
        login(email, passw, self.mysignal)
 
    def thr_reg(self, fio, email, passw):
# ------------> vvvvvvvvvvv <-----------------------------------------------------
        registr(self.parent, fio, email, passw, self.mysignal)

db_handler.py

import sqlite3
from PyQt5 import uic, QtCore, QtGui, QtWidgets


# ?class Osh(QtWidgets.QWidget):
class Osh(QtWidgets.QDialog):             # !!! вы форму делали наследуясь от QDialog !!!
    def __init__(self, danget_text: str):
        super().__init__()
# ?        QtWidgets.QMainWindow.__init__(self)
        uic.loadUi('ui/osh.ui', self)
        
        self.pushButton.clicked.connect(self.close)              # +++
        self.danget_text = danget_text                           # +++
        
        self.initUI()

    def initUI(self):
        self.label.setText(self.danget_text)
# ?        self.app = App(self)
# ?        self.pushButton.clicked.connect(self.app)

def login(email, passw, signal):
    con = sqlite3.connect('db/db.db')                  #('db/db.sqlite')
    cur = con.cursor()

    # Проверка на существование аккаунта
    cur.execute(f'SELECT * FROM user WHERE email="{email}";')
    value = cur.fetchall()

    if value != [] and value[0][3] == passw:
        signal.emit('Ok')
        print('Авторизован')
    else:
        signal.emit('Неправильно введет логин или пароль')
        print('не авторизован')

    cur.close()
    con.close()

# --------> vvvvv <------------------------------------------------------------
def registr(_self, fio, email, passw, signal):
#    con = sqlite3.connect('db/db.sqlite') # мне так удобнее 
    con = sqlite3.connect('db/db.db')      # мне так удобнее                 !!!
    cur = con.cursor()

    cur.execute(f'SELECT * FROM user WHERE email="{email}";')
    value = cur.fetchall()
    print(f'def registr value : {value}') #

#    if value != []:
    if value:                                                       # !!! так правильно
        signal.emit('Аккаунт с этим email уже используется')
        print('не зареган')
# ----> vvvvv <-------------------------------------------------------------        
        _self.osh = Osh('Аккаунт с этим email уже используется')
        _self.osh.exec()
        
#    elif value == []:
    else:                                                                 # +++
        cur.execute(f"INSERT INTO user (fio, email, password) VALUES ('{fio}', '{email}', '{passw}')")
        print(f"Зарегистрирован: {_self.fio.text()}")
        _self.fio.clear()                                                 # +++
        _self.email.clear()                                               # +++
        _self.pas.clear()                                                 # +++
        _self.email_2.setFocus()                                          # +++
        
        con.commit()

    cur.close()
    con.close()

введите сюда описание изображения

введите сюда описание изображения

введите сюда описание изображения

введите сюда описание изображения

→ Ссылка