[wxPython学习]wx.CallAfter和wx.FutureCall

[wxPython学习]wx.CallAfter和wx.FutureCall

今天才学到的两个wxPython中的函数:wx.CallAfter和wx.FutureCall。这是两个无关的函数,但又多少有些联系。记得在邮件列表中有人问过:

wxPython中的Frame有没有OnShow之类的事件,因为他想在窗口显示之后执行一些操作。有人回答说使用PostEvent()方法。

这的确是一个方法,不过要自已创建事件(可以使用现成事件),然后把事件与处理窗口进行绑定。这种方法我没有试过。不过现在发现一个更方便的方法wx.CallAfter:

wx.CallAfter(callable, *args, **kwargs)

其实这个方法也是利用PostEvent()来实现的。执行这个方法后,将在主事件循环中加入一个事件,然后通过事件循环进行处理。这其实是一种异步的方法,适用于一个非GUI的处理过程要调用GUI的方法,或子线程调用主线程的方法,或在一个事件处理函数中异步调用另一个事件处理,还有就是上面的问题。这个方法使用很方便,不需要自定义事件,绑定事件,Post事件。

再说一说wx.FutureCall:

wx.FutureCall(milliseconds, callable, *args, **kwargs)

它是从wx.Timer中派生出来的,它的作用是在指定时间之后执行一个方法。

举一个简单的例子,大家可以运行看一下:

import wx

class Frame(wx.Frame):
    """Frame class."""

    def __init__(self, parent=None, id=-1, title=’Title’,
                 pos=wx.DefaultPosition, size=(400, 200)):
        """Create a Frame instance."""
        wx.Frame.__init__(self, parent, id, title, pos, size)

        self.text_id = wx.NewId()
        self.text = wx.TextCtrl(self, self.text_id)
        self.text.Bind(wx.EVT_RIGHT_UP, self.OnRightClick, id=self.text_id)

        self.statusbar = self.CreateStatusBar(1, 0)

        wx.CallAfter(self.call, 1, ‘abc‘, name="ccc", help="test")
        wx.FutureCall(5000, self.call, ‘call after 100ms‘, name="test")

    def OnRightClick(self, event):
        wx.MessageBox("message window", "message", wx.OK, self)

    def call(self, *args, **kwargs):
        message = repr(args) + repr(kwargs)
        self.SetStatusText(message, 0)

class App(wx.App):
    """Application class."""

    def OnInit(self):
        self.frame = Frame()
        self.frame.Show()
        self.SetTopWindow(self.frame)
        return True

def main():
    app = App()
    app.MainLoop()

if __name__ == ‘__main__‘:
    main()

上面红色的字是重要的。前两行是一个调用的示例,第一行将在Frame创建完毕之后才会被调用。第二行在5秒钟之后被调用。call函数用来在状态条上显示参数信息。

时间: 2024-12-27 14:42:42

[wxPython学习]wx.CallAfter和wx.FutureCall的相关文章

[学习记录]面对wxpython的长跑(100米:wxpython安装,相关文件,wx.App,wx.Frame)

被老师要求,已经是不得不进行图形界面的开发了,因为程序本体使用python写的,所以自然第一次进行图形界面开发就选择了wxpython,wxpython是一款非常优秀的GUI图形库,写起来也相对简洁方便. 安装时直接pip install wxpython即可. demo程序以及其它官方相关文件下载地址:https://extras.wxpython.org/wxPython4/extras/ 官方文档:https://docs.wxpython.org/wx.1moduleindex.html

wxpython学习笔记

一.简介 wxPython是Python编程语言的一个GUI工具箱.他使得Python程序员能够轻松的创建具有健壮.功能强大的图形用户界面的程序.它是Python语言对流行的wxWidgets跨平台GUI工具库的绑定.而wxWidgets是用C++语言写成的.和Python语言与wxWidgets GUI工具库一样,wxPython是开源软件.这意味着任何人都可以免费地使用它并且可以查看和修改它的源代码,或者贡献补丁,增加功能.wxPython是跨平台的.这意味着同一个程序可以不经修改地在多种平

wxPython学习笔记(三)

要理解事件,我们需要知道哪些术语? 事件(event):在你的应用程序期间发生的事情,它要求有一个响应. 事件对象(event object):在wxPython中,它具体代表一个事件,其中包括了事件的数据等属性.它是类wx.Event或其子类的实例,子类如wx.CommandEvent和wx.MouseEvent. 事件类型(event type):wxPython分配给每个事件对象的一个整数ID.事件类型给出了关于该事件本身更多的信息.例如,wx.MouseEvent的事件类型标识了该事件是

wxPython学习笔记(初识)

今天正式开始学习wxPython,基于对类的不熟悉,理解有点生硬,但还是做了些笔记. 1.是什么组成了一个wxpython程序? 一个wxpython程序必须有一个application(wx.App)对象和至少一个frame(wx.Frame)对象.而用于填充frame的则是一系列的wx.Window的子类,wx.Window的子类都可以拥有wx.Control的子类,在上图中,panel就是最常见的wx.Window的子类之一,而wx.StaticText和wx.TextCtrl则是最常见的

wxPython学习笔记(二)

如何创建和使用一个应用程序对象? 任何wxPython应用程序都需要一个应用程序对象.这个应用程序对象必须是类wx.App或其定制的子类的一个实例.应用程序对象的主要目的是管理幕后的主事件循环. 父类wx.App也定义了一些属性,它们对整个应用程序是全局性的. 创建一个wx.App的子类 四个步骤: 1.定义这个子类 2.在定义的子类中写一个OnInit()方法 3.在你的程序的主要部分创建这个类的一个实例 4.调用应用程序实例的MainLoop()方法.这个方法将程序的控制权转交给wxPyth

wxPython学习笔记(一)

创建最小的空的wxPython程序 import wx #1 class App(wx.App):#2 def OnInit(self): #3 frame = wx.Frame(parent=None, title='Bare') frame.Show() return True app = App() #4 app.MainLoop() #5 上面的代码的任何一行都不能少,否则将不能工作.这个基本的wxPython程序说明了开发任一wxPython程序所必须的五个基本步骤: 导入必须的wxP

微信小程序开发中wx.redirectTo与wx.navigateTo跳转页面未果

学习小程序开发中难免遇到一些小坑,作者在进行登录功能时遇到登录成功后,页面不可实现跳转到个人中心(admin/admin). 首先大致介绍一下本文的逻辑:验证用户信息后,需跳转页面到个人中心(tabBar页面),采用wx.redirectTo与wx.navigateTo两种方法均未实现,且不报错. 主要原因: admin/admin属于tabBar页面,采用上述两方法不会有任何效果,需采用wx.switchTab法进行跳转. 跳转完成页面: 页面跳转方法: 1.wx.navigateTo 保留当

微信小程序 wx:for与wx:for-item

(转) wx:for="{{list}}"用来循环数组,而list即为数组名wx:for-item="items" 即用来定义一个循环过程中每个元素的变量的 如果是一维数组,按照如下方式循环出来: <view wx:for="{{list}}"> {{index}} {{item.name}} </view> 以上代码中,item即为list的别名. 如果是二维甚至多维数组,按照如下方式循环: <view wx:fo

微信小程序把玩(三十一)wx.uploadFile(object), wx.downloadFile(object) API

原文:微信小程序把玩(三十一)wx.uploadFile(object), wx.downloadFile(object) API 反正我是没有测通这两个API!!!!不知道用的方式不对还是其他的!!!先记录下回头再说... 主要方法: wx.uploadFile(OBJECT)上传 wx.downloadFile(OBJECT)下载 wxml <button type="primary" bindtap="listenerButtonDownLoadFile"