]>
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<-->unicode conversion encoding from the
36 # locale. This encoding is used when string or unicode objects need
37 # to be converted in order to pass them to wxWidgets. Please be aware
38 # that the default encoding within the same locale may be slightly
39 # different on different platforms. For example, please see
40 # http://www.alanwood.net/demos/charsetdiffs.html for differences
41 # between the common latin/roman encodings.
43 default
= _sys
.getdefaultencoding()
44 if default
== 'ascii':
48 default
= locale
.getdefaultlocale()[1]
49 codecs
.lookup(default
)
50 except (ValueError, LookupError):
51 default
= _sys
.getdefaultencoding()
55 wx
.SetDefaultPyEncoding(default
)
58 #----------------------------------------------------------------------------
60 class PyDeadObjectError(AttributeError):
63 class _wxPyDeadObject(object):
65 Instances of wx objects that are OOR capable will have their __class__
66 changed to this class when the C++ object is deleted. This should help
67 prevent crashes due to referencing a bogus C++ pointer.
69 reprStr
= "wxPython wrapper for DELETED %s object! (The C++ object no longer exists.)"
70 attrStr
= "The C++ part of the %s object has been deleted, attribute access no longer allowed."
73 if not hasattr(self
, "_name"):
74 self
._name
= "[unknown]"
75 return self
.reprStr
% self
._name
77 def __getattr__(self
, *args
):
78 if not hasattr(self
, "_name"):
79 self
._name
= "[unknown]"
80 raise PyDeadObjectError(self
.attrStr
% self
._name
)
82 def __nonzero__(self
):
87 class PyUnbornObjectError(AttributeError):
90 class _wxPyUnbornObject(object):
92 Some stock objects are created when the wx._core module is
93 imported, but their C++ instance is not created until the wx.App
94 object is created and initialized. These object instances will
95 temporarily have their __class__ changed to this class so an
96 exception will be raised if they are used before the C++ instance
100 reprStr
= "wxPython wrapper for UNBORN object! (The C++ object is not initialized yet.)"
101 attrStr
= "The C++ part of this object has not been initialized, attribute access not allowed."
104 #if not hasattr(self, "_name"):
105 # self._name = "[unknown]"
106 return self
.reprStr
#% self._name
108 def __getattr__(self
, *args
):
109 #if not hasattr(self, "_name"):
110 # self._name = "[unknown]"
111 raise PyUnbornObjectError(self
.attrStr
) # % self._name )
113 def __nonzero__(self
):
117 #----------------------------------------------------------------------------
119 def CallAfter(callable, *args
, **kw
):
121 Call the specified function after the current and pending event
122 handlers have been completed. This is also good for making GUI
123 method calls from non-GUI threads. Any extra positional or
124 keyword args are passed on to the callable when it is called.
126 :see: `wx.FutureCall`
129 assert app
is not None, 'No wx.App created yet'
131 if not hasattr(app
, "_CallAfterId"):
132 app
._CallAfterId
= wx
.NewEventType()
133 app
.Connect(-1, -1, app
._CallAfterId
,
134 lambda event
: event
.callable(*event
.args
, **event
.kw
) )
136 evt
.SetEventType(app
._CallAfterId
)
137 evt
.callable = callable
140 wx
.PostEvent(app
, evt
)
142 #----------------------------------------------------------------------------
147 A convenience class for `wx.Timer`, that calls the given callable
148 object once after the given amount of milliseconds, passing any
149 positional or keyword args. The return value of the callable is
150 availbale after it has been run with the `GetResult` method.
152 If you don't need to get the return value or restart the timer
153 then there is no need to hold a reference to this object. It will
154 hold a reference to itself while the timer is running (the timer
155 has a reference to self.Notify) but the cycle will be broken when
156 the timer completes, automatically cleaning up the wx.FutureCall
161 def __init__(self
, millis
, callable, *args
, **kwargs
):
163 self
.callable = callable
164 self
.SetArgs(*args
, **kwargs
)
176 def Start(self
, millis
=None, *args
, **kwargs
):
181 if millis
is not None:
184 self
.SetArgs(*args
, **kwargs
)
186 self
.timer
= wx
.PyTimer(self
.Notify
)
187 self
.timer
.Start(self
.millis
, wx
.TIMER_ONE_SHOT
)
194 Stop and destroy the timer.
196 if self
.timer
is not None:
201 def GetInterval(self
):
202 if self
.timer
is not None:
203 return self
.timer
.GetInterval()
209 return self
.timer
is not None and self
.timer
.IsRunning()
212 def SetArgs(self
, *args
, **kwargs
):
214 (Re)set the args passed to the callable object. This is
215 useful in conjunction with Restart if you want to schedule a
216 new call to the same callable object but with different
231 The timer has expired so call the callable.
233 if self
.callable and getattr(self
.callable, 'im_self', True):
236 self
.result
= self
.callable(*self
.args
, **self
.kwargs
)
239 # if it wasn't restarted, then cleanup
240 wx
.CallAfter(self
.Stop
)
244 #----------------------------------------------------------------------------
245 # Control which items in this module should be documented by epydoc.
246 # We allow only classes and functions, which will help reduce the size
247 # of the docs by filtering out the zillions of constants, EVT objects,
248 # and etc that don't make much sense by themselves, but are instead
249 # documented (or will be) as part of the classes/functions/methods
250 # where they should be used.
254 A filter for epydoc that only allows non-Ptr classes and
255 fucntions, in order to reduce the clutter in the API docs.
257 def __init__(self
, globals):
258 self
._globals
= globals
260 def __call__(self
, name
):
262 obj
= self
._globals
.get(name
, None)
263 if type(obj
) not in [type, types
.ClassType
, types
.FunctionType
, types
.BuiltinFunctionType
]:
265 if name
.startswith('_') or name
.endswith('Ptr') or name
.startswith('EVT'):
269 #----------------------------------------------------------------------------
270 #----------------------------------------------------------------------------
272 # Import other modules in this package that should show up in the
273 # "core" wx namespace
275 from _windows
import *
276 from _controls
import *
280 # Fixup the stock objects since they can't be used yet. (They will be
281 # restored in wx.PyApp.OnInit.)
282 _core_
._wxPyFixStockObjects
()
284 #----------------------------------------------------------------------------
285 #----------------------------------------------------------------------------