WxPython界面如何用pubsub展示进程工作的进度条

目录
  • 环境需求
  • 安装 pubsub
  • 运行后, 点击 工作-开始

用WxPython做界面时, 如果数据操作时间比较长,会使 WxPython 界面处于假死状态,用户体验非常不好。

WxPython是利用pubsub来完成消息的传送。

下面提供一个   WxPython界面利用pubsub 展示进程工作的进度条的例子,实际使用, 只要修改

WorkThread 里的 run 内容 及 MainFrame 里的 updateDisplay 内容即可。

环境需求

Python 3.7.3
wxPython          4.0.6
Pypubsub          4.0.3

安装 pubsub

pip install pypubsub
# encoding: utf-8
"""
@author: 陈年椰子
@contact: hndm@qq.com
@version: 1.0
@file: wxpub.py
@time: 2020/02/25
说明  WxPython 界面利用pubsub与线程通讯使用进度条的例子
import wxpub as wp
wp.test()
"""
import wx
from pubsub import pub
from time import sleep
import threading
import sys

# 线程调用耗时长代码
class WorkThread(threading.Thread):
    def __init__(self):
        """Init Worker Thread Class."""
        threading.Thread.__init__(self)
        self.breakflag = False
        self.start()

    def stop(self):
        self.breakflag = True

    # 耗时长的代码
    def workproc(self):
        sum_x = 0
        for i in range(1, 101):
            if self.breakflag:
                pub.sendMessage("update", mstatus='中断')
                sleep(2)
                break
            sum_x = sum_x + i
            sleep(0.1)
            pub.sendMessage("update", mstatus='计算{} , 合计 {}'.format(i, sum_x))
        return sum_x

    def run(self):
        """Run Worker Thread."""
        pub.sendMessage("update", mstatus='workstart')
        result = self.workproc()
        sleep(2)
        pub.sendMessage("update", mstatus='计算完成,结果 {}'.format(result))
        pub.sendMessage("update", mstatus='workdone')

class MainFrame(wx.Frame):
    """
    简单的界面
    """

    def __init__(self, *args, **kw):
        # ensure the parent's __init__ is called
        super(MainFrame, self).__init__(*args, **kw)

        # create a panel in the frame
        pnl = wx.Panel(self)

        # and put some text with a larger bold font on it
        self.st = wx.StaticText(pnl, label="分析工具 V 2019", pos=(25,25))
        font = self.st.GetFont()
        font.PointSize += 5
        font = font.Bold()

        self.st.SetFont(font)

        # create a menu bar
        self.makeMenuBar()

        self.gauge = wx.Gauge(self, range=100, size=(300, 20))
        self.gauge.SetBezelFace(3)
        self.gauge.SetShadowWidth(3)
        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(self.st, 0, wx.BOTTOM | wx.ALIGN_CENTER_VERTICAL, 0)
        sizer.Add(self.gauge, 0, wx.BOTTOM | wx.ALIGN_CENTER_VERTICAL, 0)

        self.SetSizer(sizer)

        # and a status bar
        self.CreateStatusBar()
        self.SetStatusText("启动完成!")

        pub.subscribe(self.updateDisplay, "update")

    def makeMenuBar(self):
        """
        A menu bar is composed of menus, which are composed of menu items.
        This method builds a set of menus and binds handlers to be called
        when the menu item is selected.
        """

        # Make a file menu with Hello and Exit items
        fileMenu = wx.Menu()
        # The "\t..." syntax defines an accelerator key that also triggers
        # the same event
        # helloItem = fileMenu.Append(-1, "&Hello...\tCtrl-H",
        #         "Help string shown in status bar for this menu item")
        self.startItem = fileMenu.Append(-1, "开始",
                "开始计算")
        self.stopItem = fileMenu.Append(-1, "停止",
                                         "中断计算")
        fileMenu.AppendSeparator()
        self.exitItem = fileMenu.Append(-1, "退出",
                "退出")

        # Now a help menu for the about item
        helpMenu = wx.Menu()
        aboutItem = helpMenu.Append(-1, "关于",
                "WxPython 界面与线程通讯的例子")

        # Make the menu bar and add the two menus to it. The '&' defines
        # that the next letter is the "mnemonic" for the menu item. On the
        # platforms that support it those letters are underlined and can be
        # triggered from the keyboard.
        self.menuBar = wx.MenuBar()
        self.menuBar.Append(fileMenu, "工作")
        self.menuBar.Append(helpMenu, "信息")

        # Give the menu bar to the frame
        self.SetMenuBar(self.menuBar)
        self.stopItem.Enable(False)

        self.count = 0

        # Finally, associate a handler function with the EVT_MENU event for
        # each of the menu items. That means that when that menu item is
        # activated then the associated handler functin will be called.
        self.Bind(wx.EVT_MENU, self.OnStart, self.startItem)
        self.Bind(wx.EVT_MENU, self.OnStop, self.stopItem)
        self.Bind(wx.EVT_MENU, self.OnExit,  self.exitItem)
        self.Bind(wx.EVT_MENU, self.OnAbout, aboutItem)

    def OnExit(self, event):
        """Close the frame, terminating the application."""
        try:
            self.work.stop()
        except:
            pass
        self.Close(True)
        sys.exit()

    def OnStart(self, event):
        self.work = WorkThread()

    def OnStop(self, event):
        self.work.stop()

    def OnAbout(self, event):
        """Display an About Dialog"""
        wx.MessageBox("分析工具 v2019",
                      "关于",
                      wx.OK|wx.ICON_INFORMATION)

    def updateDisplay(self, mstatus):
        """
        Receives data from thread and updates the display
        """
        if mstatus.find("workstart") >= 0:
            self.SetStatusText('开始计算,代码不提供中断线程语句,请等待计算结束!')
            self.startItem.Enable(False)
            self.stopItem.Enable(True)
            self.exitItem.Enable(False)
        if mstatus.find("workdone") >= 0:
            self.SetStatusText('完成!')
            self.stopItem.Enable(False)
            self.startItem.Enable(True)
            self.exitItem.Enable(True)
        else:
            self.st.SetLabel(mstatus)
            if mstatus.find(",")>0 and mstatus.find("计算")>=0:
                mdata = mstatus.split(',')
                # 示范 , 实际使用需要传送进度
                # print(int(mdata[0].replace('计算','')))
                g_count = int(mdata[0].replace('计算',''))
                self.gauge.SetValue(g_count)

def test():
    app = wx.App()
    frm = MainFrame(None, title='分析工具')
    frm.Show()
    app.MainLoop()

if __name__=="__main__":
    test()

运行后, 点击 工作-开始

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • wxPython实现带颜色的进度条

    本文实例为大家分享了wxPython实现带颜色进度条的具体代码,供大家参考,具体内容如下 [问题描述] 1.在使用wxpython创建进度条时遇到如下问题,使用SetForegroundColour和SetBackgrounColour指令在Win7下不生效,即无法改变进度条的颜色及其背景颜色. 2.查阅资料发现wx.lib.agw.pygauge可以实现进度条颜色的修改(具体指令请参考pygauge说明文档),但其显示效果为平面较差(如下图): 图1-1 pygauge制作的进度条 期望实现的

  • python2利用wxpython生成投影界面工具的图文详解

    本投影界面工具的功能: 准备好.prj投影文件,将输入文件夹内的WGS84经纬度坐标shp文件,投影为平面文件,成果自动命名为prj_***并新建在输入文件夹同一路径下. 下一步目标: 利用pyinstaller或其他打包库生成exe文件,目前停滞在python2语法.arcpy打包出错相关问题上. 参考文献: <Using Py2exe with Arcpy- It can be done easily!> <如何使用py2exe打包arcpy脚本?> GUI界面示意图 投影文件

  • 分析Python编程时利用wxPython来支持多线程的方法

    如果你经常使用python开发GUI程序的话,那么就知道,有时你需要很长时间来执行一个任务.当然,如果你使用命令行程序来做的话,你回非常惊讶.大部分情况下,这会堵塞GUI的事件循环,用户会看到程序卡死.如何才能避免这种情况呢?当然是利用线程或进程了!本文,我们将探索如何使用wxPython和theading模块来实现. wxpython线程安全方法 wxPython中,有三个"线程安全"的函数.如果你在更新UI界面时,三个函数都不使用,那么你可能会遇到奇怪的问题.有时GUI也忙运行挺正

  • WxPython界面如何用pubsub展示进程工作的进度条

    目录 环境需求 安装 pubsub 运行后, 点击 工作-开始 用WxPython做界面时, 如果数据操作时间比较长,会使 WxPython 界面处于假死状态,用户体验非常不好. WxPython是利用pubsub来完成消息的传送. 下面提供一个   WxPython界面利用pubsub 展示进程工作的进度条的例子,实际使用, 只要修改 WorkThread 里的 run 内容 及 MainFrame 里的 updateDisplay 内容即可. 环境需求 Python 3.7.3 wxPyth

  • 前端如何更好的展示后端返回的十万条数据

    目录 前置工作 后端搭建 前端页面 直接渲染 setTimeout分页渲染 requestAnimationFrame 文档碎片 + requestAnimationFrame 懒加载 今天跟大家来唠唠嗑,如果后端真的返回给前端10万条数据,咱们前端要怎么优雅地展示出来呢? 前置工作 先把前置工作给做好,后面才能进行测试 后端搭建 新建一个 server.js 文件,简单起个服务,并返回给前端 10w 条数据,并通过 nodemon server.js 开启服务 没有安装 nodemon 的同学

  • 基于jQuery Bar Indicator 插件实现进度条展示效果

    Bar Indicator是一款基于jQuery的进度条数据展示插件,它可应用于数据统计展示.投票统计以及任务进度等诸多场景中.它使用简单.选项丰富,几乎可以满足用户所有基于进度条的WEB设计需求,本文将结合实例给大家讲解Bar Indicator的使用. 查看演示 下载源码 HTML 首先加载jQuery和Bar Indicator相关js文件以及css文件. <link href="bi-style.css" rel="stylesheet" />

  • Android ProgressBar进度条和ProgressDialog进度框的展示DEMO

    在做手机开发时,经常碰到一些比较耗时的操作,这个时候进度条就开始派上用场了.这个demo展示了ProgressBar进度条和ProgressDialog进度框.一.ProgressDialog进度框,效果如图所示:代码如下: 复制代码 代码如下: //进度对话框按钮监听     class ProssButtonListener implements OnClickListener {         @Override         public void onClick(View v) {

  • Python展示文件下载进度条

    目录 1.前言 2.requests 3.思考 1.前言 大家在用Python写一些小程序的时候,经常都会用到文件下载,对于一些较小的文件,大家可能不太在乎文件的下载进度,因为一会就下载完毕了. 但是当文件较大,比如下载chromedriver的时候,我们如果能够看到下载的进度条,那该多么友好.毕竟在npm,pip安装包的时候都有类似的进度条. 那笔者今天就给大家分享一个展示文件下载进度条的方法. 2.requests requests库相信大家都用过,做接口测试少不了它.其实我们平时下载文件,

  • 利用Python展示文件下载进度条

    目录 1.前言 2.requests 3.思考 1.前言 大家在用Python写一些小程序的时候,经常都会用到文件下载,对于一些较小的文件,大家可能不太在乎文件的下载进度,因为一会就下载完毕了. 但是当文件较大,比如下载chromedriver的时候,我们如果能够看到下载的进度条,那该多么友好.毕竟在npm,pip安装包的时候都有类似的进度条. 那笔者今天就给大家分享一个展示文件下载进度条的方法. 2.requests requests库相信大家都用过,做接口测试少不了它.其实我们平时下载文件,

  • jquery实现进度条状态展示

    本文实例为大家分享了jquery实现进度条状态展示的具体代码,供大家参考,具体内容如下 如上图所示,由于项目需要,需要做一个状态展示,当点击的时候填满整个长度,你需要下载jquery,代码如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="w

  • bootstrap多种样式进度条展示

    为大家分享了多种多样的bootstrap进度条样式,供大家参考,具体内容如下 1.默认的进度条 添加一个带有class .progress 的div,在其内添加一个带有 class .progress-bar 的空div,为空div添加一个以百分比表示的style属性,如 style="60%"表示进度条在60%的位置. 2.不同样式的进度条 添加一个带有class .progress 的div,在其内添加一个带有class .progress-bar 和class .progress

  • iOS利用AVPlayer播放网络音乐的方法教程

    前言 假如你现在打算做一个类似百度音乐.豆瓣电台的在线音乐类APP,你会怎样做? 首先了解一下音频播放的实现级别: (1) 离线播放:这里并不是指应用不联网,而是指播放本地音频文件,包括先下完完成音频文件再进行播放的情况,这种使用AVFoundation里的AVAudioPlayer可以满足 (2) 在线播放:使用AVFoundation的AVPlayer可以满足 (3) 在线播放同时存储文件:使用AudioFileStreamer + AudioQueue 可以满足 (4) 在线播放且带有音效

随机推荐