首页 > 编程问答 >搜索查询后显示完整的 pandas

搜索查询后显示完整的 pandas

时间:2024-08-01 06:22:23浏览次数:14  
标签:python pandas pyqt6

我想实现以下非常小的项目,即用户应该输入产品名称,Python应该在数据库中搜索并在pyqt6桌面应用程序中显示查询结果,为此我已经实现了以下基本GUI形式: enter image description here

这里用户输入产品,然后单击按钮,结果将显示在空白处,即: QTextEdit() ,最有趣的部分是这个功能:

def return_product_info(self):
        input_text =self.inputField.text()
        
        df = pd.read_sql_query('''SELECT * FROM "foreign_products" where "product" = '{}'
        '''.format( input_text), con=engine)
        print(df.head())
        self.output.setText(df)

引擎部分被隐藏(它工作正常),唯一有趣的部分是:

 self.output.setText(df)

如何我可以将 df 放入 QTextEdit() 中吗?我做了一些研究,发现我可以基于此链接使用 QTableView QTableView

但是我如何将所有这些连接到一个项目中?这是应用程序的主要代码

class MyApp(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("Database Search")
        self.setWindowIcon(QIcon("db.jpg"))
        self.resize(500,500)
        layout =QVBoxLayout()
        self.setLayout(layout)
        self.inputField =QLineEdit()
        self.button =QPushButton("click me")
        self.button.clicked.connect(self.return_product_info)
        self.output =QTextEdit()
        layout.addWidget(self.inputField)
        layout.addWidget(self.button)
        layout.addWidget(self.output)

结果我想看到的是: enter image description here

这显示在控制台上,但我想在按钮下方的文本编辑器中(“单击我”),请帮助我如何做到这一点


你不能直接将一个pandas DataFrame放入 QTextEdit 中。 QTextEdit 是为显示纯文本设计的,而不是像DataFrame这样结构化的数据。

你有几个选项可以实现你想要的结果:

1. 使用 QTableView:

这是展示表格数据的最佳方式。你需要创建一个 QTableView ,然后使用 QAbstractTableModel 的子类来连接你的 DataFrame 和表格视图。

以下是修改后的代码:

import sys
from PyQt6.QtWidgets import QApplication, QWidget, QVBoxLayout, QLineEdit, QPushButton, QTableView
from PyQt6.QtGui import QIcon
from PyQt6.QtCore import Qt
import pandas as pd
from pandas.core.frame import DataFrame

# 替换为你的数据库连接
engine = ...

class PandasModel(QtCore.QAbstractTableModel):
    def __init__(self, df = DataFrame(), parent=None):
        QtCore.QAbstractTableModel.__init__(self, parent=parent)
        self._df = df

    def rowCount(self, parent=QModelIndex()):
        return len(self._df.index)

    def columnCount(self, parent=QModelIndex()):
        return len(self._df.columns)

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

    def headerData(self, section, orientation, role=Qt.ItemDataRole.DisplayRole):
        if role != Qt.ItemDataRole.DisplayRole:
            return None

        if orientation == Qt.Orientation.Horizontal:
            try:
                return str(self._df.columns.tolist()[section])
            except (IndexError, ):
                return None
        elif orientation == Qt.Orientation.Vertical:
            try:
                # return self.headerList[section]
                return str(self._df.index[section])
            except (IndexError, ):
                return None

class MyApp(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("Database Search")
        self.setWindowIcon(QIcon("db.jpg"))
        self.resize(500,500)
        layout =QVBoxLayout()
        self.setLayout(layout)

        self.inputField =QLineEdit()
        self.button =QPushButton("click me")
        self.button.clicked.connect(self.return_product_info)

        self.table_view = QTableView()
        layout.addWidget(self.inputField)
        layout.addWidget(self.button)
        layout.addWidget(self.table_view)

    def return_product_info(self):
        input_text = self.inputField.text()
        df = pd.read_sql_query(
            '''SELECT * FROM "foreign_products" where "product" = '{}' '''.format(
                input_text), con=engine)

        model = PandasModel(df)
        self.table_view.setModel(model)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = MyApp()
    window.show()
    sys.exit(app.exec())

2. 将 DataFrame 格式化为字符串并显示在 QTextEdit 中:

这不是理想的解决方案,但如果你只需要显示数据而不是进行交互,则可以使用。 你可以使用 pandas 的 to_string() to_html() 方法将 DataFrame 转换为字符串,然后使用 setText() 将其设置到 QTextEdit 中。

以下是修改后的代码:

import sys
from PyQt6.QtWidgets import QApplication, QWidget, QVBoxLayout, QLineEdit, QPushButton, QTextEdit
from PyQt6.QtGui import QIcon
import pandas as pd

# 替换为你的数据库连接
engine = ...

class MyApp(QWidget):
    def __init__(self):
        # ... (其他代码相同) ...

    def return_product_info(self):
        input_text = self.inputField.text()
        df = pd.read_sql_query(
            '''SELECT * FROM "foreign_products" where "product" = '{}' '''.format(
                input_text), con=engine)

        # 将 DataFrame 转换为字符串并显示在 QTextEdit 中
        self.output.setText(df.to_string())

if __name__ == '__main__':
    # ... (其他代码相同) ... 

请记住,使用 to_html() 方法可以获得更美观的输出,但需要设置 QTextEdit 以正确呈现 HTML。

标签:python,pandas,pyqt6
From: 78818469

相关文章

  • 如何从python读取matlab持续时间对象
    我创建一个matlab持续时间对象并将其保存到.mat文件:timeend=seconds(123);save('time.mat',timeend,'-v7.3');然后我从python读取它:withh5py.File('time.mat','r')asf:var=f['timeend'][:]print(list(var))......
  • 通过 python 连接到 Snowflake 时出错“UnpicklingError: invalid load key, '\x00'
    我在使用snowflake.connector.connect通过python连接到snowflake时遇到以下错误importsnowflake.connector#pipinstallsnowflake-connector-python#iamgettingtheenvfrom.envfileistoredlocallycnx=snowflake.connector.connect(user=os.getenv('USER'),pass......
  • Pandas 合并重复行
    我有一个特定的用例,其中我有2个数据帧,它们有2个相同的行(除了1列)。相同的行,我需要与相同的行匹配,任何不匹配的行都需要垂直堆叠。这是场景df1=pd.Dataframe({'id':[0,1,2],'account':['a','b','c'],'details':[[{'a':......
  • Python Selenium 单击 webdriverwait 与 find_element
    我无法理解这两个代码块之间的区别。发送点击在webdriverwait和find_elements中都有效。代码1fromseleniumimportwebdriverfromselenium.webdriver.common.byimportByfromselenium.webdriver.support.uiimportWebDriverWaitfromselenium.webdriver.suppo......
  • Python 问题 如何创建在 PDF 中注册为剪切线的专色?
    我正在开发一个项目,需要我在图像周围创建一条剪切线,但在任何RIP程序(例如Versaworks或Flexi)上将其注册为实际剪切线时遇到困难。我尝试了很多不同的方法python库可以帮助解决这个问题,但我无法让它工作。我希望它像我们在Illustrator中所做的那样,创建一条名为CutConto......
  • 有没有办法将 geopandas 函数应用于除了引发错误的行之外的所有行?
    我正在尝试将缓冲区应用于600,000行的地理数据帧(作为更大过程的一部分),gdf包含几何线串和多线串。当我运行缓冲区代码行时:gdf['buffer_geometry']=gdf.buffer(305)我收到以下错误:GEOSException:TopologyException:分配的深度在-122500003700000处不匹配我......
  • 使用Python时如何避免`setattr`(和`getattr`)?以及是否有必要避免
    如果我想向协议缓冲区中的字段添加一个在编译时未知的值,我目前正在做setattr我通常不喜欢使用setattr,因为它看起来不太安全。但是当我知道该对象是protobuf时,我认为这很好,因为我设置它的值必须是protobuf允许的类型。所以也许它并不是真的不安全?让我举......
  • Java sshtools 生成的 EDDSA 签名与 Python 的 pycryptome 生成的签名不匹配
    我有一个python库,它使用pycryptodomelibrary使用openssh格式的ED25519私钥使用Ed25519算法对数据进行签名。然后需要使用sshtools库和相应的公钥在Java应用程序中验证签名。但是签名验证失败。约束:从文件中读取私钥/公钥很重要。我无法......
  • Elastic python请求超时错误:池达到最大大小,不允许更多连接
    我正在使用Elasticsearchpython模块。我正在尝试像这样建立到服务器的连接es=Elasticsearch([config.endpoint],api_key=config.key,request_timeout=config.request_timeout)服务器连接,然后我尝试执行丰富策略。es.enr......
  • 使用 python 将 JSON 数据空值导入数据库。收到此错误 - 数据需要字符串或类似字节的
    我正在尝试使用python将JSON数据集导入到我的PostgreSQL数据库,但在尝试导入null值时会抛出错误。表的名称是Loan_info。我在python中尝试过此操作:-forfieldinloan_info:ifloan_info[field]in['Null','null',None]:......