Python 如何在创建为类的PyQt5选项卡之间更新值
我在PyQT5中创建了两个选项卡作为单独的类。第一个类(选项卡)用于加载excel文件,第二个类用于设置删除不需要的行的规则。当我加载文件时,我需要将所有标题发布到其他选项卡中的QComboBox,以便我可以创建规则。不能让它工作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().__
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_())