]>
git.saurik.com Git - wxWidgets.git/blob - wxPython/src/_core_ex.py
1 #----------------------------------------------------------------------------
3 # Use Python's bool constants if available, make some if not
7 __builtins__
.True = 1==1
8 __builtins__
.False = 1==0
9 def bool(value
): return not not value
10 __builtins__
.bool = bool
14 # workarounds for bad wxRTTI names
15 __wxPyPtrTypeMap
['wxGauge95'] = 'wxGauge'
16 __wxPyPtrTypeMap
['wxSlider95'] = 'wxSlider'
17 __wxPyPtrTypeMap
['wxStatusBar95'] = 'wxStatusBar'
20 #----------------------------------------------------------------------------
21 # Load version numbers from __version__... Ensure that major and minor
22 # versions are the same for both wxPython and wxWidgets.
24 from __version__
import *
25 __version__
= VERSION_STRING
27 assert MAJOR_VERSION
== _core_
.MAJOR_VERSION
, "wxPython/wxWidgets version mismatch"
28 assert MINOR_VERSION
== _core_
.MINOR_VERSION
, "wxPython/wxWidgets version mismatch"
29 if RELEASE_VERSION
!= _core_
.RELEASE_VERSION
:
31 warnings
.warn("wxPython/wxWidgets release number mismatch")
33 #----------------------------------------------------------------------------
35 # Set the default string conversion encoding from the locale
37 default
= locale
.getdefaultlocale()[1]
39 wx
.SetDefaultPyEncoding(default
)
43 #----------------------------------------------------------------------------
45 class PyDeadObjectError(AttributeError):
48 class _wxPyDeadObject(object):
50 Instances of wx objects that are OOR capable will have their __class__
51 changed to this class when the C++ object is deleted. This should help
52 prevent crashes due to referencing a bogus C++ pointer.
54 reprStr
= "wxPython wrapper for DELETED %s object! (The C++ object no longer exists.)"
55 attrStr
= "The C++ part of the %s object has been deleted, attribute access no longer allowed."
58 if not hasattr(self
, "_name"):
59 self
._name
= "[unknown]"
60 return self
.reprStr
% self
._name
62 def __getattr__(self
, *args
):
63 if not hasattr(self
, "_name"):
64 self
._name
= "[unknown]"
65 raise PyDeadObjectError(self
.attrStr
% self
._name
)
67 def __nonzero__(self
):
72 class PyUnbornObjectError(AttributeError):
75 class _wxPyUnbornObject(object):
77 Some stock objects are created when the wx._core module is
78 imported, but their C++ instance is not created until the wx.App
79 object is created and initialized. These object instances will
80 temporarily have their __class__ changed to this class so an
81 exception will be raised if they are used before the C++ instance
85 reprStr
= "wxPython wrapper for UNBORN object! (The C++ object is not initialized yet.)"
86 attrStr
= "The C++ part of this object has not been initialized, attribute access not allowed."
89 #if not hasattr(self, "_name"):
90 # self._name = "[unknown]"
91 return self
.reprStr
#% self._name
93 def __getattr__(self
, *args
):
94 #if not hasattr(self, "_name"):
95 # self._name = "[unknown]"
96 raise PyUnbornObjectError(self
.attrStr
) # % self._name )
98 def __nonzero__(self
):
102 #----------------------------------------------------------------------------
104 def CallAfter(callable, *args
, **kw
):
106 Call the specified function after the current and pending event
107 handlers have been completed. This is also good for making GUI
108 method calls from non-GUI threads. Any extra positional or
109 keyword args are passed on to the callable when it is called.
111 :see: `wx.FutureCall`
114 assert app
is not None, 'No wx.App created yet'
116 if not hasattr(app
, "_CallAfterId"):
117 app
._CallAfterId
= wx
.NewEventType()
118 app
.Connect(-1, -1, app
._CallAfterId
,
119 lambda event
: event
.callable(*event
.args
, **event
.kw
) )
121 evt
.SetEventType(app
._CallAfterId
)
122 evt
.callable = callable
125 wx
.PostEvent(app
, evt
)
127 #----------------------------------------------------------------------------
132 A convenience class for `wx.Timer`, that calls the given callable
133 object once after the given amount of milliseconds, passing any
134 positional or keyword args. The return value of the callable is
135 availbale after it has been run with the `GetResult` method.
137 If you don't need to get the return value or restart the timer
138 then there is no need to hold a reference to this object. It will
139 hold a reference to itself while the timer is running (the timer
140 has a reference to self.Notify) but the cycle will be broken when
141 the timer completes, automatically cleaning up the wx.FutureCall
146 def __init__(self
, millis
, callable, *args
, **kwargs
):
148 self
.callable = callable
149 self
.SetArgs(*args
, **kwargs
)
161 def Start(self
, millis
=None, *args
, **kwargs
):
166 if millis
is not None:
169 self
.SetArgs(*args
, **kwargs
)
171 self
.timer
= wx
.PyTimer(self
.Notify
)
172 self
.timer
.Start(self
.millis
, wx
.TIMER_ONE_SHOT
)
179 Stop and destroy the timer.
181 if self
.timer
is not None:
186 def GetInterval(self
):
187 if self
.timer
is not None:
188 return self
.timer
.GetInterval()
194 return self
.timer
is not None and self
.timer
.IsRunning()
197 def SetArgs(self
, *args
, **kwargs
):
199 (Re)set the args passed to the callable object. This is
200 useful in conjunction with Restart if you want to schedule a
201 new call to the same callable object but with different
216 The timer has expired so call the callable.
218 if self
.callable and getattr(self
.callable, 'im_self', True):
221 self
.result
= self
.callable(*self
.args
, **self
.kwargs
)
224 # if it wasn't restarted, then cleanup
225 wx
.CallAfter(self
.Stop
)
229 #----------------------------------------------------------------------------
230 # Control which items in this module should be documented by epydoc.
231 # We allow only classes and functions, which will help reduce the size
232 # of the docs by filtering out the zillions of constants, EVT objects,
233 # and etc that don't make much sense by themselves, but are instead
234 # documented (or will be) as part of the classes/functions/methods
235 # where they should be used.
239 A filter for epydoc that only allows non-Ptr classes and
240 fucntions, in order to reduce the clutter in the API docs.
242 def __init__(self
, globals):
243 self
._globals
= globals
245 def __call__(self
, name
):
247 obj
= self
._globals
.get(name
, None)
248 if type(obj
) not in [type, types
.ClassType
, types
.FunctionType
, types
.BuiltinFunctionType
]:
250 if name
.startswith('_') or name
.endswith('Ptr') or name
.startswith('EVT'):
254 #----------------------------------------------------------------------------
255 #----------------------------------------------------------------------------
257 # Import other modules in this package that should show up in the
258 # "core" wx namespace
260 from _windows
import *
261 from _controls
import *
265 # Fixup the stock objects since they can't be used yet. (They will be
266 # restored in wx.PyApp.OnInit.)
267 _core_
._wxPyFixStockObjects
()
269 #----------------------------------------------------------------------------
270 #----------------------------------------------------------------------------