Python 如何在创建为类的PyQt5选项卡之间更新值

Python 如何在创建为类的PyQt5选项卡之间更新值,python,pyqt,pyqt5,qtabwidget,Python,Pyqt,Pyqt5,Qtabwidget,我在PyQT5中创建了两个选项卡作为单独的类。第一个类(选项卡)用于加载excel文件,第二个类用于设置删除不需要的行的规则。当我加载文件时,我需要将所有标题发布到其他选项卡中的QComboBox,以便我可以创建规则。不能让它工作 import sys from PyQt5.QtWidgets import * import pandas as pd class BOMAppWindow(QDialog): def __init__(self): super().__

我在PyQT5中创建了两个选项卡作为单独的类。第一个类(选项卡)用于加载excel文件,第二个类用于设置删除不需要的行的规则。当我加载文件时,我需要将所有标题发布到其他选项卡中的QComboBox,以便我可以创建规则。不能让它工作

import sys
from PyQt5.QtWidgets import *
import pandas as pd


class BOMAppWindow(QDialog):
    def __init__(self):
        super().__init__()

        self.setGeometry(250, 150, 1400, 600)

        mainTabWidget = QTabWidget()     # --------- TABS UI ----------
        mainTabWidget.addTab(FileOpenTab(), "File Open")
        mainTabWidget.addTab(RowRemoveRulesTab(), "Row Delete Rules")

        mainVbox = QVBoxLayout()
        mainVbox.addWidget(mainTabWidget)

        self.setLayout(mainVbox)


df = pd.DataFrame()   # pandas dataframe as container for excel spreadsheet
header_list = []


class FileOpenTab(QDialog):
    def __init__(self):
        super().__init__()

        vbox = QVBoxLayout()
        h_top_box = QHBoxLayout()
        excel_load_button = QPushButton("Open Excel File")
        h_top_box.addWidget(excel_load_button)  # ---- Adding Widgets to HBox

        # ----------------  Adding Table Widget -----------

        self.excel_table = QTableWidget()

        vbox.addLayout(h_top_box)         #-----Create Vertical Box Layout
        vbox.addWidget(self.excel_table)
        self.setLayout(vbox)

        excel_load_button.clicked.connect(self.set_file_data)  
# ----------- Open Excel Button Clicked Event
        self.show()

    def file_path(self):       # -----------    file dialog box
        filter_excel_only = "Excel Files (*.xlsx)"
        filename = QFileDialog.getOpenFileName(self, 'Open Excel File', "", filter_excel_only)
        return filename[0]


    def set_file_data(self):                
        path_text = self.file_path()
        if path_text:
            global df
            df = pd.read_excel(path_text, na_filter=False)  
            self.post_dataframe(df)
            RowRemoveRulesTab().update_select_list()

    def post_dataframe(self, dataframe):
        column_count = dataframe.shape[1]
        row_count = dataframe.shape[0]
        self.excel_table.setColumnCount(column_count)
        self.excel_table.setRowCount(row_count)
        self.excel_table.setHorizontalHeaderLabels(list(dataframe.columns))

    def header_list(self):
        return list(df.columns)


class RowRemoveRulesTab(QDialog):
    def __init__(self):
        super().__init__()

        hbox = QHBoxLayout()
        groupBox1 = QGroupBox("Rule 1:")
        vbox1 = QVBoxLayout()

        self.rule1select = QComboBox()
        self.rule1select.addItems(FileOpenTab().header_list())

        vbox1.addWidget(self.rule1select)

        groupBox1.setLayout(vbox1)
        hbox.addWidget(groupBox1)

        self.setLayout(hbox)

        self.show()

    def update_select_list(self):
        self.rule1select.clear()
        self.rule1select.addItems(FileOpenTab().header_list())
        print(FileOpenTab().header_list())


app = QApplication(sys.argv)
bomAppWindow = BOMAppWindow()
bomAppWindow.show()
app.exec()

我需要第二个选项卡中的最后一个函数(或处理它的任何其他方法)update_select_list(self):使用第一个FileOpenTab类中加载的excel文件的标题列表更新QComboBox。现在,QComboBox在文件加载后仍然为空。

问题的关键在于,您假设每次执行FileOpenTab()时,它始终是同一个小部件,但事实并非如此。同样的道理也适用于rowstab。相反,您必须将对象存储在变量中并重用它

另一方面,您有设计问题,在这种情况下,您必须使用,其中它指示每个类都有一个函数,并且必须为其他对象提供访问信息的方法,在Qt/PyQt中,传输信息的最简单方式是通过信号,在这种情况下,当加载数据帧时,将发出一个带有新头的信号,该信号必须连接到另一个类的方法,以便它更新QComboBox的信息

从PyQt5导入QtCore、QtGui、qtwidget
作为pd进口熊猫
类FileOpenTab(QtWidgets.QWidget):
headersChanged=QtCore.pyqtSignal(列表)
def uuu init uuu(self,parent=None):
super(FileOpenTab,self)。\uuuu init\uuuuu(父级)
excel\u加载\u按钮=qtwidts.QPushButton(
“打开Excel文件”,单击=self.load\u文件
)
self.excel_table=QtWidgets.QTableWidget()
lay=qtwidts.QVBoxLayout(self)
lay.addWidget(excel\u加载\u按钮)
lay.addWidget(self.excel\u表)
@QtCore.pyqtSlot()
def加载_文件(自):
filter_excel_only=“excel文件(*.xlsx)”
文件名,u=QtWidgets.QFileDialog.getOpenFileName(
self,“打开Excel文件”,“仅筛选Excel”
)
如果文件名为:
df=pd.read\u excel(文件名,na\u filter=False)
自填表格(df)
def fill_表格(自身,数据帧):
行计数,列计数=dataframe.shape
self.excel\u table.setColumnCount(column\u count)
self.excel\u table.setRowCount(行数)
标题=列表(dataframe.columns)
self.excel_table.setHorizontalHeaderLabels(标题)
self.headersChanged.emit(标题)
类RowRemoveUleStab(QtWidgets.QWidget):
def uuu init uuu(self,parent=None):
超级(RowRemoveUleStab,self)。\uuuuu初始化(父级)
self.rule_select=qtwidts.QComboBox()
group_box=qtwidts.QGroupBox(“规则1:”)
vbox=qtwidts.QVBoxLayout()
vbox.addWidget(self.rule\u select)
组框设置布局(vbox)
lay=qtwidts.QVBoxLayout(self)
lay.addWidget(分组框)
@QtCore.pyqtSlot(列表)
def更新_项目(自身、项目):
self.rule_select.clear()
self.rule\u select.addItems(项目)
类BOMAppWindow(QtWidgets.QMainWindow):
def uuu init uuu(self,parent=None):
超级(BOMAppWindow,self)。\uuuuu初始化(父级)
file\u open\u tab=FileOpenTab()
行删除规则选项卡=行删除规则选项卡()
文件\打开\选项卡。标题已更改。连接(行\删除\规则\选项卡。更新\项)
mainTabWidget=QtWidgets.QTabWidget()
mainTabWidget.addTab(文件打开选项卡,“文件打开”)
mainTabWidget.addTab(行删除规则选项卡,“行删除规则”)
self.setCentralWidget(mainTabWidget)
如果名称=“\uuuuu main\uuuuuuuu”:
导入系统
app=qtwidts.QApplication(sys.argv)
w=BOMAppWindow()
w、 show()
sys.exit(app.exec_())