当前位置: 首页 > 知识库问答 >
问题:

使用pyqt5从数据库加载数据时显示GIF

张子墨
2023-03-14

我如何可以显示一个加载GIF图像或Qtag更新,而我加载数据从数据库与QAbstractTableModel.我是新的pyqt5,我尝试了从上周,但不明白我怎么能做到这一点。

我在stackoverflow中找到了很多例子,但我确实无法处理Qthread。我不想为它使用计时器,因为我可以在许多示例中看到正在使用qtimer。在表中加载完成时,加载gif将自动关闭。谁能告诉我怎么做,并描述所有的事情。

from PyQt5 import QtCore, QtWidgets
import pandas as pd
import numpy as np
import pyodbc

class NumpyArrayModel(QtCore.QAbstractTableModel):
    def __init__(self, array, headers, parent=None):
        QtCore.QAbstractTableModel.__init__(self, parent=parent)
        self._array = array
        self._headers = headers
        self.r, self.c = np.shape(self.array)

    @property
    def array(self):
        return self._array

    @property
    def headers(self):
        return self._headers

    def rowCount(self, parent=QtCore.QModelIndex()):
        return self.r

    def columnCount(self, parent=QtCore.QModelIndex()):
        return self.c

    def headerData(self, p_int, orientation, role):
        if role == QtCore.Qt.DisplayRole:
            if orientation == QtCore.Qt.Horizontal:
                if p_int < len(self.headers):
                    return self.headers[p_int]
            elif orientation == QtCore.Qt.Vertical:
                return p_int + 1
        return

    def data(self, index, role=QtCore.Qt.DisplayRole):
        if not index.isValid():
            return None
        row = index.row()
        column = index.column()
        if row < 0 or row >= self.rowCount():
            return None
        if column < 0 or column >= self.columnCount():
            return None
        if role == QtCore.Qt.DisplayRole:
            return str(self.array[row, column])
        return None

    def setData(self, index, value, role):
        if not index.isValid():
            return False
        if role != QtCore.Qt.EditRole:
            return False
        row = index.row()
        column = index.column()
        if row < 0 or row >= self.rowCount():
            return False
        if column < 0 or column >= self.columnCount():
            return False
        self.array.values[row][column] = value
        self.dataChanged.emit(index, index)
        return True

   
class Widget(QtWidgets.QWidget):
    def __init__(self, parent=None):
        QtWidgets.QWidget.__init__(self, parent=None)
        vLayout = QtWidgets.QVBoxLayout(self)
        hLayout = QtWidgets.QHBoxLayout()
        self.pathLE = QtWidgets.QLabel(self)
        hLayout.addWidget(self.pathLE)
        self.loadBtn = QtWidgets.QPushButton("Load data", self)
        hLayout.addWidget(self.loadBtn)
        vLayout.addLayout(hLayout)
        self.pandasTv = QtWidgets.QTableView(self)
        vLayout.addWidget(self.pandasTv)
        self.loadBtn.clicked.connect(self.loadFile)
        self.pandasTv.setSortingEnabled(True)


    def loadFile(self):
        self.pathLE.setText("Loading data")

        server = '190.11.71.09'
        database = ''
        username = 'Admin'
        passwd = ''
        conn= pyodbc.connect('DRIVER={ODBC Driver 17 for SQL Server};SERVER=' +
                          server+';DATABASE='+database+';UID='+username+';PWD=' + passwd)

        query="select * from database.dbo.tableName(nolock)"

       
        df = pd.read_sql_query(query, conn)
        array = np.array(df.values)
        headers = df.columns.tolist()
        model = NumpyArrayModel(array, headers)
        self.pandasTv.setModel(model)


if __name__ == "__main__":
    import sys

    app = QtWidgets.QApplication(sys.argv)
    w = Widget()
    w.show()
    sys.exit(app.exec_())

共有1个答案

阴阳
2023-03-14

了解如何显示GIF图像。然后学习如何通过按钮触发动作。

不要因为实施你的行动而陷入典型的困境

  • 显示GIF文件
  • 加载数据
  • 隐藏GIF,因为这将绑定触发您操作的一个线程。这一个线程对于保持UI更新至关重要

因此,当按下按钮时,您需要做什么:

  • 生成一个新的线程来执行一些代码

在新线程中,要执行的代码包含以下语句:

  • 显示GIF
  • 加载数据
  • 隐藏GIF(即使数据加载失败)

对于显示、隐藏和最终呈现加载的数据,您必须注意,因为现在您试图从另一个线程修改UI-这将需要某种处理。顺便说一句,这种行为并不特定于Qt。您将在JavaAWT和Swing中找到类似的东西。

 类似资料:
  • 在本教程中,将学习如何在SQL Server中创建新数据库并执行脚本以加载示例数据库。 首先,如果您还没有示例数据库,则需要下载以下文件: 下载SQL Server示例数据库 第二步,解压缩下载的zip文件,会看到三个SQL脚本文件: - 此文件用于创建包括模式和表的数据库对象。 - 此文件用于将数据插入表中。 - 此文件用于从示例数据库中删除表及其模式。 当想要刷新示例数据库时,它非常有用。 第

  • 应用程序运行良好...只是数据没有出现...我已经添加了sha用户电子邮件显示在登录后,在登录活动中我已经添加了 但是在实时数据库数据不显示以防万一…我也等了半个小时,尝试了所有的东西…网络也不错。数据库中的数据库规则的数据库图片 mainActivity.java//不能用于单个子级,即firebaseDatabase.getInstance().getReference().child(“aj

  • 问题内容: 是否可以使用Custom Spring PropertyPlaceholderConfigurer从数据库加载属性?提供给自定义PropertyPlaceholderConfigurer的数据源是否有可能在类路径中使用特定的属性文件? 我无法通过以下链接找到满意的答案? http://www.mkyong.com/spring/spring-propertyplaceholdercon

  • 问题内容: 在数据完成加载之前,如何使AngularJS显示加载微调框? 如果我的控制器是静态设置的,并且填充了AJAX加载器,我希望微调器显示直到AJAX加载完成,然后使用检索到的数据填充绑定范围。 此代码立即填充绑定范围,并且如果为空,则微调框将被替换为空。 我应该如何干净地做这件事? 问题答案: 我会根据其他答案创建一个自定义指令,但是这是没有指令的情况下如何实现的,这可能是在进入更复杂的功

  • 本文向大家介绍jQuery Ajax 加载数据时异步显示加载动画,包括了jQuery Ajax 加载数据时异步显示加载动画的使用技巧和注意事项,需要的朋友参考一下  ajax加载后台数据就不说的那么细了。 看下面代码首先前台上放置代码 在js脚本文件中首先把这个图片动画隐藏 代码如下 然后异步ajax提交请求代码如下 ..................... 注意: async: true, 当

  • 问题内容: 问题 我尝试使用以下 在此页面上:http : //grb.sonoma.edu : 81/paging.php从数据库加载数据。方法1仅在IE8中有效,但仅在刷新页面后才有效。首次加载页面时,我收到“完成此操作所需的数据尚不可用”。错误。 我更喜欢方法1的原因是因为它使我可以访问表中的各个行。例如,每一行都有一个“突发”类。我在用 单击时更改所选行的颜色。这似乎仅适用于方法1,而不适