实战wxPython:045 - 一些扩展按钮控件

2023-10-27

本文介绍几个扩展按钮,它们不数属于wxPython核心库中的控件,但是它们可以提供一些特殊的效果。

一、PlateButton

PlateButton是一个通用按钮控件,它是一个自定义的平面按钮。它在许多方面模拟Safari浏览器书签栏中的按钮。可以使用它来替换wx.Button或者wx.BitmapButton。它还提供了一些选项来定义其外观。

PlateButton支持的窗口样式:

  • Main Button Styles:下列值的任何组合都可以传递给构造函数的style关键字参数。
  • PB_STYLE_DEFAULT:创建一个圆角的平面标签按钮,鼠标悬停和按下状态时基于系统当前主题的高亮显示颜色对按钮高亮显示。
  • PB_STYLE_GRADIENT:在高亮和按下状态时使用当前高亮颜色渐变绘制按钮。
  • PB_STYLE_SQUARE:矩形形状的正方形边缘按钮,鼠标悬停和按下状态时基于系统当前主题的高亮显示颜色对按钮高亮显示。
  • PB_STYLE_NOBG:只有当控件显示在具有非纯色背景的面板或其他窗口中时,才应使用它。也就是说,在父窗口的背景上绘制渐变或图像。如果在纯色背景上使用,可能会导致控件失去透明外观(仅Windows下有效)。
  • PB_STYLE_DROPARROW:在按钮上添加一个下拉按钮箭头,当单击该按钮时将发送一个单独的事件。

下面的例子展示了如何创建一个PlateButton。例子显示了几种不同样式的PlateButton按钮。并演示了如何给PlateButton添加一个菜单。

#wx.lib.platebutton PlateButton

import wx
import wx.lib.platebtn as platebtn

class SamplePlateButton(wx.Frame):

    def __init__(self, *args, **kw):
        super(SamplePlateButton, self).__init__(*args, **kw)

        self.InitUi()

    def InitUi(self):
        self.SetTitle("实战wxPython: PlateButton演示")
        self.SetSize(400, 240)

        panel = wx.Panel(self)
        
        girdSizer = wx.GridBagSizer(2, 3)

        #按钮三种不同背景
        btnDefault = platebtn.PlateButton(panel, label="Default", style = platebtn.PB_STYLE_DEFAULT)
        btnGradient = platebtn.PlateButton(panel, label="Graddient", style = platebtn.PB_STYLE_GRADIENT)
        btnSquare = platebtn.PlateButton(panel, label="Square", style = platebtn.PB_STYLE_SQUARE)

        #菜单支持
        menu = wx.Menu()
        for url in ["https://www.baidu.com", "https://cn.bing.com/", "https://sogou.com/"]:
            menu.Append(wx.NewId(), url, "在浏览器里打开 %s" % url)

        btnMenu = platebtn.PlateButton(panel, label="Menu", style = platebtn.PB_STYLE_DEFAULT)
        btnMenu.SetMenu(menu)

        girdSizer.Add(btnDefault, flag = wx.EXPAND, pos = (0, 0))
        girdSizer.Add(btnGradient, flag = wx.EXPAND, pos = (0, 1))
        girdSizer.Add(btnSquare, flag = wx.EXPAND, pos = (0, 2))
        
        girdSizer.Add(btnMenu, flag = wx.EXPAND, pos = (1, 0))

        panel.SetSizer(girdSizer);

        self.Centre()

def main():
    app = wx.App()
    sample = SamplePlateButton(None)
    sample.Show()
    app.MainLoop()

if __name__ == "__main__":
    main()

 图1:PlateButton演示

二、AquaButton

AquaButton及之后介绍的两个按钮都来自wxPython的高级通用控件(Advanced Generic Widgets, AGW)库。

AquaButton是一个自定义绘制的按钮控件,它近似地模仿了Mac上Aqua按钮的行为。它支持以下效果:

  • 气泡和阴影效果。
  • 可自定义背景,前景和悬停颜色。
  • 圆角按钮。
  • 纯文字或图片+文字按钮。
  • 获得焦点的脉冲效果。

下面的代码演示如何使用AquaButton。

#wx.lib.agw.aquabutton.AquaButton

import wx
import wx.lib.agw.aquabutton as ab

class SampleAquaButton(wx.Frame):

    def __init__(self, *args, **kw):
        super(SampleAquaButton, self).__init__(*args, **kw)

        self.InitUi()

    def InitUi(self):
        self.SetTitle("实战wxPython: AquaButton演示")
        self.SetSize(400, 240)

        panel = wx.Panel(self)
        
        bmp = wx.Bitmap("agt_mp3.png", wx.BITMAP_TYPE_ANY)
        btn1 = ab.AquaButton(panel, bitmap=bmp, label="Click me")
        btn1.SetForegroundColour("black")
        btn1.Bind(wx.EVT_BUTTON, self.OnButtonClickMe)

        btn2 = ab.AquaButton(panel, label="PulseOnFocus")
        btn2.SetForegroundColour("black")
        btn2.SetPulseOnFocus(True)

        vbox = wx.BoxSizer(wx.VERTICAL)
        vbox.Add(btn1, 0, wx.CENTER|wx.ALL, 5)
        vbox.Add(btn2, 0, wx.CENTER|wx.ALL, 5)

        panel.SetSizer(vbox)

        self.Centre()

    def OnButtonClickMe(self, e):
        msg = "点击了按钮"
        dlg = wx.MessageDialog(None, msg, "消息", wx.OK|wx.ICON_EXCLAMATION)
        dlg.ShowModal()
        dlg.Destroy()

def main():
    app = wx.App()
    sample = SampleAquaButton(None)
    sample.Show()
    app.MainLoop()

if __name__ == "__main__":
    main()

AquaButton支持位图,因此在上面的例子中我们展示了两个按钮,其中一个带有位图,另一个没有。AquaButton另一个功能是当它具有焦点时,它具有脉冲效果,第二个按钮打开了这个效果。

 图2:AquaButton按钮演示

三、GradientButton

GradientButton是另一个自定义绘制的按钮类。类似于AquaButton,它们都有圆角,可以有一个可选的位图。GradientButton允许设置从上到下的渐变,以及按下时的顶部/底部颜色。GradientButton支持:

  • 三重混合梯度背景,可定制颜色。
  • “按下”状态的自定义颜色。
  • 圆角按钮。
  • 纯文本或图像+文本按钮。

下面的代码演示如何使用GradientButton。

#wx.lib.agw.gradientbutton.GradientButton

import wx
import wx.lib.agw.gradientbutton as gb

class SampleGradientButton(wx.Frame):

    def __init__(self, *args, **kw):
        super(SampleGradientButton, self).__init__(*args, **kw)

        self.InitUi()

    def InitUi(self):
        self.SetTitle("实战wxPython: GradientButton演示")
        self.SetSize(400, 240)

        panel = wx.Panel(self)

        bmp = wx.Bitmap("agt_mp3.png", wx.BITMAP_TYPE_ANY)
        gbBtn1 = gb.GradientButton(panel, bitmap=bmp, label="Gradient with bitmap")
        gbBtn2 = gb.GradientButton(panel, label="Press Me")
        gbBtn2.Bind(wx.EVT_BUTTON, self.OnPressMe)

        vbox = wx.BoxSizer(wx.VERTICAL)
        vbox.Add(gbBtn1, 0, wx.CENTER|wx.ALL, 5)
        vbox.Add(gbBtn2, 0, wx.CENTER|wx.ALL, 5)

        panel.SetSizer(vbox)

        self.Centre()

    def OnPressMe(self, e):
        msg = "OK!"
        dlg = wx.MessageDialog(None, msg, "消息", wx.OK|wx.ICON_EXCLAMATION)
        dlg.ShowModal()
        dlg.Destroy()

def main():
    app = wx.App()
    sample = SampleGradientButton(None)
    sample.Show()
    app.MainLoop()

if __name__ == "__main__":
    main()

类似AquaButton, 我们展示了两个按钮,其中一个带有位图,另一个没有。

 图3:GradientButton 按钮演示

四、ShapedButton

ShapedButton试图填补wxPython中“自定义形状”控件的不足(这取决于wxWidgets中同样的不足)。可用于制作圆形按钮或椭圆按钮。

ShapedButton可能是功能最齐全的按钮。你可以创建一个普通按钮,一个位图按钮,一个奇怪的偏移位图+文本按钮,切换按钮,也可以旋转文本到任何角度显示。

尽管ShapedButton是构建在矩形窗口上,但是只有当鼠标事件发生在圆圈/椭圆内时,ShapedButton才会对鼠标事件做出反应。

使用ShapedButton我们可以:

  • 创建圆形/椭圆按钮/切换按钮;
  • 为按钮的启用/禁用/聚焦/选中状态设置图像;
  • 绘制焦点指示器(或禁用它);
  • 设置标签颜色和字体;
  • 对ShapedButton标签应用一个旋转;
  • 在运行时更改ShapedButton的形状和文本方向。

下面的代码演示了如何使用ShapedButton。

#wx.lib.agw.shapedbutton.ShapedButton

import wx
import wx.lib.agw.shapedbutton as sb

class SampleShapedButton(wx.Frame):

    def __init__(self, *args, **kw):
        super(SampleShapedButton, self).__init__(*args, **kw)

        self.InitUi()

    def InitUi(self):
        self.SetTitle("实战wxPython: ShapedButton演示")
        self.SetSize(400, 240)

        panel = wx.Panel(self)

        bmp = wx.Bitmap("agt_mp3.png", wx.BITMAP_TYPE_ANY)
        
        sBtn = sb.SButton(panel, label="Press Me", size = (75, 75))
        sBtn.Bind(wx.EVT_BUTTON, self.OnShapedButton)

        bmpBtn = sb.SBitmapButton(panel, wx.ID_ANY, bitmap=bmp)
        bmpBtn.Bind(wx.EVT_BUTTON, self.OnBmpShapedButton)

        bmpToggleBtn = sb.SBitmapToggleButton(panel, wx.ID_ANY, bitmap=bmp)
        bmpToggleBtn.Bind(wx.EVT_BUTTON, self.OnToggle)

        bmpToggleTxtBtn = sb.SBitmapTextToggleButton(panel, wx.ID_ANY, bitmap=bmp, label="Toggle", size=(100, 100))

        rotatedTxtBtn = sb.SButton(panel, label="Rotated!", size = (75, 75))
        rotatedTxtBtn.SetAngleOfRotation(90)

        hbox = wx.BoxSizer(wx.HORIZONTAL)
        hbox.Add(sBtn, 0, wx.ALL, wx.CENTER, 5)
        hbox.Add(bmpBtn, 0, wx.ALL, wx.CENTER, 5)
        hbox.Add(bmpToggleBtn, 0, wx.ALL, wx.CENTER, 5)
        hbox.Add(bmpToggleTxtBtn, 0, wx.ALL, wx.CENTER, 5)
        hbox.Add(rotatedTxtBtn, 0, wx.ALL, wx.CENTER, 5)

        panel.SetSizer(hbox)

        self.Centre()

    def OnShapedButton(self, e):
        self.ShowDialog("你点击了常规的ShapedButton")

    def OnBmpShapedButton(self, e):
        dlg = wx.ColourDialog(self)
        data = dlg.GetColourData()
        data.SetChooseFull(True)
        if dlg.ShowModal() == wx.ID_OK:
            print(" '你选择了:%s\n" % str(data.GetColour().Get()))
        dlg.Destroy()

    def OnToggle(self, e):
        if e.GetIsDown():
            wx.CallAfter(self.ShowDialog, "You Toggled Me!")
        else:
            wx.CallAfter(self.ShowDialog, "You untoggled me!")
        e.Skip()

    def ShowDialog(self, msg):
        """ 显示一个自定义消息 """
        dlg = wx.MessageDialog(None, msg, "消息", wx.OK|wx.ICON_EXCLAMATION)
        dlg.ShowModal()
        dlg.Destroy()

def main():
    app = wx.App()
    sample = SampleShapedButton(None)
    sample.Show()
    app.MainLoop()

if __name__ == "__main__":
    main()

在上面的代码中,演示了如何创建一个普通的ShapedButton,一对切换按钮和一个带有一些旋转90度的文本的按钮。

 图4:ShapedButton演示

五、本文知识点

  • 了解自定义控件。
  • 了解和使用PlateButton。
  • 了解和使用AquaButton。
  • 了解和使用GradientButton。
  • 了解和使用ShapedButton。

前一篇:实战wxPython:044 - 高级控件之HtmlWindow

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

实战wxPython:045 - 一些扩展按钮控件 的相关文章

  • 如何查看Databricks中的所有数据库和表

    我想列出 Azure Databricks 中每个数据库中的所有表 所以我希望输出看起来像这样 Database Table name Database1 Table 1 Database1 Table 2 Database1 Table
  • 没有名为 crypto.cipher 的模块

    我现在正在尝试加密一段时间 我最近得到了这个基于 python 的密码器 名为PythonCrypter https github com jbertman PythonCrypter 我对 Python 相当陌生 当我尝试通过终端打开 C
  • 在 python 程序中合并第三方库的最佳实践是什么?

    下午好 我正在为我的工作编写一个中小型Python程序 该任务需要我使用 Excel 库xlwt and xlrd 以及一个用于查询 Oracle 数据库的库 称为CX Oracle 我正在通过版本控制系统 即CVS 开发该项目 我想知道围
  • SQLAlchemy 通过关联对象声明式多对多自连接

    我有一个用户表和一个朋友表 它将用户映射到其他用户 因为每个用户可以有很多朋友 这个关系显然是对称的 如果用户A是用户B的朋友 那么用户B也是用户A的朋友 我只存储这个关系一次 除了两个用户 ID 之外 Friends 表还有其他字段 因此
  • Django:按钮链接

    我是一名 Django 新手用户 尝试创建一个按钮 单击该按钮会链接到我网站中的另一个页面 我尝试了一些不同的例子 但似乎没有一个对我有用 举个例子 为什么这不起作用
  • Python - StatsModels、OLS 置信区间

    在 Statsmodels 中 我可以使用以下方法拟合我的模型 import statsmodels api as sm X np array 22000 13400 47600 7400 12000 32000 28000 31000 6
  • 如何使用Conda下载python包并随后离线安装?

    我知道通过 pip 我可以使用以下命令下载 Python 包 但 pip install 破坏了我的内部包依赖关系 当我做 pip download
  • Spark KMeans 无法处理大数据吗?

    KMeans 有几个参数training http spark apache org docs latest api python pyspark mllib html highlight kmeans pyspark mllib clus
  • OpenCV 无法从 MacBook Pro iSight 捕获

    几天后 我无法再从 opencv 应用程序内部打开我的 iSight 相机 cap cv2 VideoCapture 0 返回 并且cap isOpened 回报true 然而 cap grab 刚刚返回false 有任何想法吗 示例代码
  • 如何使用 OpencV 从 Firebase 读取图像?

    有没有使用 OpenCV 从 Firebase 读取图像的想法 或者我必须先下载图片 然后从本地文件夹执行 cv imread 功能 有什么办法我可以使用cv imread link of picture from firebase 您可以
  • 从 Flask 访问 Heroku 变量

    我已经使用以下命令在 Heroku 配置中设置了数据库变量 heroku config add server xxx xxx xxx xxx heroku config add user userName heroku config add
  • Python 的“zip”内置函数的 Ruby 等价物是什么?

    Ruby 是否有与 Python 内置函数等效的东西zip功能 如果不是 做同样事情的简洁方法是什么 一些背景信息 当我试图找到一种干净的方法来进行涉及两个数组的检查时 出现了这个问题 如果我有zip 我可以写这样的东西 zip a b a
  • IO 密集型任务中的 Python 多线程

    建议仅在 IO 密集型任务中使用 Python 多线程 因为 Python 有一个全局解释器锁 GIL 只允许一个线程持有 Python 解释器的控制权 然而 多线程对于 IO 密集型操作有意义吗 https stackoverflow c
  • 在f字符串中转义字符[重复]

    这个问题在这里已经有答案了 我遇到了以下问题f string gt gt gt a hello how to print hello gt gt gt f a a gt gt gt f a File
  • Jupyter Notebook 内核一直很忙

    我已经安装了 anaconda 并且 python 在 Spyder IPython 等中工作正常 但是我无法运行 python 笔记本 内核被创建 它也连接 但它始终显示黑圈忙碌符号 防火墙或防病毒软件没有问题 我尝试过禁用两者 我也无法
  • 为字典中的一个键附加多个值[重复]

    这个问题在这里已经有答案了 我是 python 新手 我有每年的年份和值列表 我想要做的是检查字典中是否已存在该年份 如果存在 则将该值附加到特定键的值列表中 例如 我有一个年份列表 并且每年都有一个值 2010 2 2009 4 1989
  • 解释 Python 中的数字范围

    在 Pylons Web 应用程序中 我需要获取一个字符串 例如 关于如何做到这一点有什么建议吗 我是 Python 新手 我还没有找到任何可以帮助解决此类问题的东西 该列表将是 1 2 3 45 46 48 49 50 51 77 使用
  • Conda SafetyError:文件大小不正确

    使用创建 Conda 环境时conda create n env name python 3 6 我收到以下警告 Preparing transaction done Verifying transaction SafetyError Th
  • 导入错误:没有名为 site 的模块 - mac

    我已经有这个问题几个月了 每次我想获取一个新的 python 包并使用它时 我都会在终端中收到此错误 ImportError No module named site 我不知道为什么会出现这个错误 实际上 我无法使用任何新软件包 因为每次我
  • Statsmodels.formula.api OLS不显示截距的统计值

    我正在运行以下源代码 import statsmodels formula api as sm Add one column of ones for the intercept term X np append arr np ones 50

随机推荐

  • B - Querying Multiset(优先队列)

    B Querying Multisethttps vjudge csgrandeur cn problem AtCoder abc212 d 思路 题目给Q次操作 1操作时 将xi写在球上装进袋子里 2操作时 将袋子里所有球上的数全部加上x
  • 苹果开发者账号注册方法简明指南

    注册苹果开发者账号的方法 在2020年以前 注册苹果开发者账号后 就可以生成证书 但2020年后 因为注册苹果开发者账号需要使用Apple Developer app注册开发者账号 所以需要缴费才能创建ios证书了 所以新政策出来后 注册苹
  • Android底层驱动开发记录:03_HAL

    在上一节基础上增加HAL层代码 1 完成IoctrlJ25 hal c 填充主要结构体hw module t static struct ioctrlj25 device ioctrlj25 dev common close ioctrlj
  • 基于ROS实现A*算法的C++代码示例

    以下是基于ROS实现A 算法的C 代码示例 include
  • 【问题解决】无法定位程序输入点~于动态链接库上(The procedure entry point ~ could not be located)

    重新着手使用自己笔记本上配的工作环境 在实习中 需要对Qt程序进行打包 在Qt creator 中 修改为 release 编译 进入release 生成的项目目录 新建一个目录 把可执行文件复制进去 进入新建的目录 在命令行下 执行 wi
  • 树莓派——交叉编译(二)WiringPi软链接、硬链接

    树莓派 交叉编译 二 WiringPi软链接 参考大佬文章 Linux软硬链接命令解析 https www cnblogs com zhangna1998517 p 11347364 html 一 软链接 1 概念 2 生成软链接 ln s
  • lumen初学教程

    文档传送 lumen文档 laravel文档 laravel命令速查表 安装 Lumen composer global require laravel lumen installer 创建新的项目 通过终端进入所需创建目录的文件夹 lum
  • 如何查看自己的cuda环境,以及其对应版本

    第一步 cmd打开命令窗口 输入conda env list 查看有几个conda环境 第二步 选择一个环境进入conda 输入conda activate pytorch 第三步 进入python环境 输入python 第四部 在Pyth
  • 前端如何在H5页面调起微信支付

    在微信服务号开发的时候经常会遇到微信支付的功能实现 通过实际经验自己总结了一下 前端在H5页面调起微信支付有两种办法 一是利用内置对象 二是通过引用微信的js sdk 亲测都能支付成功 从写法上来看用内置对象方法比较简单 这里讲的只是前端要
  • Python读取和写入yaml文件

    yaml是专门用来写配置文件的语言 简洁强大 远比JSON格式方便 yaml在python语言中有PyYAML安装包 我这边应用场景是用来做接口自动化时 接口返回的值写入到yaml文件 然后需要用的时候直接引用即可 不如登录接口 我需获取接
  • java基础之内部类

    1 简介 内部类 inner class 是定义在另一个类中的类 使用内部类的原因 有以下三点 内部类方法可以访问可以访问该类定义所在的作用域中的数据 包括私有的数据 内部类可以对同一个包中的其他类隐藏起来 当想要定义一个回调函数时且不想编
  • 符合功能安全要求的动态测试工具-TESSY

    Tessy是一个专门针对嵌入式软件的C C 代码进行单元 集成测试的工具 它可以自动化地执行测试 评估测试结果并生成测试报告 Tessy的目标就是 通过自动化整个测试周期 支持针对C语言的单元测试 集成测试 同时 Tessy也同样关注测试组
  • SpringBoot利用cancl监听mysql的binlog日志通过kafja实时同步数据到es

    canal官网 https github com alibaba canal wiki gitlab https github com alibaba canal wiki QuickStart 下载地址 https github com
  • 关于GPT的20个知识,你都知道吗?

    1 GPT全称是什么 GPT全称是Generative Pre trained Transformer 2 GPT是由谁研发的 GPT是由OpenAI的研究人员研发的 3 GPT的目的是什么 GPT的目的是通过无监督的预训练 obtain
  • 离线安装/断网安装python第三方库

    由于team服务器在另一个校区 为了安全 校网络技术中心建议我们不要让服务器连外网 所以在复现代码的时候遇到一些python第三方库没法使用 就只能离线安装了 说起来都是泪 在这里 谢谢他们 参考链接 1 呕心沥血整理 python离线安装
  • 深度学习入门之Pytorch——Momentum

    动量法 动量法是梯度下降法的变式 在随机梯度下降的同时 增加动量 这是来自于物理中的概念 可以想象损失函数是一个山谷 一个球从山谷滑下来 在一个平坦的地势 球的滑动速度就会慢下来 可能陷入一些鞍点或者局部极小值点 如图 这个时候给它增加动量
  • Vue中自定义指令是什么?有哪些应用场景?

    一 什么是指令 开始之前先学习一下指令系统这个词 指令系统是计算机硬件的语言系统 也叫机器语言 它是系统程序员看到的计算机的主要属性 因此指令系统表征了计算机的基本功能决定了机器所要求的能力 在vue中提供了一套为数据驱动视图更为方便的操作
  • 终于解决了Invalid from address

    以太坊存证 ipfs 运行环境是ganache cli自动生成十个账户 import Web3 from web3 let getWeb3 new Promise function resolve reject Wait for loadi
  • Webpack详细教程

    webpack教程 第 1 章 webpack 简介 1 1 webpack 是什么 1 2 webpack 五个核心概念 1 2 1 Entry 入口 Entry 1 2 2 Output 输出 Output 1 2 3 Loader 1
  • 实战wxPython:045 - 一些扩展按钮控件

    本文介绍几个扩展按钮 它们不数属于wxPython核心库中的控件 但是它们可以提供一些特殊的效果 一 PlateButton PlateButton是一个通用按钮控件 它是一个自定义的平面按钮 它在许多方面模拟Safari浏览器书签栏中的按