PyQt解决QTableWidget显示大体型数据需要等待很久的问题

17 篇文章 3 订阅

问题:

在使用QTableWidget进行表格数据显示时,存在一个非常致命的问题,就是如果你的表格数据很大,那么它会在全部遍历完行和列之后才会一次性的全部显示,时间复杂度为n方。如果n非常大,常常需要等十多分钟,才能显示成功。

解决:

每遍历完一行就显示一行,并且添加进度条提示用户程序当前进度的百分比。

progressbar.py定义了一个进度条类 class progress

'''
    params:
    1、百分比 percentage
    2、显示的文字 text
'''

from tkinter import *

pb_x = 0
pb_y = 0
pb_width = 100
pb_height = 20

pb_bg = "white"
pb_fg = "green"
pb_frame_size = 0
canvas = Canvas



class progress:
    def __init__(self):
        pass

    # 初始化,创建Canvas实例,设定坐标和宽高
    def init(self, master, x=pb_x, y=pb_y,
             width=pb_width, height=pb_height,
             bg=pb_bg, fg=pb_fg,
             frame_size=pb_frame_size):
        global pb_x
        pb_x = x

        global pb_y
        pb_y = y

        global pb_width
        pb_width = width

        global pb_height
        pb_height = height

        global pb_bg
        pb_bg = bg

        global pb_fg
        pb_fg = fg

        global pb_frame_size
        pb_frame_size = frame_size

        global canvas
        canvas = Canvas(master, width=width, height=height, bg=pb_bg)
        canvas.place(x=x, y=y)

    # 运行进度条
    def run(self, master, percentage, text=None):
        global canvas
        fill_line = canvas.create_rectangle(1.5, 1.5, 0, 23, width=0, fill=pb_fg)
        canvas.coords(fill_line, (0, 0, percentage, 60))
        if text:
            label = Label(master, text=text)
            label.place(x=pb_x + pb_width, y=pb_y)
        master.update()

调用:

#实例化progress类
progressbar = progress()

root = Tk()
root.title("显示进度")
root.geometry("300x100")
progressbar.init(master=root, x=10, y=20)

input_table = df
input_table_colunms = input_table.shape[1]  # 获取表格列数
input_table_header = list_array  # 获取表头
self.tableWidget.setRowCount(len(input_table))  # 设置表格行数
self.tableWidget.setColumnCount(input_table_colunms)  # 设置表格列数
self.tableWidget.setHorizontalHeaderLabels(input_table_header)  # 给tablewidget设置行列表头
for i in range(len(input_table)):
    p = int(i/len(input_table)*100)
    progressbar.run(master=root, percentage=p, text="已成功显示:" + str(p) + "%")
    for j in range(input_table_colunms):
        x = str(input_table.iloc[i, j])
        self.tableWidget.setItem(i, j, QTableWidgetItem(x))  # dataframe中的内容依次显示在表格中
root.mainloop()
print("从数据库显示解码成功")

 

效果:

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

白日梦想家_胖七七

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值