~certify-web-dev/twisted/certify-trunk

« back to all changes in this revision

Viewing changes to twisted/internet/wxreactor.py

  • Committer: Bazaar Package Importer
  • Author(s): Matthias Klose
  • Date: 2004-06-21 22:01:11 UTC
  • mto: (2.2.3 sid)
  • mto: This revision was merged to the branch mainline in revision 3.
  • Revision ID: james.westby@ubuntu.com-20040621220111-vkf909euqnyrp3nr
Tags: upstream-1.3.0
ImportĀ upstreamĀ versionĀ 1.3.0

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
# Twisted, the Framework of Your Internet
 
2
# Copyright (C) 2001 Matthew W. Lefkowitz
 
3
#
 
4
# This library is free software; you can redistribute it and/or
 
5
# modify it under the terms of version 2.1 of the GNU Lesser General Public
 
6
# License as published by the Free Software Foundation.
 
7
#
 
8
# This library is distributed in the hope that it will be useful,
 
9
# but WITHOUT ANY WARRANTY; without even the implied warranty of
 
10
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 
11
# Lesser General Public License for more details.
 
12
#
 
13
# You should have received a copy of the GNU Lesser General Public
 
14
# License along with this library; if not, write to the Free Software
 
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 
16
 
 
17
"""
 
18
This module provides support for Twisted to interact with the wxPython.
 
19
 
 
20
In order to use this support, simply do the following::
 
21
 
 
22
    |  from twisted.internet import wxreactor
 
23
    |  wxreactor.install()
 
24
 
 
25
Then, when your root wxApp has been created::
 
26
 
 
27
    | from twisted.internet import reactor
 
28
    | reactor.registerWxApp(yourApp)
 
29
    | reactor.run()
 
30
 
 
31
Then use twisted.internet APIs as usual. Stop the event loop using
 
32
reactor.stop().
 
33
 
 
34
IMPORTANT: tests will fail when run under this reactor. This is expected
 
35
and does not reflect on the reactor's ability to run real applications,
 
36
I think. Talk to me if you have questions. -- itamar
 
37
 
 
38
 
 
39
API Stability: unstable
 
40
 
 
41
Maintainer: U{Itamar Shtull-Trauring<mailto:twisted@itamarst.org>}
 
42
"""
 
43
 
 
44
from twisted.python.runtime import seconds
 
45
from twisted.python import log
 
46
from twisted.internet import default
 
47
 
 
48
from wxPython.wx import wxTimer, wxApp
 
49
 
 
50
 
 
51
class ReactorTimer(wxTimer):
 
52
    """Run reactor event loop every millisecond."""
 
53
 
 
54
    # The wx docs promise no better than 1ms and no worse than 1s (!) 
 
55
    # Experiments have shown that Linux, gets better than 50K timer 
 
56
    # calls per second --  however, Windows only gets around 100 
 
57
    # timer calls per second. Caveat coder.
 
58
    def __init__(self, reactor): 
 
59
        wxTimer.__init__(self) 
 
60
        self.reactor = reactor
 
61
        self.Start(1) 
 
62
 
 
63
    def Notify(self): 
 
64
        """Called every timer interval"""
 
65
        self.reactor.simulate()
 
66
 
 
67
 
 
68
class DummyApp(wxApp):
 
69
    
 
70
    def OnInit(self):
 
71
        return True
 
72
 
 
73
 
 
74
class WxReactor(default.SelectReactor):
 
75
    """wxPython reactor.
 
76
 
 
77
    wx drives the event loop, and calls Twisted every millisecond, and
 
78
    Twisted then iterates until a ms has passed.
 
79
    """
 
80
 
 
81
    def registerWxApp(self, wxapp):
 
82
        """Register wxApp instance with the reactor."""
 
83
        self.wxapp = wxapp
 
84
    
 
85
    def crash(self):
 
86
        default.SelectReactor.crash(self)
 
87
        self.timer.Stop()
 
88
        del self.timer
 
89
        self.wxapp.ExitMainLoop()
 
90
 
 
91
    def run(self, installSignalHandlers=1):
 
92
        if not hasattr(self, "wxapp"):
 
93
            log.msg("registerWxApp() was not called on reactor, this is probably an error.")
 
94
            self.wxapp = DummyApp(0)
 
95
        self.startRunning(installSignalHandlers=installSignalHandlers)
 
96
        self.timer = ReactorTimer(self)
 
97
        self.wxapp.MainLoop()
 
98
    
 
99
    def simulate(self):
 
100
        """Run simulation loops and reschedule callbacks.
 
101
        """
 
102
        if self.running:
 
103
            t = 0.01
 
104
            start = seconds()
 
105
            while t > 0:
 
106
                self.iterate(t)
 
107
                t = 0.01 - (seconds() - start)
 
108
 
 
109
 
 
110
def install():
 
111
    """Configure the twisted mainloop to be run inside the wxPython mainloop.
 
112
    """
 
113
    reactor = WxReactor()
 
114
    from twisted.internet.main import installReactor
 
115
    installReactor(reactor)
 
116
    return reactor
 
117
 
 
118
 
 
119
__all__ = ['install']