背景需求
基本上Python中都是习惯用Dataframe处理数据,效率高,读写多样并且方便。但是拿到了正确的数据还需要展示到界面上,毕竟大多数应用都是需要交互界面的。那么如何方便地把df数据展示到gui界面呢?
解决方案- 我这里用的是Pyqt做gui界面。Pyqt中Table类的组件有两个,一个tablewidget一个tableview,我这里推荐用Tableview,因为TableView有一个setModel的方法,可以直接将数据模型的数据整体展现出来,而不用自己去写一个一个Cell的数据加载逻辑。
- 直接使用下面这个类,这个类就是一个Model,通过构建这个类的实例,能够将一个简单Df的数据方便转换成TableView可以加载的Model对象。
class PdTable(QAbstractTableModel):
def __init__(self, data, showAllColumn=False):
QAbstractTableModel.__init__(self)
self.showAllColumn = showAllColumn
self._data = data
def rowCount(self, parent=None):
return self._data.shape[0]
def columnCount(self, parent=None):
return self._data.shape[1]
def data(self, index, role=Qt.DisplayRole):
if index.isValid():
if role == Qt.DisplayRole:
return str(self._data.iloc[index.row(), index.column()])
return None
def headerData(self,col,orientation,role):
if orientation == Qt.Horizontal and role == Qt.DisplayRole:
if type(self._data.columns[col]) == tuple:
return self._data.columns[col][-1]
else:
return self._data.columns[col]
elif orientation == Qt.Vertical and role == Qt.DisplayRole:
return (self._data.axes[0][col])
return None
- 在使用这个类的时候,就是简单地把df传给这个类的构造函数,实例化出来的Model再作为参数赋给tableview的setModel方法。
search_result_model = PdTable(df_search)
self.tableView_result.setModel(search_result_model)
- 真的是非常地方便,并且行列也都给你正确显示出来了。
- 调查下来,似乎pyqt的tableview组件本身就存在一个显示,无法加载多列头的数据。所以目前遇到展示多列头的情况,我还是只好硬写TableWidget赋值逻辑来应对。大家如果有更好的方法,欢迎在留言区提醒。