首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >【Python技术】利用PySide6做个问财查询结果GUI界面例子

【Python技术】利用PySide6做个问财查询结果GUI界面例子

作者头像
子晓聊技术
发布2026-04-23 14:06:48
发布2026-04-23 14:06:48
450
举报
文章被收录于专栏:子晓AI量化子晓AI量化

前面一篇文章写了通过pywencai查询并钉钉提醒, 有同学问我为啥不提供GUI界面。 之前的文章我推荐过PyQt 框架。

上次经过读者提醒,我才细细看了下PyQt 和PySide区别。这里列一下,希望GUI界面选择的时候做对比。


PyQt 与 PySide 的核心区别

1. 许可证与商业适用性
  • PyQt:采用 GPL商业许可证。开源项目需遵守 GPL 协议,闭源项目必须购买商业许可。
  • PySide:采用 LGPL 许可证,允许闭源商业项目免费使用,无需公开源代码,更适合企业开发。

选择建议

  • 开源项目:两者均可,但 PyQt 社区资源更丰富。
  • 商业闭源:优先选择 PySide,避免许可证风险。

开发者与维护支持
  • PyQt:由第三方公司 Riverbank Computing 维护,历史更久(1998 年发布),版本更新相对滞后于 Qt 官方。
  • PySide:由 Qt 官方团队 直接维护(如 PySide6 对应 Qt6),更新与 Qt 核心版本同步,长期支持更有保障。

选择建议

  • 需要最新 Qt 特性时,优先选择 PySide。

那如果新学做GUI界面,还是选择PySide6好了,以免以后的商业纠纷。 GUI界面还有Tkinter、wxPython选择。 今天无意还看公众号给我推荐了PyMe可视化界面,设计理念挺好的,半开源让我没继续看下去。

既然这里主要讲PySide6, 那我简单提供个例子,输入搜索条件,下方出现pywencai 得到的搜索结果。 结果形如上面的界面。

其实代码我是借助AI生成的, GUI界面调样式对我来说还是有点痛苦, 虽然基础语法大体了解了。年纪大了,不想动手一行行手敲了。

最后附上源代码,需要的自取。 备注:如果发现格式有多余的特殊字符,用普通浏览器打开复制应该没问题。

代码语言:javascript
复制
import sys
from PySide6.QtWidgets import QApplication, QMainWindow, QVBoxLayout, QHBoxLayout, QPushButton, QLineEdit, QWidget, QTableWidget, QTableWidgetItem, QLabel, QHeaderView, QMessageBox
from PySide6.QtCore import Qt
import pandas as pd
import pywencai
import json
class StockFilterApp(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("股票筛选系统")
        self.setGeometry(100, 100, 1200, 800)

        # 创建主窗口部件
        central_widget = QWidget()
        self.setCentralWidget(central_widget)

        # 创建主布局
        main_layout = QVBoxLayout(central_widget)

        # 创建顶部搜索区域
        search_layout = QHBoxLayout()

        # 添加搜索标签
        search_label = QLabel("输入筛选条件:")
        search_layout.addWidget(search_label)

        # 添加搜索输入框
        self.search_input = QLineEdit()
        self.search_input.setPlaceholderText("例如: 涨停")
        search_layout.addWidget(self.search_input)

        # 添加搜索按钮
        search_button = QPushButton("搜索")
        search_button.clicked.connect(self.search_stocks)
        search_layout.addWidget(search_button)

        # 将搜索区域添加到主布局
        main_layout.addLayout(search_layout)

        # 添加状态标签
        self.status_label = QLabel("准备就绪")
        main_layout.addWidget(self.status_label)

        # 创建表格用于显示结果
        self.result_table = QTableWidget()
        self.result_table.setEditTriggers(QTableWidget.EditTrigger.NoEditTriggers)  # 设置表格为只读
        main_layout.addWidget(self.result_table)

    def search_stocks(self):
        query = self.search_input.text()
        if not query:
            QMessageBox.warning(self, "警告", "请输入筛选条件")
            return

        self.status_label.setText(f"正在查询: {query}...")
        try:
            # 使用pywencai获取数据
            df = pywencai.get(query=query, loop=True)
            self.display_results(df)
            self.status_label.setText(f"查询完成: 找到 {len(df)} 条结果")
        except Exception as e:
            self.status_label.setText(f"查询出错: {str(e)}")
            QMessageBox.critical(self, "错误", f"查询失败: {str(e)}")

    def display_results(self, df):
        # 清空表格
        self.result_table.clear()

        if df.empty:
            self.result_table.setRowCount(0)
            self.result_table.setColumnCount(0)
            self.status_label.setText("没有找到匹配的结果")
            return

        # 处理DataFrame,去除JSON格式的列
        filtered_columns = []
        for col in df.columns:
            # 检查列中的值是否为JSON格式
            is_json_column = False
            for value in df[col].dropna().head(10).astype(str):
                # 检查是否为JSON对象或JSON数组
                if (value.startswith('{') and value.endswith('}')) or (value.startswith('[') and value.endswith(']')):
                    try:
                        json.loads(value)
                        is_json_column = True
                        break
                    except:
                        pass

            if not is_json_column:
                filtered_columns.append(col)

        # 如果所有列都被过滤掉了,保留原始DataFrame
        if not filtered_columns:
            filtered_df = df
        else:
            filtered_df = df[filtered_columns]

        # 设置表格列数和列标题
        self.result_table.setColumnCount(len(filtered_df.columns))
        self.result_table.setHorizontalHeaderLabels(filtered_df.columns)

        # 设置表格行数
        self.result_table.setRowCount(len(filtered_df))

        # 填充表格数据
        for row in range(len(filtered_df)):
            for col in range(len(filtered_df.columns)):
                value = str(filtered_df.iloc[row, col])

                # 检查单元格值是否为JSON格式,如果是则提取有用信息
                if (value.startswith('{') and value.endswith('}')) or (value.startswith('[') and value.endswith(']')):
                    try:
                        json_data = json.loads(value)
                        # 处理JSON对象
                        if isinstance(json_data, dict):
                            # 提取第一个非空值
                            for json_value in json_data.values():
                                if json_value:
                                    value = str(json_value)
                                    break
                        # 处理JSON数组
                        elif isinstance(json_data, list) and json_data:
                            # 如果是数组,显示数组长度或第一个元素的摘要
                            value = f"数组[{len(json_data)}项]"
                    except:
                        pass

                item = QTableWidgetItem(value)
                self.result_table.setItem(row, col, item)

        # 调整列宽以适应内容
        self.result_table.horizontalHeader().setSectionResizeMode(QHeaderView.ResizeMode.ResizeToContents)

        # 设置交替行颜色
        self.result_table.setAlternatingRowColors(True)

        # 更新状态标签
        self.status_label.setText(f"查询完成: 找到 {len(filtered_df)} 条结果,显示 {len(filtered_df.columns)} 列")
if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = StockFilterApp()
    window.show()
    sys.exit(app.exec())
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-05-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 子晓聊技术 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • PyQt 与 PySide 的核心区别
    • 1. 许可证与商业适用性
    • 开发者与维护支持
  • 最后附上源代码,需要的自取。 备注:如果发现格式有多余的特殊字符,用普通浏览器打开复制应该没问题。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档