]>
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")
35 """Returns a string containing version and port info"""
36 ctype
= wx
.USE_UNICODE
and 'unicode' or 'ansi'
37 if wx
.Platform
== '__WXMSW__':
39 elif wx
.Platform
== '__WXMAC__':
41 elif wx
.Platform
== '__WXGTK__':
43 if 'gtk2' in wx
.PlatformInfo
:
48 return "%s (%s-%s)" % (wx
.VERSION_STRING
, port
, ctype
)
51 #----------------------------------------------------------------------------
53 # Set wxPython's default string<-->unicode conversion encoding from
54 # the locale, but only if Python's default hasn't been changed. (We
55 # assume that if the user has customized it already then that is the
56 # encoding we need to use as well.)
58 # The encoding selected here is used when string or unicode objects
59 # need to be converted in order to pass them to wxWidgets. Please be
60 # aware that the default encoding within the same locale may be
61 # slightly different on different platforms. For example, please see
62 # http://www.alanwood.net/demos/charsetdiffs.html for differences
63 # between the common latin/roman encodings.
65 default
= _sys
.getdefaultencoding()
66 if default
== 'ascii':
70 default
= locale
.getdefaultlocale()[1]
71 codecs
.lookup(default
)
72 except (ValueError, LookupError, TypeError):
73 default
= _sys
.getdefaultencoding()
77 wx
.SetDefaultPyEncoding(default
)
80 #----------------------------------------------------------------------------
82 class PyDeadObjectError(AttributeError):
85 class _wxPyDeadObject(object):
87 Instances of wx objects that are OOR capable will have their __class__
88 changed to this class when the C++ object is deleted. This should help
89 prevent crashes due to referencing a bogus C++ pointer.
91 reprStr
= "wxPython wrapper for DELETED %s object! (The C++ object no longer exists.)"
92 attrStr
= "The C++ part of the %s object has been deleted, attribute access no longer allowed."
95 if not hasattr(self
, "_name"):
96 self
._name
= "[unknown]"
97 return self
.reprStr
% self
._name
99 def __getattr__(self
, *args
):
100 if not hasattr(self
, "_name"):
101 self
._name
= "[unknown]"
102 raise PyDeadObjectError(self
.attrStr
% self
._name
)
104 def __nonzero__(self
):
109 class PyUnbornObjectError(AttributeError):
112 class _wxPyUnbornObject(object):
114 Some stock objects are created when the wx._core module is
115 imported, but their C++ instance is not created until the wx.App
116 object is created and initialized. These object instances will
117 temporarily have their __class__ changed to this class so an
118 exception will be raised if they are used before the C++ instance
122 reprStr
= "wxPython wrapper for UNBORN object! (The C++ object is not initialized yet.)"
123 attrStr
= "The C++ part of this object has not been initialized, attribute access not allowed."
126 #if not hasattr(self, "_name"):
127 # self._name = "[unknown]"
128 return self
.reprStr
#% self._name
130 def __getattr__(self
, *args
):
131 #if not hasattr(self, "_name"):
132 # self._name = "[unknown]"
133 raise PyUnbornObjectError(self
.attrStr
) # % self._name )
135 def __nonzero__(self
):
139 #----------------------------------------------------------------------------
141 def CallAfter(callable, *args
, **kw
):
143 Call the specified function after the current and pending event
144 handlers have been completed. This is also good for making GUI
145 method calls from non-GUI threads. Any extra positional or
146 keyword args are passed on to the callable when it is called.
151 assert app
is not None, 'No wx.App created yet'
153 if not hasattr(app
, "_CallAfterId"):
154 app
._CallAfterId
= wx
.NewEventType()
155 app
.Connect(-1, -1, app
._CallAfterId
,
156 lambda event
: event
.callable(*event
.args
, **event
.kw
) )
158 evt
.SetEventType(app
._CallAfterId
)
159 evt
.callable = callable
162 wx
.PostEvent(app
, evt
)
164 #----------------------------------------------------------------------------
169 A convenience class for `wx.Timer`, that calls the given callable
170 object once after the given amount of milliseconds, passing any
171 positional or keyword args. The return value of the callable is
172 availbale after it has been run with the `GetResult` method.
174 If you don't need to get the return value or restart the timer
175 then there is no need to hold a reference to this object. It will
176 hold a reference to itself while the timer is running (the timer
177 has a reference to self.Notify) but the cycle will be broken when
178 the timer completes, automatically cleaning up the wx.CallLater
183 def __init__(self
, millis
, callable, *args
, **kwargs
):
185 self
.callable = callable
186 self
.SetArgs(*args
, **kwargs
)
198 def Start(self
, millis
=None, *args
, **kwargs
):
203 if millis
is not None:
206 self
.SetArgs(*args
, **kwargs
)
208 self
.timer
= wx
.PyTimer(self
.Notify
)
209 self
.timer
.Start(self
.millis
, wx
.TIMER_ONE_SHOT
)
216 Stop and destroy the timer.
218 if self
.timer
is not None:
223 def GetInterval(self
):
224 if self
.timer
is not None:
225 return self
.timer
.GetInterval()
231 return self
.timer
is not None and self
.timer
.IsRunning()
234 def SetArgs(self
, *args
, **kwargs
):
236 (Re)set the args passed to the callable object. This is
237 useful in conjunction with Restart if you want to schedule a
238 new call to the same callable object but with different
253 The timer has expired so call the callable.
255 if self
.callable and getattr(self
.callable, 'im_self', True):
258 self
.result
= self
.callable(*self
.args
, **self
.kwargs
)
261 # if it wasn't restarted, then cleanup
262 wx
.CallAfter(self
.Stop
)
264 Interval
= property(GetInterval
)
265 Result
= property(GetResult
)
268 class FutureCall(CallLater
):
269 """A compatibility alias for `CallLater`."""
271 #----------------------------------------------------------------------------
272 # Control which items in this module should be documented by epydoc.
273 # We allow only classes and functions, which will help reduce the size
274 # of the docs by filtering out the zillions of constants, EVT objects,
275 # and etc that don't make much sense by themselves, but are instead
276 # documented (or will be) as part of the classes/functions/methods
277 # where they should be used.
281 A filter for epydoc that only allows non-Ptr classes and
282 functions, in order to reduce the clutter in the API docs.
284 def __init__(self
, globals):
285 self
._globals
= globals
287 def __call__(self
, name
):
289 obj
= self
._globals
.get(name
, None)
291 # only document classes and function
292 if type(obj
) not in [type, types
.ClassType
, types
.FunctionType
, types
.BuiltinFunctionType
]:
295 # skip other things that are private or will be documented as part of somethign else
296 if name
.startswith('_') or name
.startswith('EVT') or name
.endswith('_swigregister') or name
.endswith('Ptr') :
299 # skip functions that are duplicates of static functions in a class
300 if name
.find('_') != -1:
301 cls
= self
._globals
.get(name
.split('_')[0], None)
302 methname
= name
.split('_')[1]
303 if hasattr(cls
, methname
) and type(getattr(cls
, methname
)) is types
.FunctionType
:
308 #----------------------------------------------------------------------------
309 #----------------------------------------------------------------------------
311 # Import other modules in this package that should show up in the
312 # "core" wx namespace
314 from _windows
import *
315 from _controls
import *
318 #----------------------------------------------------------------------------
319 #----------------------------------------------------------------------------