wxPython Demo大全系列:ActivityIndicator控件分析

 一、ActivityIndicator介绍


wx.ActivityIndicator 控件是 wxPython 中用于显示活动指示器的控件,通常用于指示程序正在执行某些后台任务或操作。它在用户界面中以动画的形式表现出活动状态,让用户知道应用程序正在进行处理而不是被挂起。

主要特点

  1. 可视化活动指示器: wx.ActivityIndicator 控件以动画的形式展示活动状态,能够吸引用户注意力。
  2. 跨平台兼容性: 该控件在不同平台下都能提供一致的活动指示效果,无论是在 Windows、macOS 还是 Linux 等系统上。
  3. 简单易用: 通过简单的方法调用,可以方便地控制活动指示器的开始、停止和状态查询等操作。

使用场景

  • 后台任务指示: 在程序执行需要一段时间的后台任务时,使用活动指示器可以让用户明确地知道程序正在工作,而不是被卡住或无响应。
  • 数据加载提示: 在网络请求或大量数据加载过程中,可以使用活动指示器来提示用户数据正在加载中。

注意事项

  • 不宜滥用: 活动指示器应该在适当的情况下使用,避免在不必要的时候频繁地显示,以免影响用户体验。

二、demo源码分析


下面我们以官网给出的demo示例进行分析 

#run.py

#----------------------------------------------------------------------------
# Name:         run.py
# Purpose:      Simple framework for running individual demos
#
# Author:       Robin Dunn
#
# Created:      6-March-2000
# Copyright:    (c) 2000-2020 by Total Control Software
# Licence:      wxWindows license
#----------------------------------------------------------------------------

"""
This program will load and run one of the individual demos in this
directory within its own frame window.  Just specify the module name
on the command line.
"""

import wx
import wx.lib.inspection
import wx.lib.mixins.inspection
import sys, os

# stuff for debugging
print("Python %s" % sys.version)
print("wx.version: %s" % wx.version())
##print("pid: %s" % os.getpid()); input("Press Enter...")

assertMode = wx.APP_ASSERT_DIALOG
##assertMode = wx.APP_ASSERT_EXCEPTION


#----------------------------------------------------------------------------

class Log:
    def WriteText(self, text):
        if text[-1:] == '\n':
            text = text[:-1]
        wx.LogMessage(text)
    write = WriteText


class RunDemoApp(wx.App, wx.lib.mixins.inspection.InspectionMixin):
    def __init__(self, name, module, useShell):
        self.name = name
        self.demoModule = module
        self.useShell = useShell
        wx.App.__init__(self, redirect=False)


    def OnInit(self):
        wx.Log.SetActiveTarget(wx.LogStderr())

        self.SetAssertMode(assertMode)
        self.InitInspection()  # for the InspectionMixin base class

        frame = wx.Frame(None, -1, "RunDemo: " + self.name, size=(200,100),
                        style=wx.DEFAULT_FRAME_STYLE, name="run a sample")
        frame.CreateStatusBar()

        menuBar = wx.MenuBar()
        menu = wx.Menu()
        item = menu.Append(-1, "&Widget Inspector\tF6", "Show the wxPython Widget Inspection Tool")
        self.Bind(wx.EVT_MENU, self.OnWidgetInspector, item)
        item = menu.Append(wx.ID_EXIT, "E&xit\tCtrl-Q", "Exit demo")
        self.Bind(wx.EVT_MENU, self.OnExitApp, item)
        menuBar.Append(menu, "&File")

        ns = {}
        ns['wx'] = wx
        ns['app'] = self
        ns['module'] = self.demoModule
        ns['frame'] = frame

        frame.SetMenuBar(menuBar)
        frame.Show(True)
        frame.Bind(wx.EVT_CLOSE, self.OnCloseFrame)

        win = self.demoModule.runTest(frame, frame, Log())

        # a window will be returned if the demo does not create
        # its own top-level window
        if win:
            # so set the frame to a good size for showing stuff
            frame.SetSize((800, 600))
            win.SetFocus()
            self.window = win
            ns['win'] = win
            frect = frame.GetRect()

        else:
            # It was probably a dialog or something that is already
            # gone, so we're done.
            frame.Destroy()
            return True

        self.SetTopWindow(frame)
        self.frame = frame
        #wx.Log.SetActiveTarget(wx.LogStderr())
        #wx.Log.SetTraceMask(wx.TraceMessages)

        if self.useShell:
            # Make a PyShell window, and position it below our test window
            from wx import py
            shell = py.shell.ShellFrame(None, locals=ns)
            frect.OffsetXY(0, frect.height)
            frect.height = 400
            shell.SetRect(frect)
            shell.Show()

            # Hook the close event of the test window so that we close
            # the shell at the same time
            def CloseShell(evt):
                if shell:
                    shell.Close()
                evt.Skip()
            frame.Bind(wx.EVT_CLOSE, CloseShell)

        return True


    def OnExitApp(self, evt):
        self.frame.Close(True)


    def OnCloseFrame(self, evt):
        if hasattr(self, "window") and hasattr(self.window, "ShutdownDemo"):
            self.window.ShutdownDemo()
        evt.Skip()

    def OnWidgetInspector(self, evt):
        wx.lib.inspection.InspectionTool().Show()


#----------------------------------------------------------------------------


def main(argv):
    useShell = False
    for x in range(len(sys.argv)):
        if sys.argv[x] in ['--shell', '-shell', '-s']:
            useShell = True
            del sys.argv[x]
            break

    if len(argv) < 2:
        print("Please specify a demo module name on the command-line")
        raise SystemExit

    # ensure the CWD is the demo folder
    demoFolder = os.path.realpath(os.path.dirname(__file__))
    os.chdir(demoFolder)

    sys.path.insert(0, os.path.join(demoFolder, 'agw'))
    sys.path.insert(0, '.')

    name, ext  = os.path.splitext(argv[1])
    module = __import__(name)


    app = RunDemoApp(name, module, useShell)
    app.MainLoop()



if __name__ == "__main__":
    main(sys.argv)


run.py是运行demo的主窗体,我们暂时不需要关心。


 

 ActivityIndicator.py

# -*- coding: gbk -*-
"""
Created on 2024/5/29 15:29

@Deprecated: 
@Author: DanMo
@File : ActivityIndicator.py
"""

import wx

#----------------------------------------------------------------------

class TestPanel(wx.Panel):
    def __init__(self, parent, log):
        self.log = log
        wx.Panel.__init__(self, parent, -1)

        # Create some controls
        self.ai = wx.ActivityIndicator(self)
        self.ai.Start()
        startBtn = wx.Button(self, label='Start')
        stopBtn = wx.Button(self, label='Stop')

        # Set up the layout
        sizer = wx.BoxSizer(wx.HORIZONTAL)
        sizer.Add(wx.StaticText(self, label='wx.ActivityIndicator: '),
                  wx.SizerFlags().CenterVertical())
        sizer.Add(self.ai, wx.SizerFlags().Border(wx.LEFT, 10))
        sizer.Add(startBtn, wx.SizerFlags().Border(wx.LEFT, 40))
        sizer.Add(stopBtn, wx.SizerFlags().Border(wx.LEFT, 10))

        # Put it all in an outer box with a border
        box = wx.BoxSizer()
        box.Add(sizer, wx.SizerFlags(1).Border(wx.ALL, 30))
        self.SetSizer(box)

        # Set up the event handlers
        self.Bind(wx.EVT_BUTTON, self.OnStart, startBtn)
        self.Bind(wx.EVT_BUTTON, self.OnStop, stopBtn)
        self.Bind(wx.EVT_UPDATE_UI, self.OnCheckBtnStatus, startBtn)
        self.Bind(wx.EVT_UPDATE_UI, self.OnCheckBtnStatus, stopBtn)


    def OnStart(self, evt):
        self.ai.Start()


    def OnStop(self, evt):
        self.ai.Stop()


    def OnCheckBtnStatus(self, evt):
        obj = evt.GetEventObject()
        running = self.ai.IsRunning()
        if obj.Label == 'Start':
            evt.Enable(not running)
        if obj.Label == 'Stop':
            evt.Enable(running)

#----------------------------------------------------------------------

def runTest(frame, nb, log):
    win = TestPanel(nb, log)
    return win

#----------------------------------------------------------------------



overview = """<html><body>
<h2><center>wx.ActivityIndicator</center></h2>

The wx.ActivityIndicator is a small platform-specifc control showing an
animation that can be used to indicate that the program is currently busy
performing some background task.

</body></html>
"""



if __name__ == '__main__':
    import sys,os
    import run
    run.main(['', os.path.basename(sys.argv[0])] + sys.argv[1:])

这段代码是一个基于 wxPython 库的简单示例,用于演示如何使用 wx.ActivityIndicator 控件来实现一个活动指示器。下面我将详细解释这段代码的设计思路和功能。

1. 导入 wxPython 库

 import wx

这行代码导入了 wxPython 库,用于创建基于 wxWidgets 的桌面应用程序。

2. 定义 TestPanel 类

class TestPanel(wx.Panel):
    def __init__(self, parent, log):
        # ...

TestPanel 类继承自 wx.Panel 类,用于创建主要的用户界面面板。在 __init__ 方法中,初始化了一些控件和布局,以及事件处理函数。

3. 初始化方法

def __init__(self, parent, log):
    self.log = log
    wx.Panel.__init__(self, parent, -1)

    # 创建一些控件
    self.ai = wx.ActivityIndicator(self)
    self.ai.Start()
    startBtn = wx.Button(self, label='Start')
    stopBtn = wx.Button(self, label='Stop')

    # 设置布局
    sizer = wx.BoxSizer(wx.HORIZONTAL)
    # ... (省略部分代码)
    box = wx.BoxSizer()
    box.Add(sizer, wx.SizerFlags(1).Border(wx.ALL, 30))
    self.SetSizer(box)

    # 设置事件处理函数
    self.Bind(wx.EVT_BUTTON, self.OnStart, startBtn)
    self.Bind(wx.EVT_BUTTON, self.OnStop, stopBtn)
    self.Bind(wx.EVT_UPDATE_UI, self.OnCheckBtnStatus, startBtn)
    self.Bind(wx.EVT_UPDATE_UI, self.OnCheckBtnStatus, stopBtn)

__init__ 方法中,首先初始化了日志对象 log,然后创建了 wx.ActivityIndicator 控件、两个按钮控件,并设置了它们的布局。接着设置了按钮的事件处理函数,包括点击事件和更新 UI 事件。

4. 事件处理函数

def OnStart(self, evt):
    self.ai.Start()

def OnStop(self, evt):
    self.ai.Stop()

def OnCheckBtnStatus(self, evt):
    # ...

5. runTest 函数

def runTest(frame, nb, log):
    win = TestPanel(nb, log)
    return win

runTest 函数用于创建 TestPanel 类的实例,并返回该实例。

6. overview 变量

overview = """<html><body>
<h2><center>wx.ActivityIndicator</center></h2>

The wx.ActivityIndicator is a small platform-specifc control showing an
animation that can be used to indicate that the program is currently busy
performing some background task.

</body></html>
"""

overview 变量是一个 HTML 格式的字符串,用于提供关于 wx.ActivityIndicator 控件的概述信息。

7. 主程序入口

if __name__ == '__main__':
    import sys,os
    import run
    run.main(['', os.path.basename(sys.argv[0])] + sys.argv[1:])

这部分代码是主程序的入口,用于执行整个应用程序。

以上就是这段代码的详细设计思路和讲解。通过使用 wxPython 中的 wx.ActivityIndicator 控件,可以方便地实现一个活动指示器,用于提示用户程序正在执行后台任务。

代码运行后效果如下:

点击stop后,旋转停止

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Paddle】稀疏计算的使用指南 稀疏ResNet的学习心得 (2) + Paddle3D应用实例稀疏 ResNet代码解读 (1.6w字超详细)

【Paddle】稀疏计算的使用指南 & 稀疏ResNet的学习心得 Paddle3D应用实例稀疏 ResNet代码解读 写在最前面一、稀疏格式简介1. COO&#xff08;Coordinate Format&#xff09;2. CSR&#xff08;Compressed Sparse Row Format&#xff09; 二、Paddle稀疏张量支持1. 创建 C…

管理能力学习笔记十一:如何通过反馈做好辅导

关于辅导的常见错误 辅导过于细致 辅导的首要障碍: 不相信对方的潜力需要有成长型思维&#xff1a;即便员工现在不OK&#xff0c;未来会更好因材施教&#xff1a;对不同风格的下属&#xff0c;采取不同的辅导风格 凡事亲力亲为 作为管理者&#xff0c;我们要做的是&#xf…

FDW(Foreign Data Wrapper)

在上一篇博客里&#xff0c;最末尾提到了 FDW。 FDW 到底是什么呢&#xff1f; 标准 FDW&#xff08;Foreign Data Wrapper&#xff09;遵循了 SQL/MED 标准&#xff0c;标准全称&#xff1a;ISO/IEC 9075-9 Management of External Data (SQL/MED) 2003 年&#xff0c;SQL…

25 使用MapReduce编程了解垃圾分类情况

测试数据中1表示可回收垃圾&#xff0c;2表示有害垃圾&#xff0c;4表示湿垃圾&#xff0c;8表示干垃圾。 统计数据中各类型垃圾的数量&#xff0c;分别存储可回收垃圾、有害垃圾、湿垃圾和干垃圾的统计结果。 &#xff08;存储到4个不同文件中&#xff0c;垃圾信息&#xff0…

使用 retrievers 在 Elasticsearch 中进行语义重新排序

作者&#xff1a;来自 Elastic Adam Demjen, Nick Chow 什么是语义重新排序&#xff1f; 语义重新排序&#xff08;semantic reranking&#xff09;是一种方法&#xff0c;它允许我们利用快速检索方法的速度和效率&#xff0c;同时在其上分层语义搜索。它还允许我们立即将语义…

【JS基础语法04】运算符分类以及运用

一&#xff1a;赋值运算符 1 类型 赋值运算符包括以下&#xff1a;、、-、*、/ 2 原理 &#xff0c;是将等号右边的数赋值给左边以为例(-、*、/和运算逻辑是相同的) let num 5 num2 等价于 let num 5 numnum2 //num7 二&#xff1a;一元运算符 1怎么判断运算符是几元…

GeoJson和WKT数据格式解析

1. GeoJson数据格式 GEOJSON是gis地图中常用的数据格式&#xff0c;制作地图时用于存储各种地理数据&#xff0c;使用时通过OpenLayer、Leaflet、mapLibre-gl或者Cesium加载GEOJSON即可渲染出GEOJSON中描述的地理要素。 GeoJSON是一种对各种地理数据结构进行编码的格式&#xf…

拍摄的视频内容怎么做成二维码?视频在线转换成二维码的方法

怎么把拍的个人才艺视频做成二维码呢&#xff1f;现在扫码看视频是实现内容快速传播的一种常用方式&#xff0c;所以很多人会将自己拍摄的视频制作二维码图片&#xff0c;然后分享给其他人扫码获取内容&#xff0c;对于内容的传播速度及用户体验有很好的提升&#xff0c;在很多…

Comfyui导出图片的命名技巧,日期文件夹

种子序号命名&#xff1a;%KSampler.seed% 图片宽高序号命名&#xff1a;%Empty Latent Image.width%x%Empty Latent Image.height% 年月日&#xff1a;%date:yyyy-MM-dd% 时分秒&#xff1a;%date:hhmmss% 年月日种子序号&#xff1a;%date:yyyy-MM-dd%/%KSampler.seed%

以果决其行,只为文化的传承

从他们每一个人的身上&#xff0c;我们看到传神的东西&#xff0c;就是他们都能用结果&#xff0c;去指引自己前进的方向&#xff0c;这正是我要解读倪海厦老师的原因&#xff0c;看倪海厦2012年已经去世&#xff0c;到现在已经十几年时间了&#xff0c;但是我们看现在自学中医…

TC3xx分析--如何提高系统运行效率(2)

目录 1.概述 2.限定符对于代码的影响 3.小结 1.概述 上文TC3xx分析--如何提高系统运行效率(1)-CSDN博客讲解了Tasking中lsl的某些关键定义&#xff0c;简述了Tricore寻址模式&#xff0c;接下来我们继续看&#xff0c;不同memory限定符对于代码的影响。 2.限定符对于代码的…

查询sqlserver表占用空间,查询当前数据库缓存的所有数据页面,查询当前数据库经常访问的表

查询某张表的磁盘占用情况&#xff1a; --第一种 EXEC sp_spaceused 表_测试表;--第二种 SELECT OBJECT_NAME(object_id) AS TableName,SUM(used_page_count) * 8 AS UsedSpaceKB FROM sys.dm_db_partition_stats GROUP BY object_id;查询当前数据库缓存的所有数据页面&#x…

mmu之TLB的来源与实现

TLB的由来 遇到的问题 对于两级页表(Page Table)的设计&#xff0c;需要访问两次物理内存才可以得到虚拟地址对应的物理地址(一次访问第一级页表&#xff0c;另一次访问第二级页表)&#xff0c;而物理内存的运行速度相对于处理器本身来说&#xff0c;有几十倍的差距; 因此在处…

zabbix事件告警监控:如何实现对相同部件触发器告警及恢复的强关联

有一定Zabbix使用经验的小伙伴可能会发现&#xff0c;接收告警事件时&#xff0c;其中可能包含着大量不同的部件名&#xff0c;同一部件的事件在逻辑上具有很强关联性&#xff0c;理论上应保持一致的告警/恢复状态&#xff0c;但Zabbix默认并未对它们进行关联&#xff0c;直接后…

单片机+DAC0832信号发生器的仿真设计(方波、三角波、梯形波、锯齿波)

仿真原理图如下(proteus仿真工程文件可留意下载) 一、设计要求 设计一个能产生方波、三角波、梯形波、锯齿波的波形发生器。 二、方案论证 方案一 :利用单片机AT89C51编写程序,然后将产生信号通过DAC0832(数模转换器)转化成模拟信号,输入信号经运放电路后信号放大,低…

Make-An-Audio——用于语音生成的提示增强扩散模型

0.引言 论文提出了一个从文本生成语音的扩散模型 Make-An-Audio。该模型将文本提示作为输入&#xff0c;并据此生成语音。例如&#xff0c;输入 “一只猫在喵喵叫&#xff0c;一个年轻女人的声音”&#xff0c;就会输出猫在喵喵叫&#xff0c;一个女人在说话的音频。这项研究已…

做抖音小店什么类目最容易爆单?搞懂这三点就明白了!

大家好&#xff0c;我是电商糖果 我们刚接触电商的时候&#xff0c;一定经常听一些同行念叨&#xff0c;选择大于努力&#xff0c;类目大于一切。 很多电商人把选类目比做定生死。 类目选对了&#xff0c;让你轻松飞升不是问题&#xff0c;类目选错了&#xff0c;基本被判了…

某烟草企业数字化转型物流信息化咨询项目规划方案(117页PPT)

方案介绍&#xff1a; 烟草企业数字化转型物流信息化咨询项目规划方案将为企业带来多方面的价值&#xff0c;包括提升物流运营效率、降低物流成本、优化供应链管理、增强企业竞争力和促进可持续发展等。这些价值的实现将有助于企业在激烈的市场竞争中保持领先地位并实现可持续…

【C++奇妙冒险】拷贝构造函数、运算符重载(赋值重载|const成员|取地址重载|const取地址重载)

文章目录 前言&#x1f6a9;拷贝构造函数&#x1fae7;概念&#x1fae7;特征&#x1fae7;默认生成的拷贝构造&#x1fae7;default关键字&#xff08;浅谈&#xff09; &#x1f6a9;运算符重载&#x1fae7;概念&#x1fae7;运算符重载注意事项&#x1fae7;封装如何保证&a…

梳理清楚的echarts地图下钻和标点信息组件

效果图 说明 默认数据没有就是全国地图&#xff0c; $bus.off("onresize")是地图容器变化刷新地图适配的&#xff0c;可以你们自己写 getEchartsFontSize是适配字体大小的&#xff0c;getEchartsFontSize(0.12) 12 mapScatter是base64图片就是图上那个标点的底图 Ge…