pyside6 + pandas

import sys
import pandas as pd
from PySide6.QtWidgets import (QTableView, QApplication, QVBoxLayout, QPushButton, QWidget, QLineEdit)
from PySide6.QtCore import QAbstractTableModel, Qt, QModelIndex

# 自定義的 Qt 模型,用於顯示 Pandas DataFrame 的數據
class PandasModel(QAbstractTableModel):
    def __init__(self, dataframe: pd.DataFrame, parent=None):
        QAbstractTableModel.__init__(self, parent)
        self._dataframe = dataframe

    def rowCount(self, parent=QModelIndex()) -> int:
        if parent == QModelIndex():
            return len(self._dataframe)
        return 0

    def columnCount(self, parent=QModelIndex()) -> int:
        if parent == QModelIndex():
            return self._dataframe.columns.size
        return 0

    def data(self, index: QModelIndex, role=Qt.ItemDataRole):
        if not index.isValid():
            return None
        if role == Qt.DisplayRole:
            return str(self._dataframe.iloc[index.row(), index.column()])
        return None

    def headerData(self, section: int, orientation: Qt.Orientation, role: Qt.ItemDataRole):
        if role == Qt.DisplayRole:
            if orientation == Qt.Horizontal:
                return str(self._dataframe.columns[section])
            if orientation == Qt.Vertical:
                return str(self._dataframe.index[section])
        return None

    def addRow(self, row_data):
        self.beginInsertRows(QModelIndex(), len(self._dataframe), len(self._dataframe))
        self._dataframe.loc[len(self._dataframe)] = row_data
        self.endInsertRows()

    def deleteRow(self, row):
        self.beginRemoveRows(QModelIndex(), row, row)
        self._dataframe.drop(self._dataframe.index[row], inplace=True)
        self._dataframe.reset_index(drop=True, inplace=True)
        self.endRemoveRows()

    def changeRow(self, row, row_data):
        self._dataframe.loc[row] = row_data
        self.dataChanged.emit(self.index(row, 0), self.index(row, self.columnCount()-1))

    def searchRows(self, query):
        return self._dataframe[self._dataframe.apply(lambda row: row.astype(str).str.contains(query).any(), axis=1)].index.tolist()

# 主要演示函數
def demo_functionality():
    app = QApplication(sys.argv)

    # 用於演示的示例 DataFrame
    df = pd.DataFrame({
        'Name': ['Alice', 'Bob', 'Charlie'],
        'Age': [28, 34, 45],
        'Occupation': ['Engineer', 'Doctor', 'Artist']
    })

    view = QTableView()
    model = PandasModel(df)
    view.setModel(model)

    # GUI 設置
    add_button = QPushButton("Add Row")
    delete_button = QPushButton("Delete Row")
    change_button = QPushButton("Change Row")
    search_button = QPushButton("Search")
    search_box = QLineEdit("Enter Search Query")
    
    def add_row():
        model.addRow(['New', 20, 'Unknown'])
    
    def delete_row():
        model.deleteRow(0)
    
    def change_row():
        model.changeRow(0, ['Changed', 50, 'Changed'])
    
    def search_row():
        results = model.searchRows(search_box.text())
        print(f'Search results: {results}')
        
    add_button.clicked.connect(add_row)
    delete_button.clicked.connect(delete_row)
    change_button.clicked.connect(change_row)
    search_button.clicked.connect(search_row)

    layout = QVBoxLayout()
    layout.addWidget(view)
    layout.addWidget(add_button)
    layout.addWidget(delete_button)
    layout.addWidget(change_button)
    layout.addWidget(search_box)
    layout.addWidget(search_button)

    container = QWidget()
    container.setLayout(layout)

    container.show()
    sys.exit(app.exec())

if __name__ == "__main__":
    demo_functionality()

以下是程式碼的主要說明:

匯入必要的模組:

sys:用於與系統進行交互的模組。
pandas as pd:用於處理數據的 Pandas 模組。
from PySide6.QtWidgets:用於建立 Qt 應用程式界面的模組。
from PySide6.QtCore:提供 Qt 核心功能的模組。
創建自定義的 Qt 模型 PandasModel,它是 QAbstractTableModel 的子類,用於將 Pandas DataFrame 的數據顯示在 Qt 表格視圖中。

PandasModel 類有以下方法:

init:初始化方法,接受一個 Pandas DataFrame 作為參數。
rowCount:返回行數。
columnCount:返回列數。
data:返回特定單元格的數據。
headerData:返回表頭數據。
addRow:添加一行數據。
deleteRow:刪除一行數據。
changeRow:更改一行數據。
searchRows:搜索包含特定查詢的行。
demo_functionality 函數創建了一個示例 Qt 應用程式,並在其中進行以下操作:

創建一個 Pandas DataFrame 用於顯示。
創建一個 Qt 表格視圖(QTableView)和與其關聯的 PandasModel 模型。
創建按鈕和搜索框,以便用戶可以添加、刪除、更改和搜索數據。
定義按鈕點擊事件的處理程序,以執行相應的操作。
最後,應用程式進入主函數,並呼叫 demo_functionality 函數以啟動應用程式。當使用者運行這個程式時,將顯示一個包含表格視圖和按鈕的窗口,允許用戶對 DataFrame 進行不同的操作。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
pyside 和 pymssql 是 Python 的两个库,分别用于 GUI 开发和数据库连接。 Pyside 是一个基于 Qt 框架的 Python GUI 库,可以用于开发跨平台的桌面应用程序。Pymssql 是一个 Python 连接 Microsoft SQL Server 数据库的库,可以方便地进行 SQL 查询和数据处理。 如果你需要开发一个基于 PySide 的桌面应用程序,并且需要连接 Microsoft SQL Server 数据库进行数据读写操作,可以使用这两个库进行开发。你需要先安装 PySide 和 pymssql 库,然后在代码中引入这两个库,进行 GUI 开发和数据库连接操作。以下是一个简单的示例代码: ```python import sys from PySide2.QtWidgets import QApplication, QMainWindow, QLabel, QLineEdit, QPushButton import pymssql class MainWindow(QMainWindow): def __init__(self): super().__init__() # 初始化 GUI 组件 self.label = QLabel(self) self.label.setText("请输入 SQL 查询语句:") self.label.move(10, 10) self.textbox = QLineEdit(self) self.textbox.move(10, 30) self.textbox.resize(280, 30) self.button = QPushButton('查询', self) self.button.move(10, 70) # 绑定按钮点击事件 self.button.clicked.connect(self.query) def query(self): # 获取 SQL 查询语句 sql = self.textbox.text() # 连接数据库 conn = pymssql.connect(server='localhost', user='username', password='password', database='database') # 执行 SQL 查询 cursor = conn.cursor() cursor.execute(sql) rows = cursor.fetchall() # 显示查询结果 result = "" for row in rows: result += str(row) + "\n" self.label.setText(result) if __name__ == '__main__': app = QApplication(sys.argv) window = MainWindow() window.setGeometry(100, 100, 300, 200) window.show() sys.exit(app.exec_()) ``` 这个示例程序包含一个文本框和一个按钮,用户可以输入 SQL 查询语句并点击按钮进行查询。程序使用 pymssql 库连接数据库,并执行用户输入的 SQL 查询语句。查询结果将显示在程序窗口中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值