[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中派生出来的,它的作用是在指定时间之后执行一个方法。

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

#!/usr/bin/evn python
# -*- coding:utf-8 -*-
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函数用来在状态条上显示参数信息。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值