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) # +++


