首页 > 编程问答 >在 pyqt6 QTextEdit 中显示数据库查询

在 pyqt6 QTextEdit 中显示数据库查询

时间:2024-08-01 05:32:23浏览次数:9  
标签: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)

是对的, QTextEdit 用于显示纯文本,而不是表格数据。要显示 pandas DataFrame,使用 QTableView QAbstractTableModel 一起是更好的选择。

以下是如何修改代码以使用 QTableView 显示数据的步骤:

  1. 创建一个自定义模型类,继承自 QAbstractTableModel
from PyQt6.QtCore import Qt
from PyQt6.QtGui import QAbstractTableModel

class PandasModel(QAbstractTableModel):
    def __init__(self, data):
        super().__init__()
        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.ItemDataRole.DisplayRole):
        if role == Qt.ItemDataRole.DisplayRole:
            value = self._data.iloc[index.row(), index.column()]
            return str(value)

    def headerData(self, section, orientation, role=Qt.ItemDataRole.DisplayRole):
        if role == Qt.ItemDataRole.DisplayRole:
            if orientation == Qt.Orientation.Horizontal:
                return str(self._data.columns[section])
            else:
                return str(self._data.index[section])
  1. MyApp 类中,将 QTextEdit 替换为 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)

        # 使用 QTableView 替代 QTextEdit
        self.output = QTableView() 
        layout.addWidget(self.inputField)
        layout.addWidget(self.button)
        layout.addWidget(self.output)

    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,
        )

        # 创建模型并将其设置为 QTableView 的模型
        model = PandasModel(df)
        self.output.setModel(model)

现在,当你运行代码并输入产品名称后, QTableView 将会以表格的形式显示查询结果。

标签:python,pandas,pyqt6
From: 78818390

相关文章

  • Python 将脚本转换为 exe 并给出 PermissionError
    我有一个Python(Windows10)脚本,其功能之一是创建备份。这是函数:defcreate_backups(self,file:str,counter:int=None)->None:counter=counteror1res=self.re_obj.match(file)ifresisNoneorlen(res.groups())==0:back_file=......
  • conda update python 不会更新,但 conda update --all 会更新
    我正在尝试更新我的venv。这就是我看到的(base_test)>condaupdatepythonCollectingpackagemetadata(current_repodata.json):doneSolvingenvironment:done==>WARNING:Anewerversionofcondaexists.<==currentversion:4.10.3latestversion:24......
  • 如何使用 Selenium (python) 访问另一个影子根中影子根中的元素?
    我有以下代码和HTML结构(我不是这方面的专家)。我正在尝试抓取HTML代码末尾的96.00C元素,其路径是:Xpath://*[@id="_grid"]/set-class2/div2/text-binding//text()完整Xpath:/html/body/main/div/div3/div3/......
  • 在Python中,如何在一段时间内接受输入
    我正在尝试用Python制作一个蛇游戏,但不知道如何制作它,以便蛇在没有玩家输入的情况下继续移动,所以如果有人知道一个简单的方法来做到这一点,我需要在2秒后取消输入将不胜感激代码如下:importrandomimportsysplayerY=(1)playerX=(0)appleY=random.randint(1,10)appl......
  • 在Python中单步执行代码时是否可以引发异常
    当我在IDE(例如PyCharm)中单步执行代码时,我想转储函数的参数(以供以后使用,例如复制它)。计划的场景是在某处设置断点,然后引发异常(这不在我运行的代码中,这就是重点),并捕获它。代码应该如下所示:defexception_cathcher_decorator(func):try:returnfunc(*f_args,**f_k......
  • 解决python自动化操作异常处理的问题
    在python自动化领域,往往要用到pyautogui,pywin32等模块实现自动化操作。然而,这种自动化操作,本身具有一定的局限性,其中最主要的一个问题就是,一旦执行结果不按照脚本预设的来执行,往往会抛出异常,导致程序中断。解决这个问题,主要有这么几种思路:第一,每一次操作后分情况讨论。这种方......
  • Numpy&Pandas:Pandas库(50%-100%)
    目录前言一、排序1.使用索引排序2.使用变量值排序二、计算新变量1.新变量为常量2.根据原变量新增列3.基于一个原变量做函数运算4.在指定位置插入新列三、修改替换变量值1.对应数值替换2.指定范围替换四、虚拟变量变换五、数值变量分组六、数据分组七、分组汇......
  • Python爬虫入门03:用Urllib假装我们是浏览器
    文章目录引言Urllib库简介Request模块详解Error模块与异常处理Parse模块与URL解析Robotparser模块模拟浏览器请求使用Request方法添加请求头信息代码示例1.设置请求URL和请求头2.定义请求参数并转换为适当的格式3.使用Request方法封装请求4.发送请求并获取响应常用......
  • 请以零基础学Python 之 第二十讲 分组和贪婪匹配
    当我们处理字符串时,有时候需要根据特定的模式来分割或者提取信息。Python提供了强大的正则表达式库re,可以帮助我们实现这些复杂的字符串操作。本篇博客将介绍两个常用的正则表达式技巧:分组和贪婪匹配。分组(Grouping)在正则表达式中,分组是将多个模式单元组合为一个单元,以便......
  • 零基础学python 之 第十九讲 正则表达式
    当你开始学习Python编程时,正则表达式是一项非常强大的工具,用于处理文本数据中的模式匹配和搜索。本篇博客将带你从零开始学习如何在Python中使用正则表达式。1.什么是正则表达式?正则表达式(RegularExpression)是用于描述字符串模式的一种工具,可以用来匹配、查找、替换符合特......