Python 从创建UI的单独文件(类)中设置初始组合框值

Python 从创建UI的单独文件(类)中设置初始组合框值,python,pyqt,pyqt5,Python,Pyqt,Pyqt5,我花了很多时间使用tkinter制作GUI,但从未使用过OOP风格,所以我想开始学习PyQt5,然后开始学习OOP(当然要努力学习) 我目前有三个文件: app.py应用程序的“主要入口点” main_menu.py-从PyQt designer.ui文件转换而来的Python文件 add_functions.py-该文件将具有基于用户操作更新GUI的函数,并通过单击按钮运行函数 我的问题是,如何在创建小部件的“main_menu.py”文件之外更新组合框的初始值?我假设我在“app.py

我花了很多时间使用tkinter制作GUI,但从未使用过OOP风格,所以我想开始学习PyQt5,然后开始学习OOP(当然要努力学习)

我目前有三个文件:

  • app.py应用程序的“主要入口点”

  • main_menu.py-从PyQt designer.ui文件转换而来的Python文件

  • add_functions.py-该文件将具有基于用户操作更新GUI的函数,并通过单击按钮运行函数

  • 我的问题是,如何在创建小部件的“main_menu.py”文件之外更新组合框的初始值?我假设我在“app.py”文件中的某个地方这样做,但我无法理解

    下面的代码不会抛出任何错误,但组合框为空,其中一个应为字符串列表,另一个应为单个字符串(稍后将根据第一个组合框选择进行更新)

    我基本上可以让它处理“main_menu.py”文件中的所有内容,但后来我意识到每次我想更改UI时,都会产生问题

    app.py

    from PyQt5.QtWidgets import QMainWindow
    from PyQt5 import QtWidgets
    
    # import GUI from designer file
    from main_menu import Ui_main_menu
    # import other functions
    from add_functions import ChangeLists
    
    
    class Main(QMainWindow, Ui_main_menu):
        def __init__(self, parent=None):
            super(Main, self).__init__(parent)
            self.setupUi(self)
    
            # Team List
            team_list_file = open(r'C:\NHLdb_pyqt\files\NHLteams.txt', 'r')
            team_list = team_list_file.read().splitlines()
            team_list_file.close()
            print("team list: ", team_list)
            # Initial Player List
            player_list_init = "Please Select a Team"
            # update combo box lists
            print("team list: ", team_list)
            self.team_select_combobox.addItems(team_list)
            self.player_select_combobox.addItem(player_list_init)
            # connect combo box to function that will change player list based on team list selection
            # self.team_select_combobox.currentTextChanged.connect(ChangeLists.team_changed)
    
    
    if __name__ == "__main__":
        import sys
    
        app = QtWidgets.QApplication(sys.argv)
        main_menu = QtWidgets.QDialog()
        ui = Ui_main_menu()
        ui.setupUi(main_menu)
        main_menu.show()
        sys.exit(app.exec_())
    
    from PyQt5 import QtCore, QtGui, QtWidgets
    
    
    class Ui_main_menu(object):
        def setupUi(self, main_menu):
            main_menu.setObjectName("main_menu")
            main_menu.resize(463, 408)
            self.horizontalLayout_2 = QtWidgets.QHBoxLayout(main_menu)
            self.horizontalLayout_2.setObjectName("horizontalLayout_2")
            self.tabWidget = QtWidgets.QTabWidget(main_menu)
            self.tabWidget.setObjectName("tabWidget")
            self.get_data_tab = QtWidgets.QWidget()
            self.get_data_tab.setObjectName("get_data_tab")
            self.verticalLayout = QtWidgets.QVBoxLayout(self.get_data_tab)
            self.verticalLayout.setObjectName("verticalLayout")
            self.team_player_layout = QtWidgets.QGridLayout()
            self.team_player_layout.setObjectName("team_player_layout")
            self.player_select_label = QtWidgets.QLabel(self.get_data_tab)
            self.player_select_label.setAlignment(QtCore.Qt.AlignCenter)
            self.player_select_label.setObjectName("player_select_label")
            self.team_player_layout.addWidget(self.player_select_label, 2, 0, 1, 1)
            self.team_select_combobox = QtWidgets.QComboBox(self.get_data_tab)
            self.team_select_combobox.setCurrentText("")
            self.team_select_combobox.setPlaceholderText("")
            self.team_select_combobox.setObjectName("team_select_combobox")
            self.team_player_layout.addWidget(self.team_select_combobox, 0, 1, 1, 1)
            self.player_select_combobox = QtWidgets.QComboBox(self.get_data_tab)
            self.player_select_combobox.setObjectName("player_select_combobox")
            self.team_player_layout.addWidget(self.player_select_combobox, 2, 1, 1, 1)
            self.team_select_label = QtWidgets.QLabel(self.get_data_tab)
            self.team_select_label.setAlignment(QtCore.Qt.AlignCenter)
            self.team_select_label.setObjectName("team_select_label")
            self.team_player_layout.addWidget(self.team_select_label, 0, 0, 1, 1)
            self.get_player_data_button = QtWidgets.QPushButton(self.get_data_tab)
            self.get_player_data_button.setObjectName("get_player_data_button")
            self.team_player_layout.addWidget(self.get_player_data_button, 3, 0, 1, 2)
            self.verticalLayout.addLayout(self.team_player_layout)
            self.tableWidget = QtWidgets.QTableWidget(self.get_data_tab)
            sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)
            sizePolicy.setHorizontalStretch(0)
            sizePolicy.setVerticalStretch(0)
            sizePolicy.setHeightForWidth(self.tableWidget.sizePolicy().hasHeightForWidth())
            self.tableWidget.setSizePolicy(sizePolicy)
            self.tableWidget.setObjectName("tableWidget")
            self.tableWidget.setColumnCount(4)
            self.tableWidget.setRowCount(0)
            item = QtWidgets.QTableWidgetItem()
            self.tableWidget.setHorizontalHeaderItem(0, item)
            item = QtWidgets.QTableWidgetItem()
            self.tableWidget.setHorizontalHeaderItem(1, item)
            item = QtWidgets.QTableWidgetItem()
            self.tableWidget.setHorizontalHeaderItem(2, item)
            item = QtWidgets.QTableWidgetItem()
            self.tableWidget.setHorizontalHeaderItem(3, item)
            self.verticalLayout.addWidget(self.tableWidget)
            self.tabWidget.addTab(self.get_data_tab, "")
            self.view_db_tab = QtWidgets.QWidget()
            self.view_db_tab.setObjectName("view_db_tab")
            self.tabWidget.addTab(self.view_db_tab, "")
            self.horizontalLayout_2.addWidget(self.tabWidget)
    
            self.retranslateUi(main_menu)
            self.tabWidget.setCurrentIndex(0)
            QtCore.QMetaObject.connectSlotsByName(main_menu)
    
        def retranslateUi(self, main_menu):
            _translate = QtCore.QCoreApplication.translate
            main_menu.setWindowTitle(_translate("main_menu", "NHL Database"))
            self.player_select_label.setText(_translate("main_menu", "Select A Player:"))
            self.team_select_label.setText(_translate("main_menu", "Select A Team:"))
            self.get_player_data_button.setText(_translate("main_menu", "Get Player Data"))
            item = self.tableWidget.horizontalHeaderItem(0)
            item.setText(_translate("main_menu", "Year"))
            item = self.tableWidget.horizontalHeaderItem(1)
            item.setText(_translate("main_menu", "Team"))
            item = self.tableWidget.horizontalHeaderItem(2)
            item.setText(_translate("main_menu", "League"))
            item = self.tableWidget.horizontalHeaderItem(3)
            item.setText(_translate("main_menu", "GP"))
            self.tabWidget.setTabText(self.tabWidget.indexOf(self.get_data_tab), _translate("main_menu", "Get Player Data"))
            self.tabWidget.setTabText(self.tabWidget.indexOf(self.view_db_tab), _translate("main_menu", "View Database"))
    
    from PyQt5 import QtWidgets
    from main_menu import Ui_main_menu
    
    
    class Main(QtWidgets.QDialog, Ui_main_menu):
        def __init__(self):
            super().__init__()
            # setup ui
            self.setupUi(self)
    
            # Team List
            team_list_file = open(r'D:\temp.txt', 'r')
            team_list = team_list_file.read().splitlines()
            team_list_file.close()
            # Initial Player List
            player_list_init = "Please Select a Team"
            # update combo box lists
            self.team_select_combobox.addItems(team_list)
            self.player_select_combobox.addItem(player_list_init)
    
    
    if __name__ == "__main__":
        app = QtWidgets.QApplication([])
        ui = Main()
        ui.show()
        app.exec_()
    
    主菜单.py

    from PyQt5.QtWidgets import QMainWindow
    from PyQt5 import QtWidgets
    
    # import GUI from designer file
    from main_menu import Ui_main_menu
    # import other functions
    from add_functions import ChangeLists
    
    
    class Main(QMainWindow, Ui_main_menu):
        def __init__(self, parent=None):
            super(Main, self).__init__(parent)
            self.setupUi(self)
    
            # Team List
            team_list_file = open(r'C:\NHLdb_pyqt\files\NHLteams.txt', 'r')
            team_list = team_list_file.read().splitlines()
            team_list_file.close()
            print("team list: ", team_list)
            # Initial Player List
            player_list_init = "Please Select a Team"
            # update combo box lists
            print("team list: ", team_list)
            self.team_select_combobox.addItems(team_list)
            self.player_select_combobox.addItem(player_list_init)
            # connect combo box to function that will change player list based on team list selection
            # self.team_select_combobox.currentTextChanged.connect(ChangeLists.team_changed)
    
    
    if __name__ == "__main__":
        import sys
    
        app = QtWidgets.QApplication(sys.argv)
        main_menu = QtWidgets.QDialog()
        ui = Ui_main_menu()
        ui.setupUi(main_menu)
        main_menu.show()
        sys.exit(app.exec_())
    
    from PyQt5 import QtCore, QtGui, QtWidgets
    
    
    class Ui_main_menu(object):
        def setupUi(self, main_menu):
            main_menu.setObjectName("main_menu")
            main_menu.resize(463, 408)
            self.horizontalLayout_2 = QtWidgets.QHBoxLayout(main_menu)
            self.horizontalLayout_2.setObjectName("horizontalLayout_2")
            self.tabWidget = QtWidgets.QTabWidget(main_menu)
            self.tabWidget.setObjectName("tabWidget")
            self.get_data_tab = QtWidgets.QWidget()
            self.get_data_tab.setObjectName("get_data_tab")
            self.verticalLayout = QtWidgets.QVBoxLayout(self.get_data_tab)
            self.verticalLayout.setObjectName("verticalLayout")
            self.team_player_layout = QtWidgets.QGridLayout()
            self.team_player_layout.setObjectName("team_player_layout")
            self.player_select_label = QtWidgets.QLabel(self.get_data_tab)
            self.player_select_label.setAlignment(QtCore.Qt.AlignCenter)
            self.player_select_label.setObjectName("player_select_label")
            self.team_player_layout.addWidget(self.player_select_label, 2, 0, 1, 1)
            self.team_select_combobox = QtWidgets.QComboBox(self.get_data_tab)
            self.team_select_combobox.setCurrentText("")
            self.team_select_combobox.setPlaceholderText("")
            self.team_select_combobox.setObjectName("team_select_combobox")
            self.team_player_layout.addWidget(self.team_select_combobox, 0, 1, 1, 1)
            self.player_select_combobox = QtWidgets.QComboBox(self.get_data_tab)
            self.player_select_combobox.setObjectName("player_select_combobox")
            self.team_player_layout.addWidget(self.player_select_combobox, 2, 1, 1, 1)
            self.team_select_label = QtWidgets.QLabel(self.get_data_tab)
            self.team_select_label.setAlignment(QtCore.Qt.AlignCenter)
            self.team_select_label.setObjectName("team_select_label")
            self.team_player_layout.addWidget(self.team_select_label, 0, 0, 1, 1)
            self.get_player_data_button = QtWidgets.QPushButton(self.get_data_tab)
            self.get_player_data_button.setObjectName("get_player_data_button")
            self.team_player_layout.addWidget(self.get_player_data_button, 3, 0, 1, 2)
            self.verticalLayout.addLayout(self.team_player_layout)
            self.tableWidget = QtWidgets.QTableWidget(self.get_data_tab)
            sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)
            sizePolicy.setHorizontalStretch(0)
            sizePolicy.setVerticalStretch(0)
            sizePolicy.setHeightForWidth(self.tableWidget.sizePolicy().hasHeightForWidth())
            self.tableWidget.setSizePolicy(sizePolicy)
            self.tableWidget.setObjectName("tableWidget")
            self.tableWidget.setColumnCount(4)
            self.tableWidget.setRowCount(0)
            item = QtWidgets.QTableWidgetItem()
            self.tableWidget.setHorizontalHeaderItem(0, item)
            item = QtWidgets.QTableWidgetItem()
            self.tableWidget.setHorizontalHeaderItem(1, item)
            item = QtWidgets.QTableWidgetItem()
            self.tableWidget.setHorizontalHeaderItem(2, item)
            item = QtWidgets.QTableWidgetItem()
            self.tableWidget.setHorizontalHeaderItem(3, item)
            self.verticalLayout.addWidget(self.tableWidget)
            self.tabWidget.addTab(self.get_data_tab, "")
            self.view_db_tab = QtWidgets.QWidget()
            self.view_db_tab.setObjectName("view_db_tab")
            self.tabWidget.addTab(self.view_db_tab, "")
            self.horizontalLayout_2.addWidget(self.tabWidget)
    
            self.retranslateUi(main_menu)
            self.tabWidget.setCurrentIndex(0)
            QtCore.QMetaObject.connectSlotsByName(main_menu)
    
        def retranslateUi(self, main_menu):
            _translate = QtCore.QCoreApplication.translate
            main_menu.setWindowTitle(_translate("main_menu", "NHL Database"))
            self.player_select_label.setText(_translate("main_menu", "Select A Player:"))
            self.team_select_label.setText(_translate("main_menu", "Select A Team:"))
            self.get_player_data_button.setText(_translate("main_menu", "Get Player Data"))
            item = self.tableWidget.horizontalHeaderItem(0)
            item.setText(_translate("main_menu", "Year"))
            item = self.tableWidget.horizontalHeaderItem(1)
            item.setText(_translate("main_menu", "Team"))
            item = self.tableWidget.horizontalHeaderItem(2)
            item.setText(_translate("main_menu", "League"))
            item = self.tableWidget.horizontalHeaderItem(3)
            item.setText(_translate("main_menu", "GP"))
            self.tabWidget.setTabText(self.tabWidget.indexOf(self.get_data_tab), _translate("main_menu", "Get Player Data"))
            self.tabWidget.setTabText(self.tabWidget.indexOf(self.view_db_tab), _translate("main_menu", "View Database"))
    
    from PyQt5 import QtWidgets
    from main_menu import Ui_main_menu
    
    
    class Main(QtWidgets.QDialog, Ui_main_menu):
        def __init__(self):
            super().__init__()
            # setup ui
            self.setupUi(self)
    
            # Team List
            team_list_file = open(r'D:\temp.txt', 'r')
            team_list = team_list_file.read().splitlines()
            team_list_file.close()
            # Initial Player List
            player_list_init = "Please Select a Team"
            # update combo box lists
            self.team_select_combobox.addItems(team_list)
            self.player_select_combobox.addItem(player_list_init)
    
    
    if __name__ == "__main__":
        app = QtWidgets.QApplication([])
        ui = Main()
        ui.show()
        app.exec_()
    
    添加函数

    from os import path
    from PyQt5 import QtCore, QtGui, QtWidgets
    
    
    class ChangeLists:
        def team_changed(self):
            index = self.team_select_combobox.currentText()
            if index != 0 and path.exists(r'C:\NHLdb\files\_' + str(index) + '.txt'):
                player_list_file = open(r'C:\NHLdb\files\_' + str(index) + '.txt', 'r')
                player_list_update = player_list_file.read().splitlines()
                player_list_file.close()
                self.player_select_combobox.clear()
                self.player_select_combobox.addItems(player_list_update)
            if index != 0 and not path.exists(r'C:\NHLdb\files\_' + str(index) + '.txt'):
                self.player_select_combobox.clear()
                self.player_select_combobox.addItem("Prospects Not Compiled")
    

    你在app.py中的呼叫顺序有点不正确。类Main永远不会被调用,因此在那里定义的初始化例程永远不会被执行。此外,类Main继承自错误的窗口类型。在您的例子中,您设计了一个QDialog,因此它应该继承它(而不是QMainWindow)

    解决这些问题后,您在Main类中定义的所有内容都应按预期工作:

    修改的app.py

    from PyQt5.QtWidgets import QMainWindow
    from PyQt5 import QtWidgets
    
    # import GUI from designer file
    from main_menu import Ui_main_menu
    # import other functions
    from add_functions import ChangeLists
    
    
    class Main(QMainWindow, Ui_main_menu):
        def __init__(self, parent=None):
            super(Main, self).__init__(parent)
            self.setupUi(self)
    
            # Team List
            team_list_file = open(r'C:\NHLdb_pyqt\files\NHLteams.txt', 'r')
            team_list = team_list_file.read().splitlines()
            team_list_file.close()
            print("team list: ", team_list)
            # Initial Player List
            player_list_init = "Please Select a Team"
            # update combo box lists
            print("team list: ", team_list)
            self.team_select_combobox.addItems(team_list)
            self.player_select_combobox.addItem(player_list_init)
            # connect combo box to function that will change player list based on team list selection
            # self.team_select_combobox.currentTextChanged.connect(ChangeLists.team_changed)
    
    
    if __name__ == "__main__":
        import sys
    
        app = QtWidgets.QApplication(sys.argv)
        main_menu = QtWidgets.QDialog()
        ui = Ui_main_menu()
        ui.setupUi(main_menu)
        main_menu.show()
        sys.exit(app.exec_())
    
    from PyQt5 import QtCore, QtGui, QtWidgets
    
    
    class Ui_main_menu(object):
        def setupUi(self, main_menu):
            main_menu.setObjectName("main_menu")
            main_menu.resize(463, 408)
            self.horizontalLayout_2 = QtWidgets.QHBoxLayout(main_menu)
            self.horizontalLayout_2.setObjectName("horizontalLayout_2")
            self.tabWidget = QtWidgets.QTabWidget(main_menu)
            self.tabWidget.setObjectName("tabWidget")
            self.get_data_tab = QtWidgets.QWidget()
            self.get_data_tab.setObjectName("get_data_tab")
            self.verticalLayout = QtWidgets.QVBoxLayout(self.get_data_tab)
            self.verticalLayout.setObjectName("verticalLayout")
            self.team_player_layout = QtWidgets.QGridLayout()
            self.team_player_layout.setObjectName("team_player_layout")
            self.player_select_label = QtWidgets.QLabel(self.get_data_tab)
            self.player_select_label.setAlignment(QtCore.Qt.AlignCenter)
            self.player_select_label.setObjectName("player_select_label")
            self.team_player_layout.addWidget(self.player_select_label, 2, 0, 1, 1)
            self.team_select_combobox = QtWidgets.QComboBox(self.get_data_tab)
            self.team_select_combobox.setCurrentText("")
            self.team_select_combobox.setPlaceholderText("")
            self.team_select_combobox.setObjectName("team_select_combobox")
            self.team_player_layout.addWidget(self.team_select_combobox, 0, 1, 1, 1)
            self.player_select_combobox = QtWidgets.QComboBox(self.get_data_tab)
            self.player_select_combobox.setObjectName("player_select_combobox")
            self.team_player_layout.addWidget(self.player_select_combobox, 2, 1, 1, 1)
            self.team_select_label = QtWidgets.QLabel(self.get_data_tab)
            self.team_select_label.setAlignment(QtCore.Qt.AlignCenter)
            self.team_select_label.setObjectName("team_select_label")
            self.team_player_layout.addWidget(self.team_select_label, 0, 0, 1, 1)
            self.get_player_data_button = QtWidgets.QPushButton(self.get_data_tab)
            self.get_player_data_button.setObjectName("get_player_data_button")
            self.team_player_layout.addWidget(self.get_player_data_button, 3, 0, 1, 2)
            self.verticalLayout.addLayout(self.team_player_layout)
            self.tableWidget = QtWidgets.QTableWidget(self.get_data_tab)
            sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)
            sizePolicy.setHorizontalStretch(0)
            sizePolicy.setVerticalStretch(0)
            sizePolicy.setHeightForWidth(self.tableWidget.sizePolicy().hasHeightForWidth())
            self.tableWidget.setSizePolicy(sizePolicy)
            self.tableWidget.setObjectName("tableWidget")
            self.tableWidget.setColumnCount(4)
            self.tableWidget.setRowCount(0)
            item = QtWidgets.QTableWidgetItem()
            self.tableWidget.setHorizontalHeaderItem(0, item)
            item = QtWidgets.QTableWidgetItem()
            self.tableWidget.setHorizontalHeaderItem(1, item)
            item = QtWidgets.QTableWidgetItem()
            self.tableWidget.setHorizontalHeaderItem(2, item)
            item = QtWidgets.QTableWidgetItem()
            self.tableWidget.setHorizontalHeaderItem(3, item)
            self.verticalLayout.addWidget(self.tableWidget)
            self.tabWidget.addTab(self.get_data_tab, "")
            self.view_db_tab = QtWidgets.QWidget()
            self.view_db_tab.setObjectName("view_db_tab")
            self.tabWidget.addTab(self.view_db_tab, "")
            self.horizontalLayout_2.addWidget(self.tabWidget)
    
            self.retranslateUi(main_menu)
            self.tabWidget.setCurrentIndex(0)
            QtCore.QMetaObject.connectSlotsByName(main_menu)
    
        def retranslateUi(self, main_menu):
            _translate = QtCore.QCoreApplication.translate
            main_menu.setWindowTitle(_translate("main_menu", "NHL Database"))
            self.player_select_label.setText(_translate("main_menu", "Select A Player:"))
            self.team_select_label.setText(_translate("main_menu", "Select A Team:"))
            self.get_player_data_button.setText(_translate("main_menu", "Get Player Data"))
            item = self.tableWidget.horizontalHeaderItem(0)
            item.setText(_translate("main_menu", "Year"))
            item = self.tableWidget.horizontalHeaderItem(1)
            item.setText(_translate("main_menu", "Team"))
            item = self.tableWidget.horizontalHeaderItem(2)
            item.setText(_translate("main_menu", "League"))
            item = self.tableWidget.horizontalHeaderItem(3)
            item.setText(_translate("main_menu", "GP"))
            self.tabWidget.setTabText(self.tabWidget.indexOf(self.get_data_tab), _translate("main_menu", "Get Player Data"))
            self.tabWidget.setTabText(self.tabWidget.indexOf(self.view_db_tab), _translate("main_menu", "View Database"))
    
    from PyQt5 import QtWidgets
    from main_menu import Ui_main_menu
    
    
    class Main(QtWidgets.QDialog, Ui_main_menu):
        def __init__(self):
            super().__init__()
            # setup ui
            self.setupUi(self)
    
            # Team List
            team_list_file = open(r'D:\temp.txt', 'r')
            team_list = team_list_file.read().splitlines()
            team_list_file.close()
            # Initial Player List
            player_list_init = "Please Select a Team"
            # update combo box lists
            self.team_select_combobox.addItems(team_list)
            self.player_select_combobox.addItem(player_list_init)
    
    
    if __name__ == "__main__":
        app = QtWidgets.QApplication([])
        ui = Main()
        ui.show()
        app.exec_()