第13天 | 25天学会wxPython,动态组件之按钮

组件(widgets)是应用程序最基本的单元,常见的组件有标签、文本、按钮、选择框、滑动器等。wxPython的大多数组件继承于wx.Window类,而wx.Window类继承于EvtHandler,所以大多数组件具有绑定事件的功能。

程序员们常将和用户交互的组件称作动态组件,而将主要起到显示作用的组件称为静态组件,静态组件尽管也可以用Bind()方法绑定事件,但不会起到作用。无论是动态组件,还是静态组件,都会有如下几个参数:

parent:父组件对象, 如Panel、Frame对象;

id:组件id,为wx.ID_ANY (即-1)时,由程序自动分配;

pos:在窗口的位置,值为元组(x,y)或wx.Point(x, y),其中x为横坐标,y为纵坐标;

size:指定组件的宽高,值为元组(width, height)或wx.Size(width, height),其中width为宽度,height为高度;

name:字符串,组件的名称;

style:组件的对齐方法,可用|进行组合,默认的对齐方式是wx.ALIGN_LEFT | wx.ALIGN

_TOP,可选内容如下:

wx.ALIGN_LEFT: 左对齐;

wx.ALIGN_RIGHT: 右对齐;

wx.ALIGN_TOP:顶部对齐;

wx.ALIGN_BOTTOM:底部对齐;

wx.ALIGN_CENTER_VERTICAL:垂直居中对齐;


wx.ALIGN_CENTER_HORIZONTAL:水平居中对齐;

wx.ALIGN_CENTER:居中对齐(垂直和水平都对齐)。

13.1 动态组件

widgets的动态组件有10多个,有按钮wx.Button、复选框wx.CheckBox和列表框wx.ComboBox等等。如果只是一味地念”名词”,实在太无趣了,能用代码+注释的方式讲解组件,那才有点意思。

1. 控制按钮

可用wx.Butto创建文本按钮;用wx.BitmapButton创建位图按钮时,需要提供一个位图,而非一个标签;

用wx.ToggleButton创建一个开关按钮,当你按下时,它将一直保持被按下的状态,直到你再次敲击它;位图开关按钮BitmapToggleButton,一个有位图又可进行开关的按钮。

如果你想回避了本地系统窗口的组件,那你可以用完全由Python重新实现的窗口组件,它放在wx.lib库中,如通过wx.lib.buttons引入通用文本按钮(GenButton)。

通用按钮比本地按钮具有更好的跨平台的外观;对它的外观有更多的控制权,并且能改变属性,如3D斜面的宽度和颜色,而这对于本地组件可能是不允许的;通用按钮类允许特性的合并,如GenBitmapTextButton允许文本标签和位图进行组合,而本地按钮不行。

通用组件的用法和本地组件的用法是保持一致的,你可以根据实际需求进行选择。

程序清单:button.py

import wx
import wx.lib.buttons as buttons


# 继承Frame
class Button(wx.Frame):
    ID_Btn = 10000
    ID_ToggleBtn = 10001

    def __init__(self, *args, **kwargs):
        super(Button, self).__init__(*args, **kwargs)
        # 初始化窗口UI
        self.init_ui()

    def init_ui(self):
        # 面板
        panel = wx.Panel(self)
        # 文本按钮
        btn = wx.Button(panel, id=self.ID_Btn, label="通用按钮",
                        pos=(20, 20),size=(100, 100))
        self.Bind(wx.EVT_BUTTON, self.click, btn)
        # 位图按钮
        img_btn = wx.BitmapButton(panel, id=wx.ID_ANY, 
                                  bitmap=wx.Bitmap("exit.png"),
                                  pos=(20, 100), size=(32, 32))
        self.Bind(wx.EVT_BUTTON, self.close, img_btn)
        # 开关按钮
        toggle_btn = wx.ToggleButton(panel, id=self.ID_ToggleBtn,
                                     label="开关按钮", pos=(20, 120), 
                                     size=(100, 100))
        self.Bind(wx.EVT_TOGGLEBUTTON, self.click, toggle_btn)
        # 位图开关按钮
        img_toggle_btn = wx.BitmapToggleButton(panel, id=wx.ID_ANY,
                                               label=wx.Bitmap("exit.png"),
                                               pos=(20, 200), size=(32, 32))
        self.Bind(wx.EVT_TOGGLEBUTTON, self.toggle, img_toggle_btn)
        # 通用按钮
        gen_btn = buttons.GenButton(panel, id=self.ID_Btn, label="通用按钮",
                                    pos=(20, 240))
        self.Bind(wx.EVT_BUTTON, self.click, gen_btn)
        bitmap_text_Btn = buttons.GenBitmapTextButton(panel, id=100,
                                     label="文本",     
                                     bitmap=wx.Bitmap("exit.png"),
                                     pos=(20, 240), size=(120, 32))
        self.Bind(wx.EVT_BUTTON, self.click, bitmap_text_Btn)
        self.SetSize(900, 500)
        self.SetTitle("按钮应用")
        self.Centre()
        self.Show(True)

    def click(self, e):
        if e.GetId() == self.ID_ToggleBtn:
            result = "按钮开了" if e.IsChecked() else "按钮关了"
            print(result)
        else:
            print("普通按钮")

    def toggle(self, e):
        obj = e.GetEventObject()
        checked = obj.GetValue()
        result = "位图按钮开了" if checked else "位图按钮关了"
        print(result)

    def close(self, e):
        self.Close()


def main():
    app = wx.App(False)
    Button(None)
    app.MainLoop()


if __name__ == "__main__":
    main()

运行程序之后,弹出的窗口如下:

第13天 | 25天学会wxPython,动态组件之按钮

判断wx.ToggleButton的事件类型为wx.EVT_TOGGLEBUTTON,判断是开还是关,可用CommandEvent的IsChecked()方法,也可用GetEventObject()方法获取到ToggleButton对象,接着用GetValue()方法,判断是开还是关。

好了,按钮的内容就说到这了,关注我,下一节更精彩。

码字不易,你的关注和转发是对我最大的鼓励,谢谢!

一个当了10年技术总监的老家伙,分享多年的编程经验。想学编程的朋友,关注我,你就赚到了。我正在分享Python、前端、Java和App方面的干货了。赶紧来围观啊!!!

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值