百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT技术 > 正文

第10天 | 25天学会wxPython,事件处理

wptr33 2025-05-08 21:37 53 浏览

事件,就是程序在运行中发生的事儿,桌面应用软件都是事件驱动的。事件可以是用户的操作,如鼠标点击或按键按下,也可以由系统产生,如定时关机。事件会触发相应的行为,即事件函数。

程序员的工作就是定义事件函数,以及绑定事件和事件函数之间的关联关系,从而达到对事件处理的目的。

10.1 事件绑定

在wxPython中实现事件功能,有3个步骤,分别是:定义事件处理函数、选择事件类型(如wx.EVT_COLSE)、用Bind方法进行绑定。Bind的语法为:

Bind(event, handler, source=None, id=wx.ID_ANY, id2=wx.ID_ANY)

event为事件类型,如wx.EVT_COLSE, handler 指定了该事件所绑定的处理函数。 如果想区分来自不同组件,可用source参数或指定不同的id;如果将一个处理函数绑定至一多个组件id, 可以使用参数id2进一步区分。

Bind()方法在 EvtHandler 类定义, 而wx.Window类继承于EvtHandler类,所有大多数继承于wx.Window的组件,都有事件绑定方法Bind()。

程序清单:event.py

import wx


# 继承Frame
class Event(wx.Frame):
    # 自定义id号
    ID_CLEAR_BTN = 10001
    ID_CLOSE_BTN = 10002

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

    def init_ui(self):
        gbs = wx.GridBagSizer(5, 5)
        self.content_text = wx.TextCtrl(self, style=wx.TE_MULTILINE)
        gbs.Add(self.content_text, pos=(0, 0), span=(1, 4), flag=wx.EXPAND)
        gbs.AddGrowableRow(0)
        gbs.AddGrowableCol(1)
        # 按钮
        copy_btn = wx.Button(self, id=wx.ID_COPY, label="复制")
        paste_btn = wx.Button(self, label="粘贴")
        clear_btn = wx.Button(self, id=self.ID_CLEAR_BTN, label="清空")
        exit_btn = wx.Button(self, id=self.ID_CLOSE_BTN, label="关闭")
        gbs.Add(copy_btn, pos=(1, 0), flag=wx.ALL, border=10)
        gbs.Add(paste_btn, pos=(1, 1), flag=wx.ALL, border=10)
        gbs.Add(clear_btn, pos=(1, 2), flag=wx.ALL, border=10)
        gbs.Add(exit_btn, pos=(1, 3), flag=wx.ALL, border=10)
        # 用id(复制按钮)绑定事件
        self.Bind(wx.EVT_BUTTON, self.copy, id=wx.ID_COPY)
        # 绑定事件源(粘贴按钮)
        self.Bind(wx.EVT_BUTTON, self.paste, paste_btn)
        # 绑定到同一个事件方法
        self.Bind(wx.EVT_BUTTON, self.clear, clear_btn)
        self.Bind(wx.EVT_BUTTON, self.clear, id=self.ID_CLOSE_BTN)
        self.SetSizer(gbs)
        self.SetSize(900, 500)
        self.SetTitle("事件处理")
        self.Centre()
        self.Show(True)

    # 复制内容
    def copy(self, e):
        clip_data = wx.TextDataObject()
        clip_data.SetText(self.content_text.GetValue())
        wx.TheClipboard.Open()
        wx.TheClipboard.SetData(clip_data)
        wx.TheClipboard.Close()

    # 粘贴内容到文本框中
    def paste(self, e):
        success = False
        clip_data = wx.TextDataObject()
        if wx.TheClipboard.Open():
            # 从剪贴板得到数据
            success = wx.TheClipboard.GetData(clip_data)
            wx.TheClipboard.Close()
        if success:  # 文本内容粘贴到文本输入框中
            self.content_text.SetValue(clip_data.GetText())

    # 用id区分事件源
    def clear(self, e):
        # 匹配清空按钮
        if self.ID_CLEAR_BTN == e.GetId():
            self.content_text.SetValue("")
        else:  # 匹配退出按钮
            self.Close()


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


if __name__ == "__main__":
    main()

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

不同的组件,用Bind()方法绑定同到一个事件处理函数时,可通过GetId()方法进行区别。wxPython中使用剪贴板存取文本数据,使用wx.TextDataObject()即可。

好了,事件处理的内容就说到这了,关注我,下一节更精彩。

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

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

#python##程序员##好平台好讲师##热搜##头条#

相关推荐

redis的八种使用场景

前言:redis是我们工作开发中,经常要打交道的,下面对redis的使用场景做总结介绍也是对redis举报的功能做梳理。缓存Redis最常见的用途是作为缓存,用于加速应用程序的响应速度。...

基于Redis的3种分布式ID生成策略

在分布式系统设计中,全局唯一ID是一个基础而关键的组件。随着业务规模扩大和系统架构向微服务演进,传统的单机自增ID已无法满足需求。高并发、高可用的分布式ID生成方案成为构建可靠分布式系统的必要条件。R...

基于OpenWrt系统路由器的模式切换与网页设计

摘要:目前商用WiFi路由器已应用到多个领域,商家通过给用户提供一个稳定免费WiFi热点达到吸引客户、提升服务的目标。传统路由器自带的Luci界面提供了工厂模式的Web界面,用户可通过该界面配置路...

这篇文章教你看明白 nginx-ingress 控制器

主机nginx一般nginx做主机反向代理(网关)有以下配置...

如何用redis实现注册中心

一句话总结使用Redis实现注册中心:服务注册...

爱可可老师24小时热门分享(2020.5.10)

No1.看自己以前写的代码是种什么体验?No2.DooM-chip!国外网友SylvainLefebvre自制的无CPU、无操作码、无指令计数器...No3.我认为CS学位可以更好,如...

Apportable:拯救程序员,IOS一秒变安卓

摘要:还在为了跨平台使用cocos2d-x吗,拯救objc程序员的奇葩来了,ApportableSDK:FreeAndroidsupportforcocos2d-iPhone。App...

JAVA实现超买超卖方案汇总,那个最适合你,一篇文章彻底讲透

以下是几种Java实现超买超卖问题的核心解决方案及代码示例,针对高并发场景下的库存扣减问题:方案一:Redis原子操作+Lua脚本(推荐)//使用Redis+Lua保证原子性publicbo...

3月26日更新 快速施法自动施法可独立设置

2016年3月26日DOTA2有一个79.6MB的更新主要是针对自动施法和快速施法的调整本来内容不多不少朋友都有自动施法和快速施法的困扰英文更新日志一些视觉BUG修复就不翻译了主要翻译自动施...

Redis 是如何提供服务的

在刚刚接触Redis的时候,最想要知道的是一个’setnameJhon’命令到达Redis服务器的时候,它是如何返回’OK’的?里面命令处理的流程如何,具体细节怎么样?你一定有问过自己...

lua _G、_VERSION使用

到这里我们已经把lua基础库中的函数介绍完了,除了函数外基础库中还有两个常量,一个是_G,另一个是_VERSION。_G是基础库本身,指向自己,这个变量很有意思,可以无限引用自己,最后得到的还是自己,...

China's top diplomat to chair third China-Pacific Island countries foreign ministers' meeting

BEIJING,May21(Xinhua)--ChineseForeignMinisterWangYi,alsoamemberofthePoliticalBureau...

移动工作交流工具Lua推出Insights数据分析产品

Lua是一个适用于各种职业人士的移动交流平台,它在今天推出了一项叫做Insights的全新功能。Insights是一个数据平台,客户可以在上面实时看到员工之间的交流情况,并分析这些情况对公司发展的影响...

Redis 7新武器:用Redis Stack实现向量搜索的极限压测

当传统关系型数据库还在为向量相似度搜索的性能挣扎时,Redis7的RedisStack...

Nginx/OpenResty详解,Nginx Lua编程,重定向与内部子请求

重定向与内部子请求Nginx的rewrite指令不仅可以在Nginx内部的server、location之间进行跳转,还可以进行外部链接的重定向。通过ngx_lua模块的Lua函数除了能实现Nginx...