python - 如何在主Python文件中使用多个.ui文件

标签 python pyqt pyqt5 python-3.6 qt-designer

我有两个使用 pyuic5 转换为 python 的 .ui 文件。 第一个转换后的 ui 文件是(LoginWindowUI.py),如下所示:

from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_LoginWindow(object):
    def setupUi(self, LoginWindow):
        LoginWindow.setObjectName("LoginWindow")
        LoginWindow.setWindowModality(QtCore.Qt.NonModal)
        LoginWindow.setEnabled(True)
        LoginWindow.resize(446, 182)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(LoginWindow.sizePolicy().hasHeightForWidth())
        LoginWindow.setSizePolicy(sizePolicy)
        LoginWindow.setMouseTracking(False)
        LoginWindow.setLayoutDirection(QtCore.Qt.RightToLeft)
        LoginWindow.setLocale(QtCore.QLocale(QtCore.QLocale.Persian, QtCore.QLocale.Iran))
        LoginWindow.setDocumentMode(False)
        self.centralwidget = QtWidgets.QWidget(LoginWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.layoutWidget = QtWidgets.QWidget(self.centralwidget)
        self.layoutWidget.setGeometry(QtCore.QRect(194, 30, 187, 77))
        self.layoutWidget.setObjectName("layoutWidget")
        self.gridLayout = QtWidgets.QGridLayout(self.layoutWidget)
        self.gridLayout.setContentsMargins(0, 0, 0, 0)
        self.gridLayout.setObjectName("gridLayout")
        self.password_ldt = QtWidgets.QLineEdit(self.layoutWidget)
        self.password_ldt.setLocale(QtCore.QLocale(QtCore.QLocale.Persian, QtCore.QLocale.Iran))
        self.password_ldt.setText("")
        self.password_ldt.setEchoMode(QtWidgets.QLineEdit.Password)
        self.password_ldt.setCursorPosition(0)
        self.password_ldt.setAlignment(QtCore.Qt.AlignCenter)
        self.password_ldt.setObjectName("password_ldt")
        self.gridLayout.addWidget(self.password_ldt, 1, 1, 1, 1)
        self.password_lbl = QtWidgets.QLabel(self.layoutWidget)
        self.password_lbl.setAlignment(QtCore.Qt.AlignCenter)
        self.password_lbl.setObjectName("password_lbl")
        self.gridLayout.addWidget(self.password_lbl, 1, 0, 1, 1)
        self.username_lbl = QtWidgets.QLabel(self.layoutWidget)
        self.username_lbl.setAlignment(QtCore.Qt.AlignCenter)
        self.username_lbl.setObjectName("username_lbl")
        self.gridLayout.addWidget(self.username_lbl, 0, 0, 1, 1)
        self.username_ldt = QtWidgets.QLineEdit(self.layoutWidget)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Preferred)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.username_ldt.sizePolicy().hasHeightForWidth())
        self.username_ldt.setSizePolicy(sizePolicy)
        self.username_ldt.setLocale(QtCore.QLocale(QtCore.QLocale.Persian, QtCore.QLocale.Iran))
        self.username_ldt.setText("")
        self.username_ldt.setEchoMode(QtWidgets.QLineEdit.Normal)
        self.username_ldt.setAlignment(QtCore.Qt.AlignCenter)
        self.username_ldt.setObjectName("username_ldt")
        self.gridLayout.addWidget(self.username_ldt, 0, 1, 1, 1)
        self.login_btn = QtWidgets.QPushButton(self.layoutWidget)
        self.login_btn.setCursor(QtGui.QCursor(QtCore.Qt.ClosedHandCursor))
        self.login_btn.setAutoDefault(False)
        self.login_btn.setDefault(False)
        self.login_btn.setObjectName("login_btn")
        self.gridLayout.addWidget(self.login_btn, 2, 1, 1, 1)
        self.description_lbl = QtWidgets.QLabel(self.centralwidget)
        self.description_lbl.setGeometry(QtCore.QRect(30, 40, 141, 41))
        self.description_lbl.setText("")
        self.description_lbl.setAlignment(QtCore.Qt.AlignCenter)
        self.description_lbl.setWordWrap(True)
        self.description_lbl.setObjectName("description_lbl")
        LoginWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(LoginWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 446, 21))
        self.menubar.setObjectName("menubar")
        self.menu = QtWidgets.QMenu(self.menubar)
        self.menu.setObjectName("menu")
        LoginWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(LoginWindow)
        self.statusbar.setCursor(QtGui.QCursor(QtCore.Qt.ArrowCursor))
        self.statusbar.setObjectName("statusbar")
        LoginWindow.setStatusBar(self.statusbar)
        self.action_cra = QtWidgets.QAction(LoginWindow)
        self.action_cra.setObjectName("action_cra")
        self.action_db = QtWidgets.QAction(LoginWindow)
        self.action_db.setObjectName("action_db")
        self.action_exit = QtWidgets.QAction(LoginWindow)
        self.action_exit.setObjectName("action_exit")
        self.menu.addAction(self.action_cra)
        self.menu.addAction(self.action_db)
        self.menu.addSeparator()
        self.menu.addAction(self.action_exit)
        self.menubar.addAction(self.menu.menuAction())

        self.retranslateUi(LoginWindow)
        self.action_exit.triggered.connect(LoginWindow.close)
        QtCore.QMetaObject.connectSlotsByName(LoginWindow)
        LoginWindow.setTabOrder(self.username_ldt, self.password_ldt)
        LoginWindow.setTabOrder(self.password_ldt, self.login_btn)

    def retranslateUi(self, LoginWindow):
        _translate = QtCore.QCoreApplication.translate
        self.password_ldt.setToolTip(_translate("LoginWindow", "رمز عبور خود را وارد کنید."))
        self.password_lbl.setText(_translate("LoginWindow", " رمز عبور "))
        self.username_lbl.setText(_translate("LoginWindow", "نام کاربری"))
        self.username_ldt.setToolTip(_translate("LoginWindow", "لطفاً نام کاربری خود را وارد نمایید."))
        self.login_btn.setText(_translate("LoginWindow", "ورود"))
        self.menu.setTitle(_translate("LoginWindow", "درباره ما"))
        self.action_cra.setText(_translate("LoginWindow", "A"))
        self.action_db.setText(_translate("LoginWindow", "B"))
        self.action_exit.setText(_translate("LoginWindow", "خروج"))
        self.action_exit.setStatusTip(_translate("LoginWindow", "خروج"))
        self.action_exit.setShortcut(_translate("LoginWindow", "Ctrl+Q"))


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    LoginWindow = QtWidgets.QMainWindow()
    ui = Ui_LoginWindow()
    ui.setupUi(LoginWindow)
    LoginWindow.show()
    sys.exit(app.exec_())

第二个转换后的.ui文件是(MainWindowUI.py),如下所示:

from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(452, 432)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.cralogo_lbl = QtWidgets.QLabel(self.centralwidget)
        self.cralogo_lbl.setGeometry(QtCore.QRect(90, 30, 171, 161))
        self.cralogo_lbl.setText("")
        self.cralogo_lbl.setPixmap(QtGui.QPixmap("../../.designer/backup/ICONS/CraLogo.png"))
        self.cralogo_lbl.setScaledContents(True)
        self.cralogo_lbl.setObjectName("cralogo_lbl")
        self.exit_btn = QtWidgets.QPushButton(self.centralwidget)
        self.exit_btn.setGeometry(QtCore.QRect(140, 340, 125, 40))
        self.exit_btn.setMinimumSize(QtCore.QSize(125, 40))
        self.exit_btn.setLayoutDirection(QtCore.Qt.LeftToRight)
        self.exit_btn.setCheckable(False)
        self.exit_btn.setChecked(False)
        self.exit_btn.setObjectName("exit_btn")
        self.layoutWidget = QtWidgets.QWidget(self.centralwidget)
        self.layoutWidget.setGeometry(QtCore.QRect(20, 10, 389, 152))
        self.layoutWidget.setObjectName("layoutWidget")
        self.gridLayout = QtWidgets.QGridLayout(self.layoutWidget)
        self.gridLayout.setContentsMargins(0, 0, 0, 0)
        self.gridLayout.setObjectName("gridLayout")
        self.mobile_btn = QtWidgets.QPushButton(self.layoutWidget)
        self.mobile_btn.setEnabled(False)
        self.mobile_btn.setMinimumSize(QtCore.QSize(125, 40))
        self.mobile_btn.setLayoutDirection(QtCore.Qt.RightToLeft)
        self.mobile_btn.setCheckable(False)
        self.mobile_btn.setChecked(False)
        self.mobile_btn.setObjectName("mobile_btn")
        self.gridLayout.addWidget(self.mobile_btn, 1, 0, 1, 1)
        self.dataentry_btn = QtWidgets.QPushButton(self.layoutWidget)
        self.dataentry_btn.setMinimumSize(QtCore.QSize(125, 40))
        self.dataentry_btn.setLayoutDirection(QtCore.Qt.LeftToRight)
        self.dataentry_btn.setCheckable(False)
        self.dataentry_btn.setChecked(False)
        self.dataentry_btn.setObjectName("dataentry_btn")
        self.gridLayout.addWidget(self.dataentry_btn, 0, 2, 1, 1)
        self.village_btn = QtWidgets.QPushButton(self.layoutWidget)
        self.village_btn.setEnabled(False)
        self.village_btn.setMinimumSize(QtCore.QSize(125, 40))
        self.village_btn.setLayoutDirection(QtCore.Qt.RightToLeft)
        self.village_btn.setCheckable(False)
        self.village_btn.setChecked(False)
        self.village_btn.setObjectName("village_btn")
        self.gridLayout.addWidget(self.village_btn, 1, 1, 1, 1)
        self.fix_btn = QtWidgets.QPushButton(self.layoutWidget)
        self.fix_btn.setEnabled(False)
        self.fix_btn.setMinimumSize(QtCore.QSize(125, 40))
        self.fix_btn.setLayoutDirection(QtCore.Qt.RightToLeft)
        self.fix_btn.setCheckable(False)
        self.fix_btn.setChecked(False)
        self.fix_btn.setObjectName("fix_btn")
        self.gridLayout.addWidget(self.fix_btn, 0, 0, 1, 1)
        self.post_btn = QtWidgets.QPushButton(self.layoutWidget)
        self.post_btn.setEnabled(False)
        self.post_btn.setMinimumSize(QtCore.QSize(125, 40))
        self.post_btn.setLayoutDirection(QtCore.Qt.RightToLeft)
        self.post_btn.setCheckable(False)
        self.post_btn.setChecked(False)
        self.post_btn.setObjectName("post_btn")
        self.gridLayout.addWidget(self.post_btn, 2, 0, 1, 1)
        self.city_btn = QtWidgets.QPushButton(self.layoutWidget)
        self.city_btn.setEnabled(False)
        self.city_btn.setMinimumSize(QtCore.QSize(125, 40))
        self.city_btn.setLayoutDirection(QtCore.Qt.RightToLeft)
        self.city_btn.setCheckable(False)
        self.city_btn.setChecked(False)
        self.city_btn.setObjectName("city_btn")
        self.gridLayout.addWidget(self.city_btn, 0, 1, 1, 1)
        self.layoutWidget1 = QtWidgets.QWidget(self.centralwidget)
        self.layoutWidget1.setGeometry(QtCore.QRect(20, 190, 389, 134))
        self.layoutWidget1.setObjectName("layoutWidget1")
        self.gridLayout_2 = QtWidgets.QGridLayout(self.layoutWidget1)
        self.gridLayout_2.setContentsMargins(0, 0, 0, 0)
        self.gridLayout_2.setObjectName("gridLayout_2")
        self.rep4_btn = QtWidgets.QPushButton(self.layoutWidget1)
        self.rep4_btn.setEnabled(False)
        self.rep4_btn.setMinimumSize(QtCore.QSize(125, 40))
        self.rep4_btn.setMaximumSize(QtCore.QSize(125, 40))
        self.rep4_btn.setCheckable(False)
        self.rep4_btn.setObjectName("rep4_btn")
        self.gridLayout_2.addWidget(self.rep4_btn, 0, 0, 1, 1)
        self.rep1_btn = QtWidgets.QPushButton(self.layoutWidget1)
        self.rep1_btn.setEnabled(False)
        self.rep1_btn.setMinimumSize(QtCore.QSize(125, 40))
        self.rep1_btn.setMaximumSize(QtCore.QSize(125, 40))
        self.rep1_btn.setCheckable(False)
        self.rep1_btn.setObjectName("rep1_btn")
        self.gridLayout_2.addWidget(self.rep1_btn, 0, 1, 1, 1)
        self.report_btn = QtWidgets.QPushButton(self.layoutWidget1)
        self.report_btn.setMinimumSize(QtCore.QSize(125, 40))
        self.report_btn.setMaximumSize(QtCore.QSize(125, 40))
        self.report_btn.setCheckable(False)
        self.report_btn.setObjectName("report_btn")
        self.gridLayout_2.addWidget(self.report_btn, 0, 2, 1, 1)
        self.rep5_btn = QtWidgets.QPushButton(self.layoutWidget1)
        self.rep5_btn.setEnabled(False)
        self.rep5_btn.setMinimumSize(QtCore.QSize(125, 40))
        self.rep5_btn.setMaximumSize(QtCore.QSize(125, 40))
        self.rep5_btn.setCheckable(False)
        self.rep5_btn.setObjectName("rep5_btn")
        self.gridLayout_2.addWidget(self.rep5_btn, 1, 0, 1, 1)
        self.rep2_btn = QtWidgets.QPushButton(self.layoutWidget1)
        self.rep2_btn.setEnabled(False)
        self.rep2_btn.setMinimumSize(QtCore.QSize(125, 40))
        self.rep2_btn.setMaximumSize(QtCore.QSize(125, 40))
        self.rep2_btn.setCheckable(False)
        self.rep2_btn.setObjectName("rep2_btn")
        self.gridLayout_2.addWidget(self.rep2_btn, 1, 1, 1, 1)
        self.rep6_btn = QtWidgets.QPushButton(self.layoutWidget1)
        self.rep6_btn.setEnabled(False)
        self.rep6_btn.setMinimumSize(QtCore.QSize(125, 40))
        self.rep6_btn.setMaximumSize(QtCore.QSize(125, 40))
        self.rep6_btn.setCheckable(False)
        self.rep6_btn.setObjectName("rep6_btn")
        self.gridLayout_2.addWidget(self.rep6_btn, 2, 0, 1, 1)
        self.rep3_btn = QtWidgets.QPushButton(self.layoutWidget1)
        self.rep3_btn.setEnabled(False)
        self.rep3_btn.setMinimumSize(QtCore.QSize(125, 40))
        self.rep3_btn.setMaximumSize(QtCore.QSize(125, 40))
        self.rep3_btn.setCheckable(False)
        self.rep3_btn.setObjectName("rep3_btn")
        self.gridLayout_2.addWidget(self.rep3_btn, 2, 1, 1, 1)
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 452, 21))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        self.exit_btn.clicked.connect(MainWindow.close)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.cralogo_lbl.setStatusTip(_translate("MainWindow", "www.cra.ir"))
        self.exit_btn.setText(_translate("MainWindow", "خروج"))
        self.mobile_btn.setText(_translate("MainWindow", "4"))
        self.dataentry_btn.setText(_translate("MainWindow", "A"))
        self.village_btn.setText(_translate("MainWindow", "2"))
        self.fix_btn.setText(_translate("MainWindow", "3"))
        self.post_btn.setText(_translate("MainWindow", "5"))
        self.city_btn.setText(_translate("MainWindow", "1"))
        self.rep4_btn.setText(_translate("MainWindow", "4"))
        self.rep1_btn.setText(_translate("MainWindow", "1"))
        self.report_btn.setText(_translate("MainWindow", "B"))
        self.rep5_btn.setText(_translate("MainWindow", "5"))
        self.rep2_btn.setText(_translate("MainWindow", "2"))
        self.rep6_btn.setText(_translate("MainWindow", "6"))
        self.rep3_btn.setText(_translate("MainWindow", "3"))


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())

我的主要 python 文件是:

from LoginWindowUI import Ui_LoginWindow
from MainWindowUI import Ui_MainWindow
from PyQt5 import QtCore,QtGui,QtWidgets
import sys
import mysql.connector

open_main_window_flag = False

class Main_Window():
    def __init__(self):
        app = QtWidgets.QApplication(sys.argv)
        self.MWindow = QtWidgets.QMainWindow()
        self.ui_MWindow = Ui_MainWindow()
        self.ui_MWindow.setupUi(self.MWindow)
        self.MWindow.show()
        sys.exit(app.exec_())


class login():
    def __init__(self):
        app = QtWidgets.QApplication(sys.argv)
        self.LoginWindow = QtWidgets.QMainWindow()
        self.ui_login = Ui_LoginWindow()
        self.ui_login.setupUi(self.LoginWindow)
        self.ui_login.login_btn.clicked.connect(self.loginform)
        self.authentication_flag = False
        self.LoginWindow.show()
        sys.exit(app.exec_())

    def loginform(self):
        global open_main_window_flag
        db_user = self.ui_login.username_ldt.text()
        db_pass = self.ui_login.password_ldt.text()
        if(db_user == 'admin' and db_pass=='admin'):
            print('Welcome')
            self.authentication_flag = True
        else:
            print('Try Again')
            self.authentication_flag = False

        if self.authentication_flag:
            self.LoginWindow.close()
            open_main_window_flag = True


if __name__ == '__main__':
    mylogin = login()
    if open_main_window_flag:
         mymainwindow = Main_Window()

我希望当用户在用户名和密码中输入“admin”、“admin”时,此窗口会关闭并打开第二个 ui 文件。

最佳答案

您有以下错误:

  • QApplication 只能有一个对象,您为每个窗口创建一个对象,这是不正确的。

  • 避免使用全局变量,它们被认为是不好的做法,并且很少有必要。欲了解更多信息,请阅读:Why are global variables evil?

  • Qt Designer 不提供小部件,而是提供用于填充小部件的类,因此 PyQt 建议创建一个合适的小部件类并用该类填充它,有关更多信息,请阅读:http://pyqt.sourceforge.net/Docs/PyQt5/designer.html

言归正传,您不能使用标志,因为该过程是异步的,在 Qt 中您使用信号,这是通知发生更改的正确方法,例如,保持类分离的一种方法是创建一个信号表明您已登录,关闭窗口并打开另一个窗口。

from LoginWindowUI import Ui_LoginWindow
from MainWindowUI import Ui_MainWindow
from PyQt5 import QtCore, QtGui, QtWidgets


class Main_Window(QtWidgets.QMainWindow, Ui_MainWindow):
    def __init__(self, parent=None):
        super(Main_Window, self).__init__(parent)
        self.setupUi(self)

class LoginWindow(QtWidgets.QMainWindow, Ui_LoginWindow):
    logged = QtCore.pyqtSignal()

    def __init__(self, parent=None):
        super(LoginWindow, self).__init__(parent)
        self.setupUi(self)
        self.login_btn.clicked.connect(self.authenticate)

    @QtCore.pyqtSlot()
    def authenticate(self):
        db_user = self.username_ldt.text()
        db_pass = self.password_ldt.text()
        if db_user == 'admin' and db_pass=='admin':
            self.logged.emit()
            self.close()

def main():
    import sys

    app = QtWidgets.QApplication(sys.argv)
    login = LoginWindow()
    w = Main_Window()
    login.logged.connect(w.show)
    login.show()
    sys.exit(app.exec_())


if __name__ == '__main__': main()

关于python - 如何在主Python文件中使用多个.ui文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53088268/

相关文章:

python - 在 Python 中将字符串值写入 CSV 文件

python - 如何从python中的Postsql解释中提取时间成本

python - 更新和切换绘图

qt - 使用委托(delegate) (PySide/Qt/PyQt) 将项目的文本垂直居中

python - 如何在Qprinter pyqt5中打印带有图像的html页面

python - 在 QListWidget 中滑动以选中/取消选中

python Pandas : MultiIndex groupby second level of columns

python - 训练两个特征而不是一个

python - 如何在 QLineedit 完成器中删除光标

python-3.x - PyQt5 - 在 MainWindow 布局的背景中添加图像