Search code examples
pythonpython-3.xpyqt5exeqt-designer

How can I combine in one file multiple .py and.ui files?


I have bilingual application. In QtDesigner I made two interfaces: gui_eng.ui and gui_rus.ui. For each of them exist main_gui_eng.py and main_gui_rus.py files with configuration code of those .ui files. What is more, there exists main.py file (from which is started main_gui_eng.py or main_gui_rus.py according to last time closed). main.py will be converted to .exe file. In each file I use following way to connect with .ui:

main_window = uic.loadUiType('gui_eng.ui')[0]
class WIZWindow(QMainWindow, main_window):   

Problem: How could I connect them this way? If I write in main.py:

import main_gui_eng

it does not open needed .ui file...


Solution

  • 1 pyuic5 gui_eng.ui -o gui_eng.py

    2 pyuic5 gui_rus.ui -o gui_rus.py

    3 python main_eng_rus.py

    4 pyinstaller -c -F main_eng_rus.py

    5 main_eng_rus.exe


    main_gui_eng.py

    from PyQt5.QtWidgets import QMainWindow, QApplication
    
    # pyuic5 gui_eng.ui -o gui_eng.py
    from gui_eng import Ui_MainWindow
    
    
    class Window(QMainWindow, Ui_MainWindow):
        def __init__(self, parent=None):
            super(Window, self).__init__(parent)
            self.parent = parent
    
            self.setupUi(self)
    
        def closeEvent(self, event):
            self.hide()
            self.parent.show()
    
    
    if __name__ == '__main__':
        import sys
        app = QApplication(sys.argv)
        w = Window()
        w.setWindowTitle("main_gui_eng.py")
        w.show()
        sys.exit(app.exec_())        
    

    main_gui_rus.py

    from PyQt5.QtWidgets import QMainWindow, QApplication
    
    # pyuic5 gui_rus.ui -o gui_rus.py
    from gui_rus import Ui_MainWindow
    
    
    class Window(QMainWindow, Ui_MainWindow):
        def __init__(self, parent=None):
            super(Window, self).__init__(parent)
            self.parent = parent 
    
            self.setupUi(self)
    
        def closeEvent(self, event):
            self.hide()
            self.parent.show()
    
    
    if __name__ == '__main__':
        import sys
        app = QApplication(sys.argv)
        w = Window()
        w.setWindowTitle("main_gui_rus.py")
        w.show()
        sys.exit(app.exec_())        
    

    main_eng_rus.py

    from PyQt5.QtWidgets import (QMainWindow, QApplication, QPushButton, 
                                 QWidget, QGridLayout)
    
    from main_gui_eng import Window as gui_eng
    from main_gui_rus import Window as gui_rus
    
    
    class MainWindow(QMainWindow):
        def __init__(self, parent=None):
            super(MainWindow, self).__init__(parent)
    
            centralWidget = QWidget()
            self.setCentralWidget(centralWidget)
    
            self.button_eng = QPushButton('Open main_gui_eng.py')
            self.button_eng.clicked.connect(self.open_gui_eng)
            self.button_rus = QPushButton('Open main_gui_rus.py')
            self.button_rus.clicked.connect(self.open_gui_rus)
    
            self.grid = QGridLayout(centralWidget)
            self.grid.addWidget(self.button_eng, 0, 0)         
            self.grid.addWidget(self.button_rus, 0, 1)
    
        def open_gui_eng(self):
            self.mainGuiEng = gui_eng(self)
            self.mainGuiEng.show()
            self.hide()
    
        def open_gui_rus(self):
            self.mainGuiRus = gui_rus(self)
            self.mainGuiRus.show()
            self.hide()
    
    
    if __name__ == '__main__':
        import sys
        app = QApplication(sys.argv)
        w = MainWindow()
        w.setWindowTitle("main_eng_rus.py")
        w.show()
        sys.exit(app.exec_())        
    

    enter image description here