Как переключаться между двумя виджетами PyQt5 MainWindow

Я пишу программу, которая состоит из двух частей - назовем их sub1 и sub2. Когда я первоначально запускаю свою программу, отображается sub1, и я загружаю sub2 в фоновом режиме, но не отображаю его. У меня есть действие меню в sub1, которое позволяет вам переключиться на sub2, и есть действие меню в sub2, которое позволяет вам переключиться обратно на sub1. У меня проблема при попытке переключиться с sub2 на sub1. Переход от sub1 к sub2 работает нормально; sub1 скрывается, а sub2 отображается. Однако при попытке снова показать sub1, sub2 не скрывается. Я новичок в PyQt, а также Python, поэтому я не знаю все тонкости еще. Итак, метод, который я использую, - это просто метод проб и ошибок, и он ни в коем случае не должен быть таким. Упрощенный код ниже.

#mass module
class MASS(PyQt5.QtWidgets.QMainWindow, massUi.Ui_MainWindow):
    def __init__(self):
        super(MASS, self).__init__()
        self.actionSwitchToCompEval.triggered.connect(self.switchToCompEval)

    def switchToCompEval(self):
        massForm = main.massForm
        massForm.hide()
        compForm = main.compForm
        compForm.show()

    def showMass(self):
        main(1)

def main(initiate=None):
    if initiate == None:
        main.app = PyQt5.QtWidgets.QApplication(sys.argv)
        main.massForm = MASS()
        main.compForm = CompEval.CompEval()
        main.massForm.show()
        main.app.exec_()    
    elif initiate == 1:
        main.massForm = MASS()
        main.compForm = CompEval.CompEval()
        main.compForm.hide()
        main.massForm.show()
    elif initiate == 2:
        pass

if __name__ == '__main__':
    main()    


#comp module

class CompEval(PyQt5.QtWidgets.QMainWindow, compEvalUi.Ui_MainWindow):
    def __init__(self):
        super(CompEval, self).__init__()
        self.actionSwitchToMASS.triggered.connect(self.switchToMass)

    def switchToMass(self):
        mass.MASS().showMass()

def main():
    form = CompEval()
    form.show()

В функции switchToCompEval, кажется, работает нормально для ссылки на переменные main.massForm и main.compForm, но когда я пытаюсь перейти от sub2(comp) обратно к sub1(mass), я получаю ошибку, что функция не содержит эту переменную что странно для меня. Я знаю, что некоторые аспекты того, как у меня есть эта установка в данный момент, странны и далеки от идеальных, поэтому любые предложения будут оценены. Благодарю.

1 ответ

Вы можете использовать сигналы и слоты для разделения логики вместо совместного использования глобальных параметров между классами.

Поэтому после долгих экспериментов я определил, что лучшее решение этой проблемы - объединить модули в один. Если у вас есть несколько виджетов MainWindow, и вы должны иметь возможность переключаться между ними, сохраняйте ваши классы, которые обращаются к виджетам, в одном модуле.

Итак, у меня есть два класса виджетов:

import PyQt5
import sys
#Below are the modules that are auto-generated when using Qt Designer to make an interface
import compWidget as compEvalUi
import massWidget as massUi 

class MASS(PyQt5.QtWidgets.QMainWindow, massUi.Ui_MainWindow
    def __init__(self):
        super(MASS, self).__init__()
        #setupUi function is in the auto-generated module and contains all the attributes of the interface
        self.setupUi(self)
        #menuSwitch is the name of the button/menu item that would need to be clicked
        #in order to switch windows. 
        #The example shown here is if the action was attached to a menu-dropdown item
        #which is why 'triggered' is used as opposed to 'clicked' if it were attached to a button
        self.menuSwitch.triggered.connect(self.switchToCompWidget)

    def switchToCompWidget(self):
        INITIALIZE.massForm.hide()
        INITIALIZE.compForm.show()

class CompEval(PyQt5.QtWidgets.QMainWindow, compEvalUi.Ui_MainWindow):
    def __init__(self):
        super(CompEval, self).__init__()
        self.setupUi(self)
        self.menuSwitch.triggered.connect(self.switchToMassWidget)

    def switchToMassWidget(self):
        INITIALIZE.compForm.hide()
        INITIALIZE.massForm.show()

class INITIALIZE:
    def __init__(self):
        app = PyQt5.QtWidgets.QApplication(sys.argv)
        INITIALIZE.massForm = MASS()
        INITIALIZE.massForm.show()
        INITIALIZE.compForm = CompEval()
        app.exec_()

def main():
    program = INITIALIZE()

if __name__ =='__main__':
    main()
Другие вопросы по тегам