wxPython应用开发-后台线程更新大量数据到wxGrid避免ui无响应

一、问题描述

最近几天,我在用python开发一个数据处理的小工具。需要将xls文件中的大量数据(少则几千行多则几万行)读取出来后进行处理。其中一个功能是需要实现将读取到的原始数据和计算出来的结果在软件界面中以表格形式展示出来。

在python应用开发中,我基本用wxFormBuilder进行软件界面的设计,因此用到wxPython的时候很多。wxPython中的表格类是wx.grid。这次开发过程中遇到的问题是,通过pandas将几万行数据从xls文件中读取到dataframe中后,再更新到软件主界面中的wxGrid中时,由于数据很大,导致软件ui在一段时间内无响应,一直到数据全部写入"时点库存表“中后,才会响应。

(从xls文件读取几万行数据后,向wxGrid加载数据时,出现未响应提示)

本软件中将数据从dataframe对象(self.df_kcb)写入到ui上显示为“时点库存表“的wxGrid对象(self.m_grid_kcb)中的关键代码如下:

# self.m_grid_kcb是wxGrid对象,self.df_kcb是dataframe对象
# 在执行下述代码之前,会首先清空self.m_grid_kcb
# 然后根据self.df_kcb中的数据行数修改self.m_grid_kcb行数,使两者保持一致for x in range(self.grid_kcb_rows):  # self.grid_kcb_rows为表格行数for y in range(6):  # 本软件中为时点库存表为6列self.m_grid_kcb.SetCellValue(x, y, str(self.df_kcb.iloc[x][y]))  # 逐单元格将数据写入wxGrid中

该代码使用了双循环语句,逐个单元格的写入数据,效率不高,在遇到几万行数据时,就导致了ui无响应了。

二、解决办法

我在网上搜索相应的解决办法,找到了如下的一段话。

————————————————————————————————————————

在Python中,将大量数据写入wxPython的wx.grid.Grid控件可能会导致UI响应变慢。为了提高响应性,可以尝试以下方法:

1.分批写入数据:不要一次性将所有数据都加载到wx.grid.Grid中,而是使用分页或滚动机制,每次只加载可见的数据。

2.使用wx.lib.delayedresult:这个模块可以帮助你在一个单独的线程中处理数据的加载,从而不会阻塞UI线程。

3.避免不必要的更新:只有当数据真正改变时才更新wx.grid.Grid,避免不必要的重绘和布局操作。

————————————————————————————————————————

第一个方法,我在去年开发一款软件的时候已经用过了,那款软件中的dataframe对象内的数据量也是有上万行,采用分页显示,每次只显示当前页的几十行数据,通过导航按钮切换页面,没有出现过未响应的情况。但这次我不准备采用这个方法,因为走重复的路是无法学到新知识的。

第二个方法,在那段话后面确实附带了相关的代码示例,但是我尝试将示例融合到我的代码中,确没有成功,总是出现错误。

第三个方法嘛,则不适合当前的应用场景。因为我的应用每次都会选择加载不同的数据,数据量也不一样,必然会对wxGrid中的所有内容都进行更新。

我仍然坚持在一个页面内显示所有的数据,那么就必须解决ui无响应的问题。再次搜索的时候,我使用了“python 如何实现在后台线程中将大量数据写入wxGrid”的关键字起到了作用,百度AI给了我一个有效的答案。

这个答案中的示例直接进行测试是有效的,在想wxGrid加载数据过程中,ui界面不会出现未响应的情况。

(直接运行后,界面有响应,往下拖可以看到数据还没有更新完)

(拖动滑动条的过程中,可以看到数据在更新)

这个代码的关键是用threading模块创建后台线程,并在线程中使用wxCallAfter方法更新wxGrid。

为了实现后台线程操作,要创建一个类:

class WorkerThread(threading.Thread):""" 后台线程向wxGrid加载数据 """def __init__(self, grid, df, rows, cols):threading.Thread.__init__(self)self.grid = gridself.df = dfself.rows = rowsself.cols = colsdef run(self):for row in range(self.rows):for col in range(self.cols):wx.CallAfter(self.grid.SetCellValue, row, col, str(self.df.iloc[row][col]))

然后在我的主程序中,将之前的更新wxGrid的双循环语句替换成以下的代码:

self.worker = WorkerThread(self.m_grid_kcb, self.df_kcb, self.grid_kcb_rows, 6)  # 后台线程更新到grid
self.worker.start()

我参照示例修改了自己的软件,让更新wxGrid的操作在后台线程中执行,就解决了ui未响应的问题了。效果如下:

(没有出现未响应的情况,可以拖动滑条到底,表格的行数已更新,但数据还没有更新完)

(数据更新完的情况,在更新过程中,可以拖动滑条查看数据更新情况)

三、百度AI给的答案和代码

我在百度ai搜索到的文字内容和示例代码如下(代码中我添加了一点标注):

在Python中,你可以使用threading模块来创建后台线程,并在该线程中更新wxPython界面中的wxGrid。为了安全地在不同的线程之间更新GUI,你需要使用wxPython提供的wx.CallAfter方法。

以下是一个简单的例子,展示如何在后台线程中将大量数据写入wxGrid:

import wx
import wx.grid
import threading
import timeclass MyFrame(wx.Frame):def __init__(self, parent):wx.Frame.__init__(self, parent, -1, "wxGrid Example")self.grid = wx.grid.Grid(self)# 创建并设置表格self.grid.CreateGrid(100, 2)  # 100行2列self.grid.SetRowLabelSize(-1)self.grid.SetColLabelSize(-1)# 创建并启动后台线程(这两行代码代替我之前写的双循环语句)self.worker = WorkerThread(self.grid)self.worker.start()# 这个类可以直接复制到自己的代码中后根据情况进行修改
class WorkerThread(threading.Thread):def __init__(self, grid):threading.Thread.__init__(self)self.grid = griddef run(self):# 模拟数据生成(这行代码,实际应用要替换成实际要写入wxGrid中的数据)data = [(i, i * 2) for i in range(100)]# 将数据写入wxGrid表格中(range方法中的行数和列数,按实际应用修改)for row in range(len(data)):for col in range(2):wx.CallAfter(self.grid.SetCellValue, row, col, str(data[row][col]))# 模拟耗时操作(这行代码,在实际应用中要删除)time.sleep(0.1)def main():app = wx.App(False)frame = MyFrame(None)frame.Show(True)app.MainLoop()if __name__ == '__main__':main()

在这个例子中,WorkerThread类是一个后台线程,它负责生成和处理数据。在MyFrame类的初始化方法中,创建了一个wx.grid.Grid对象,并启动了WorkerThread

WorkerThreadrun方法中,我们通过双层循环模拟了将数据填充到wxGrid中的过程。每设置完一个单元格的值后,我们使用wx.CallAfter来确保在GUI线程中执行这个更新。这样可以避免在后台线程中直接更新GUI,从而避免潜在的线程安全问题。

请注意,这个例子中的time.sleep(0.1)是模拟耗时操作,实际应用中应该去掉或替换为实际的计算或IO操作。此外,根据实际情况,你可能需要更复杂的同步机制,例如使用事件或其他同步原语来通知主线程更新GUI。

希望以上的内容,对大家有用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/18767.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

非线性优化:高斯-牛顿法的原理与实现

非线性优化:高斯-牛顿法的原理与实现 引言 在实际应用中,很多问题都是非线性的。非线性优化问题广泛应用于机器学习、数据拟合、工程设计等领域。高斯-牛顿法是一种常用于解决非线性最小二乘问题的迭代算法。本文将详细介绍高斯-牛顿法的原理、推导过程…

搜维尔科技:Movella Xsens用于动画,CG,短视频制作案例

用户名称 广州百漫文化传播有限公司 应用场景 基于Xsens MVN Link 动作捕捉系统的动画制作、CG制作、短视频制作、快速动画MAYA插件、影视动漫实时合成预渲染。 现场照片 《西行纪》内容简介:在远古神明的年代,世间存在着天众、龙众、阿修罗等八部众…

shell中编写备份数据库脚本(使用mysqldump工具)

mysqldump备份 目录 mysqldump备份 分库备份 分表备份 利用自带工具mysqldump 实现数据库分库分表备份。 要想知道需要备份哪些数据库,就得先列出来 mysql -uroot -pOpenlab123! -N -e show databases | egrep -on_schema|mysql|performance_schema|sys" …

JavaSE——类和对象(三)~~继承

目录 一.继承 1.为什么需要继承 2 .继承概念 3.继承的语法格式 4.继承的特性及好处 5.父类成员访问 6.继承关系上的代码块执行顺序​​​​​​​ 二.继承与组合 一.继承 1.为什么需要继承 Java中使用类对现实世界中实体来进行描述,类经过实例化之后的产物…

【记录】网络|没有路由器没有网线,分别使用手机或Windows电脑共享网络给ARM64开发板,应急连接

事情是这样的,我的开发板明明已经选择了记住热点 WiFi 密码,但是却没有在开机的时候自动连接,我又没有放显示器在身边,又不想为了这点事去找个显示器来,就非常难受。 我手边有的设备是: 笔记本电脑&#…

pytorch深度学习-环境搭建-2

1.1下载cudnn,解压 1.2.找到本级cuda安装路径 1.3.刚才解压文件复制到cuda安装目录 2.1 安装pytouch conda install pytorch torchvision torchaudio pytorch-cuda12.1 -c pytorch -c nvidia 3.pytouch验证 我这儿是有问题的 PS C:\Users\Administrator\PycharmProjects\pyth…

【ORB_SLAM系列3】—— 如何在Ubuntu18.04中使用自己的单目摄像头运行ORB_SLAM3(亲测有效,踩坑记录)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、ORB_SLAM3源码编译二、ORB_SLAM3实时单目相机测试1. 查看摄像头的话题2. 运行测试 三. 运行测试可能的报错1. 报错一(1) 问题描述(2) 原因分析(3) 解决 2. …

防火墙技术基础篇:配置主备备份的双机热备

防火墙技术基础篇:配置主备备份的双机热备 防火墙双机热备(High Availability, HA)技术是网络安全中的一个关键组成部分,通过它,我们可以确保网络环境的高可靠性和高可用性。下面我们一起来了解防火墙双机热备的基本原…

python-合并排列数组 I

问题描述:合并两个按升序排列的整数数组a和b,形成一个新数组,新数组也要按升序排列。 问题示例:输入A[1],B[1],输出[1,1],返回合并后的数组。输入A[1,2,3,4],B[2,4,5,6],输出[1,2,2,3,4,4,5,6],返回合并所有元素后的数组。 完整代…

社交媒体数据恢复:百度贴吧

一、准备工作 请先确保您已登录百度账号,并熟悉百度贴吧的基本操作。 二、找回被系统删除的帖子 进入“我的”页面:在百度贴吧主页中,点击右下角的“我的”。 进入“我的帖子”页面:在个人中心页面中,点击“我的帖子…

力扣hot100:23. 合并 K 个升序链表

23. 合并 K 个升序链表 这题非常容易想到归并排序的思路,俩升序序列合并,可以使用归并的方法。 不过这里显然是一个多路归并排序;包含多个子数组的归并算法,这可以让我们拓展归并算法的思路。 假设n是序列个数,ni是…

大规模服务治理中etcd的实践与深度应用

导读:随着企业对于服务治理的日益重视,特别是在云原生和微服务架构的广泛应用下,百度小程序团队基于大模型服务治理的实战经验,结合分布式开源KV产品etcd,分享了其核心技术Raft与boltdb的实现原理,并深入剖…

Simulink从0搭建模型07-P8for循环的使用

Simulink从0搭建模型07-P8for循环的使用 今日学习内容1. For Iterator Subsystem模块介绍1.1. 累加器1.2. For Iterator1.3.小结 2. states介绍3. Set next i(相当break)学习心得 今日学习内容 b站视频 【Simulink 0基础入门教程 P8 for循环的使用 For Itrator Sub…

基于 Coze 从 0-1 搭建专属 小白的Bot 机器人

基于 Coze 从 0-1 搭建专属 小白的Bot 机器人 ​ 作为一个GIS从业人员,对于AI的使用是必不可少的,在过去的一两年里各种大模型频出,AI技术已经成为GIS领域的一项重要工具,为我们提供了许多强大的功能和解决方案。看到好文章都在介…

【Android】【netd】网络相关调试技巧

网络调试技巧总结 ifconfig ifconfig 查看网卡信息 ifconfig -S tcpdump tcpdump -i any -n icmp 查看流量出入ip addr 上面的log 以及ifcong -S 信息可以知道,当前是从wlan0 网卡请求数据。 iptable iptable 部分指令 //禁止www.baidu.com 网址流量进入&a…

2024广东省赛 G.Menji 和 gcd

题目 #include <bits/stdc.h> using namespace std; #define int long long #define pb push_back #define fi first #define se second #define lson p << 1 #define rson p << 1 | 1 #define ll long long const int maxn 1e6 5, inf 1e12, maxm 4e4 …

【测评】雨云香港三区云服务器,2核2G 5兆,仅需38元/月

写在前面 雨云香港三区云服务器&#xff0c;高性能的 AMD EPYC 处理器 企业级 NVME SSD 高性能云服务器。2核2G 10兆 400G防御&#xff0c;仅需38元/月&#xff0c;年付7折仅 319.2元/年。 官网&#xff1a;https://www.rainyun.com 本次测评服务器配置如下&#xff1a; C…

【JavaScript】P1 JavaScript 是什么、其组成

1.1 JavaScript 是什么 JavaScript 是一种运行在浏览器的编程语言&#xff0c;用于实现人机交互效果。其作用包含&#xff1a; 监听用户行为并指导网页做出反馈。针对表单数据进行合法性验证。获取后台数据&#xff0c;渲染到前端界面。服务器编程&#xff0c;最后端的事情&a…

什么是老板和工程师都喜欢的FMEA?——FMEA软件

免费试用FMEA软件-免费版-SunFMEA 在企业管理与工程技术领域&#xff0c;FMEA&#xff08;潜在失效模式与效应分析&#xff09;早已不仅仅是一个概念或工具&#xff0c;它更是一种思维方式和团队协作的精髓。那么&#xff0c;究竟什么才是老板和工程师都喜欢的FMEA呢&#xff…

安卓ADB通过WIFI无线连接手机[通过无线安装APK]

安卓ADB通过无线连接手机 本文摘录于&#xff1a;https://www.cnblogs.com/zhuxibo/p/14261117.html只是做学习备份之用&#xff0c;绝无抄袭之意&#xff0c;有疑惑请联系本人&#xff01; 别人给的操作确实可行,我这里实操记录如下: AdministratorpiaoranPC MINGW64 /e/Wor…