PyQt5 не работает переход из окна в другое окно

Программа планируется большой, поэтому я решила разделить ее на несколько логический файлов с интерфейсами окон.
Проблема возникает на этапе перехода из второго окна в третье (с первым переходом мне помогли).

(Process finished with exit code -1073740791 (0xC0000409)).

1 файл Welcome_Screen.py (переход кнопкой cust_btn)

import sys
from PyQt5.uic import loadUi
from PyQt5 import QtWidgets, QtGui
from PyQt5.QtWidgets import QDialog, QApplication

from Customer_screen import CustomerScreen


class WelcomeScreen(QDialog):
    def __init__(self):
        super(WelcomeScreen, self).__init__()
        loadUi('screens/welcomescreen.ui', self)

        self.cust_btn.clicked.connect(self.go_to_CustomerData)

    def go_to_CustomerData(self):
        client = CustomerScreen(widget)  # +++ (widget)
        widget.addWidget(client)
        widget.setCurrentIndex(widget.currentIndex() + 1)


# main
if __name__ == '__main__':
    app = QApplication(sys.argv)
    app.setWindowIcon(QtGui.QIcon('im.png'))
    app.setApplicationDisplayName('Bonus Program')
    welcome = WelcomeScreen()
    widget = QtWidgets.QStackedWidget()
    widget.addWidget(welcome)
    widget.setFixedWidth(600)
    widget.setFixedHeight(475)
    widget.show()

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

2 файл Customer_Screen.py (переход кнопкой soldto_btn)

from PyQt5 import QtCore
from PyQt5.uic import loadUi
from PyQt5.Qt import *

from Soldto_screen import SoldtoScreen

class CustomerScreen(QDialog):
    def __init__(self, widget):
        super(CustomerScreen, self).__init__()
        loadUi("screens/customerscreen.ui", self)

        self.widget = widget  # +++

        self.back_btn.setIcon(QIcon('Icons/Back.png'))
        self.back_btn.setIconSize(QtCore.QSize(45, 60))
        self.back_btn.clicked.connect(self.go_Back_to_WelcomeScreen)
        self.soldto_btn.clicked.connect(self.go_to_Soldto_list)

    def go_Back_to_WelcomeScreen(self):
        self.widget.setCurrentIndex(0)


    def go_to_Soldto_list(self):
        soldto = SoldtoScreen(widget)  # +++ (widget)
        widget.addWidget(soldto)
        widget.widget.setCurrentIndex(widget.currentIndex() + 1)

3 файл Soldto_screen.py

from PyQt5 import QtWidgets, QtCore, QtGui
from PyQt5.QtSql import QSqlDatabase, QSqlTableModel, QSqlQuery
from PyQt5.uic import loadUi
from PyQt5.Qt import *


class SoldtoScreen(QDialog):
    def __init__(self, widget):  # +++ widget
        super(SoldtoScreen, self).__init__()
        loadUi("screens/soldtoscreen.ui", self)

        self.st_widget = widget  # +++

        self.back_btn.setIcon(QIcon('Icons/Back.png'))
        self.back_btn.setIconSize(QtCore.QSize(45, 60))
        self.back_btn.clicked.connect(self.go_Back_to_Customer_Screen)

    def go_Back_to_Customer_Screen(self):
        self.st_widget.setCurrentIndex(0)  # +++

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

Автор решения: S. Nick

Вы не предоставили воспроизводимый пример и это не хорошо. Я взял некоторые модули .ui по ссылки, которую вы указали в предыдущем вашем вопросе.

Обратите внимание

  • я не нашел объект soldto_btn, поэтому заменил его на объект SoldTos.
  • я поменял логику вашего приложения, потому что она становится не читаемая. Теперь у вам есть класс MainWindow, в котором дополняются все ваши окна в QStackedWidget и в дальнейшем вам надо будет только переключаться на нужное вам окно.

main.py

import sys
from PyQt5.uic import loadUi
from PyQt5 import QtWidgets, QtGui
from PyQt5.QtWidgets import QDialog, QApplication

#           -->v
#from Customer_screen import CustomerScreen
from Customer_Screen import CustomerScreen                                # !!! +++
from Soldto_screen import SoldtoScreen                                    # !!! +++


class WelcomeScreen(QDialog):
    def __init__(self, parent):                                           # +++ parent
        super(WelcomeScreen, self).__init__()
#        loadUi('screens/welcomescreen.ui', self)
        loadUi('welcomescreen.ui', self)
        
        self.parent = parent                                              # +++

        self.cust_btn.clicked.connect(self.go_to_CustomerData)

    def go_to_CustomerData(self):
#        widget.setCurrentIndex(widget.currentIndex() + 1)
        self.parent.stacked_widget.setCurrentIndex(1)                     # +++ 


# +++ vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
class MainWindow(QtWidgets.QWidget):                                 
    def __init__(self):
        super().__init__()
        
        self.stacked_widget = QtWidgets.QStackedWidget()
        
        self.welcomeScreen = WelcomeScreen(self)
        self.stacked_widget.addWidget(self.welcomeScreen)

        self.customerScreen = CustomerScreen(self)
        self.stacked_widget.addWidget(self.customerScreen)
        
        self.soldtoScreen = SoldtoScreen(self)
        self.stacked_widget.addWidget(self.soldtoScreen)

        self.stacked_widget.setCurrentIndex(0)

        self.vlayout = QtWidgets.QVBoxLayout(self)        
        self.vlayout.setContentsMargins(0, 0, 0, 0)
        self.vlayout.addWidget(self.stacked_widget)
# +++ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        

if __name__ == '__main__':
    app = QApplication(sys.argv)
    app.setWindowIcon(QtGui.QIcon('im.png'))
    app.setApplicationDisplayName('Bonus Program')
    w = MainWindow()
    w.resize(600, 475)
    w.show()
    sys.exit(app.exec_())

Customer_Screen.py

from PyQt5 import QtCore
from PyQt5.uic import loadUi
from PyQt5.Qt import *


class CustomerScreen(QDialog):
    def __init__(self, parent):
        super(CustomerScreen, self).__init__()
#        loadUi("screens/customerscreen.ui", self)
        loadUi("customerscreen.ui", self)

        self.parent = parent                                               # +++

        self.back_btn.setIcon(QIcon('Icons/Back.png'))
        self.back_btn.setIconSize(QtCore.QSize(45, 60))
        self.back_btn.clicked.connect(self.go_Back_to_WelcomeScreen)
        
# ??? ----------> vvvvvvvvvv  <---- ???
# ???        self.soldto_btn.clicked.connect(self.go_to_Soldto_list)
        self.SoldTos.clicked.connect(self.go_to_Soldto_list)                # +++ 

    def go_Back_to_WelcomeScreen(self):
#        self.widget.setCurrentIndex(0)
        self.parent.stacked_widget.setCurrentIndex(0)                       # +++ 0

    def go_to_Soldto_list(self):
        self.parent.stacked_widget.setCurrentIndex(2)                       # +++ 2

Soldto_screen.py

from PyQt5 import QtWidgets, QtCore, QtGui
from PyQt5.QtSql import QSqlDatabase, QSqlTableModel, QSqlQuery
from PyQt5.uic import loadUi
from PyQt5.Qt import *


class SoldtoScreen(QDialog):
    def __init__(self, parent):                               # +++ parent
        super(SoldtoScreen, self).__init__()
#        loadUi("screens/soldtoscreen.ui", self)
        loadUi("soldtoscreen.ui", self)

        self.parent = parent                                  # +++

        self.back_btn.setIcon(QIcon('Icons/Back.png'))
        self.back_btn.setIconSize(QtCore.QSize(45, 60))
        self.back_btn.clicked.connect(self.go_Back_to_Customer_Screen)

    def go_Back_to_Customer_Screen(self):
#        self.st_widget.setCurrentIndex(0)                     
        self.parent.stacked_widget.setCurrentIndex(0)          # +++

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

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

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

→ Ссылка