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 = WriteTextclass RunDemoApp(wx.App, wx.lib.mixins.inspection.InspectionMixin):def __init__(self, name, module, useShell):self.name = nameself.demoModule = moduleself.useShell = useShellwx.App.__init__(self, redirect=False)def OnInit(self):wx.Log.SetActiveTarget(wx.LogStderr())self.SetAssertMode(assertMode)self.InitInspection()  # for the InspectionMixin base classframe = 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'] = wxns['app'] = selfns['module'] = self.demoModulens['frame'] = frameframe.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 windowif win:# so set the frame to a good size for showing stuffframe.SetSize((800, 600))win.SetFocus()self.window = winns['win'] = winfrect = frame.GetRect()else:# It was probably a dialog or something that is already# gone, so we're done.frame.Destroy()return Trueself.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 windowfrom wx import pyshell = py.shell.ShellFrame(None, locals=ns)frect.OffsetXY(0, frect.height)frect.height = 400shell.SetRect(frect)shell.Show()# Hook the close event of the test window so that we close# the shell at the same timedef CloseShell(evt):if shell:shell.Close()evt.Skip()frame.Bind(wx.EVT_CLOSE, CloseShell)return Truedef 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 = Falsefor x in range(len(sys.argv)):if sys.argv[x] in ['--shell', '-shell', '-s']:useShell = Truedel sys.argv[x]breakif len(argv) < 2:print("Please specify a demo module name on the command-line")raise SystemExit# ensure the CWD is the demo folderdemoFolder = 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 = logwx.Panel.__init__(self, parent, -1)# Create some controlsself.ai = wx.ActivityIndicator(self)self.ai.Start()startBtn = wx.Button(self, label='Start')stopBtn = wx.Button(self, label='Stop')# Set up the layoutsizer = 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 borderbox = wx.BoxSizer()box.Add(sizer, wx.SizerFlags(1).Border(wx.ALL, 30))self.SetSizer(box)# Set up the event handlersself.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,osimport runrun.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 = logwx.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,osimport runrun.main(['', os.path.basename(sys.argv[0])] + sys.argv[1:])

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

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

代码运行后效果如下:

点击stop后,旋转停止

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

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

相关文章

数据源不同?奥威BI软件是这么做的

面对数据源不同的情况&#xff0c;BI&#xff08;商业智能&#xff09;软件如奥威BI软件通常通过一系列技术和方法来实现数据的整理。以下以奥威BI软件为例&#xff0c;详细解释其如何整理不同数据源的数据&#xff1a; 数据收集&#xff1a; 爬虫技术&#xff1a;奥威BI软件…

透视AI技术:探索折射技术在去衣应用中的奥秘

引言&#xff1a; 随着人工智能技术的飞速发展&#xff0c;其在图像处理和计算机视觉领域的应用日益广泛。其中&#xff0c;AI去衣技术作为一种颇具争议的应用&#xff0c;引发了广泛的讨论和关注。本文将深入探讨折射技术在AI去衣中的应用及其背后的原理。 一、AI去衣技术简介…

精通Java异常机制,写出高质量代码

作为一名Java开发人员&#xff0c;异常处理是一个无法回避的话题。无论你是初学者还是老手&#xff0c;精通异常处理对于写出高质量、可维护的代码至关重要。今天&#xff0c;我将与大家分享关于Java异常处理的一切&#xff0c;助你在代码质量的道路上突飞猛进! 一、什么是异常…

打造云计算时代的仿真软件

2024年5月25日&#xff0c;北京云道智造科技有限公司&#xff08;下称“云道智造”&#xff09;在深圳成功举办了2024新品发布会暨用户大会。来自全国各地的近500位客户和合作伙伴代表齐聚一堂&#xff0c;共同见证了云道智造新产品的隆重发布&#xff0c;交流分享了仿真领域的…

2024-05-29 blue-VH-driver-对外接口的并行调用-设计与思考

摘要: VH的driver的对外接口, 要做到可以并行&#xff0c;也就是两个不同的线程&#xff0c;分别调用&#xff0c;不能互相阻塞。 本文记录对其的思考和设计。 上下文: 2024-05-28 blue-VH-driver-需求分析及问题分析-CSDN博客 2024-05-27 blue-vh-问题点-CSDN博客 2024-05…

Wpf 使用 Prism 实战开发Day28

首页汇总方块点击导航功能 点击首页汇总方块的时候&#xff0c;跳转到对应的数据页面 step1: 在IndexViewModel 中&#xff0c;给TaskBar 里面Target 属性&#xff0c;赋上要跳转的页面 step2: 创建导航事件命令和方法实现 step3: 实现导航的逻辑。通过取到 IRegionManager 的…

免费,Python蓝桥杯等级考试真题--第17级(含答案解析和代码)

Python蓝桥杯等级考试真题–第17级 一、 选择题 答案&#xff1a;B 解析&#xff1a;&#xff08;x-y&#xff09;%25%21&#xff0c;故答案为B。 答案&#xff1a;B 解析&#xff1a;x16&#xff0c;所以i的值为range&#xff08;1,16&#xff09;&#xff0c;取值为1-15&…

OpenMV学习笔记2——颜色识别

目录 一、打开单颜色识别实例代码 二、代码基础部分 三、阈值选择 四、给识别到的颜色画框 五、多颜色识别 一、打开单颜色识别实例代码 如图&#xff0c;双击打开对应文件即可进入实例代码。 二、代码基础部分 # Single Color RGB565 Blob Tracking Example # # This e…

手机拍照扫描成电子版,这三款软件助你轻松搞定!

在数字化时代&#xff0c;将手机拍照的内容快速转换为电子版已经成为许多人日常生活和工作中不可或缺的技能。无论是快速记录文档、合同&#xff0c;还是将纸质照片、笔记转化为电子格式&#xff0c;手机拍照扫描功能都为我们提供了极大的便利。今天&#xff0c;就为大家介绍三…

11.任务状态查询API函数总结

一、任务相关 API 函数预览 二、任务相关 API 函数详解 1. 函数 uxTaskPriorityGet() 此函数用于获取指定任务的任务优先级&#xff0c;若使用此函数&#xff0c;需在 FreeRTOSConfig.h 文件中设 置配置项 INCLUDE_uxTaskPriorityGet 为 1&#xff0c;此函数的函数原型如下所示…

mybatis异常:Invalid bound statement (not found): com.lm.mapper.ArticleMapper.list

现象&#xff1a; 原因&#xff1a; 无效绑定&#xff0c;应该是mybatis最常见的一个异常了&#xff0c;接口与XML文件没绑定。首先&#xff0c;mapper接口并没有实现类&#xff0c;所以框架会通过JDK动态代理代理模式获取接口的代理实现类&#xff0c;进而根据接口全限定类名…

适合多种苛刻环境的惯性测量单元M-G370PDS

全球IMU市场d在汽车和机器人技术进步和不断增长的应用需求&#xff0c;保持着高速增长的趋势&#xff0c;其中航空航天、国防和汽车等行业对高精度、稳定和紧凑的IMU需求尤为强烈&#xff0c;这些行业对精度和可靠性的高要求直接影响了相关技术的发展方向。 爱普生惯性测量单…

一次绕过waf进行xss的经历

今天室友遇到一个好玩的网站&#xff0c;下面是一些尝试绕过Waf进行XSS的记录。首先该网站没有对左右尖号和单双引号做任何过滤或转义。且有未知的waf或者其他阻止恶意访问的手段。 首先我的访问为 login.asp?f1 时候&#xff0c;页面关键源码为 可能是表示登录次数的一个东西…

01_Spring Ioc(详解) + 思维导图

文章目录 一.概念实操Maven父子工程 二. IOC和DI入门案例【重点】1 IOC入门案例【重点】问题导入1.1 门案例思路分析1.2 实现步骤2.1 DI入门案例思路分析2.2 实现步骤2.3 实现代码2.4 图解演示 三、Bean的基础配置问题导入问题导入1 Bean是如何创建的【理解】2 实例化Bean的三种…

【ai】livekit:Agents 4: livekit-plugins-openai和LiveKit Plugins Silero安装与分析

先提高下性能然后本文 继续按照 上一篇【ai】livekit:Agents 3 : pythonsdk和livekit-agent的可编辑模式下的安装构建 livekit-gent的插件。pycharm 工程 配置Microsoft Defender 排除列表 livekit-plugins-openai 本地安装

Tensorflow 2.0 安装过程

第一步&#xff1a;进入国内清华软件网站 anaconda | 镜像站使用帮助 | 清华大学开源软件镜像站 | Tsinghua Open Source Mirroranaconda 使用帮助 | 镜像站使用帮助 | 清华大学开源软件镜像站&#xff0c;致力于为国内和校内用户提供高质量的开源软件镜像、Linux 镜像源服务&…

九章云极DataCanvas公司重磅亮相第七届数字中国建设峰会

近日&#xff0c;由国家发展改革委、国家数据局、国家网信办、科技部、国务院国资委、福建省人民政府共同主办的第七届数字中国建设峰会在福州盛大举行&#xff0c;九章云极DataCanvas公司重磅亮相峰会现场&#xff0c;深度展示智算中心建设核心成果及“算法算力”一体化AI智算…

最简单的安卓模拟器抓包?

安装模拟器抓包似乎是有个绕不开的话题&#xff0c;但是现在普遍的安卓模拟器抓包会遇到以下问题&#xff1a; 1.证书配置繁琐 2.模拟器不兼容软件 3.系统设置繁琐。 前几天写过一次微信小程序如何抓包&#xff0c;现在来讲一下模拟器怎么抓包吧。首先使用的工具还是TangGo测…

ADF: 获取Data Lake Storage上的文件列表并根据文件名删除文件

假设 Data Lake 上有个test的文件夹&#xff0c;有如下文件 目标&#xff1a;使用Azure Data Factory的Pipeline获取这个目录下的文件名列表&#xff0c;并删除掉以"ETC"开头的文件。 步骤&#xff1a; 1. 需要在Linked services中新建一个能连接到Data Lake的连接…

人工智能应用-实验5-BP 神经网络分类手写数据集

文章目录 &#x1f9e1;&#x1f9e1;实验内容&#x1f9e1;&#x1f9e1;&#x1f9e1;&#x1f9e1;代码&#x1f9e1;&#x1f9e1;&#x1f9e1;&#x1f9e1;分析结果&#x1f9e1;&#x1f9e1;&#x1f9e1;&#x1f9e1;实验总结&#x1f9e1;&#x1f9e1; &#x1f9…