]>
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         if hasattr(locale
, 'getpreferredencoding'): 
  71             default 
= locale
.getpreferredencoding() 
  73             default 
= locale
.getdefaultlocale()[1] 
  74         codecs
.lookup(default
) 
  75     except (ValueError, LookupError, TypeError): 
  76         default 
= _sys
.getdefaultencoding() 
  80     wx
.SetDefaultPyEncoding(default
) 
  83 #---------------------------------------------------------------------------- 
  85 class PyDeadObjectError(AttributeError): 
  88 class _wxPyDeadObject(object): 
  90     Instances of wx objects that are OOR capable will have their __class__ 
  91     changed to this class when the C++ object is deleted.  This should help 
  92     prevent crashes due to referencing a bogus C++ pointer. 
  94     reprStr 
= "wxPython wrapper for DELETED %s object! (The C++ object no longer exists.)" 
  95     attrStr 
= "The C++ part of the %s object has been deleted, attribute access no longer allowed." 
  98         if not hasattr(self
, "_name"): 
  99             self
._name 
= "[unknown]" 
 100         return self
.reprStr 
% self
._name
 
 102     def __getattr__(self
, *args
): 
 103         if not hasattr(self
, "_name"): 
 104             self
._name 
= "[unknown]" 
 105         raise PyDeadObjectError(self
.attrStr 
% self
._name
) 
 107     def __nonzero__(self
): 
 112 class PyUnbornObjectError(AttributeError): 
 115 class _wxPyUnbornObject(object): 
 117     Some stock objects are created when the wx._core module is 
 118     imported, but their C++ instance is not created until the wx.App 
 119     object is created and initialized.  These object instances will 
 120     temporarily have their __class__ changed to this class so an 
 121     exception will be raised if they are used before the C++ instance 
 125     reprStr 
= "wxPython wrapper for UNBORN object! (The C++ object is not initialized yet.)" 
 126     attrStr 
= "The C++ part of this object has not been initialized, attribute access not allowed." 
 129         #if not hasattr(self, "_name"): 
 130         #    self._name = "[unknown]" 
 131         return self
.reprStr 
#% self._name 
 133     def __getattr__(self
, *args
): 
 134         #if not hasattr(self, "_name"): 
 135         #    self._name = "[unknown]" 
 136         raise PyUnbornObjectError(self
.attrStr
) # % self._name ) 
 138     def __nonzero__(self
): 
 142 #---------------------------------------------------------------------------- 
 144 def CallAfter(callable, *args
, **kw
): 
 146     Call the specified function after the current and pending event 
 147     handlers have been completed.  This is also good for making GUI 
 148     method calls from non-GUI threads.  Any extra positional or 
 149     keyword args are passed on to the callable when it is called. 
 154     assert app 
is not None, 'No wx.App created yet' 
 156     if not hasattr(app
, "_CallAfterId"): 
 157         app
._CallAfterId 
= wx
.NewEventType() 
 158         app
.Connect(-1, -1, app
._CallAfterId
, 
 159                     lambda event
: event
.callable(*event
.args
, **event
.kw
) ) 
 161     evt
.SetEventType(app
._CallAfterId
) 
 162     evt
.callable = callable 
 165     wx
.PostEvent(app
, evt
) 
 167 #---------------------------------------------------------------------------- 
 172     A convenience class for `wx.Timer`, that calls the given callable 
 173     object once after the given amount of milliseconds, passing any 
 174     positional or keyword args.  The return value of the callable is 
 175     availbale after it has been run with the `GetResult` method. 
 177     If you don't need to get the return value or restart the timer 
 178     then there is no need to hold a reference to this object.  It will 
 179     hold a reference to itself while the timer is running (the timer 
 180     has a reference to self.Notify) but the cycle will be broken when 
 181     the timer completes, automatically cleaning up the wx.CallLater 
 186     def __init__(self
, millis
, callable, *args
, **kwargs
): 
 188         self
.callable = callable 
 189         self
.SetArgs(*args
, **kwargs
) 
 201     def Start(self
, millis
=None, *args
, **kwargs
): 
 206         if millis 
is not None: 
 209             self
.SetArgs(*args
, **kwargs
) 
 211         self
.timer 
= wx
.PyTimer(self
.Notify
) 
 212         self
.timer
.Start(self
.millis
, wx
.TIMER_ONE_SHOT
) 
 219         Stop and destroy the timer. 
 221         if self
.timer 
is not None: 
 226     def GetInterval(self
): 
 227         if self
.timer 
is not None: 
 228             return self
.timer
.GetInterval() 
 234         return self
.timer 
is not None and self
.timer
.IsRunning() 
 237     def SetArgs(self
, *args
, **kwargs
): 
 239         (Re)set the args passed to the callable object.  This is 
 240         useful in conjunction with Restart if you want to schedule a 
 241         new call to the same callable object but with different 
 256         The timer has expired so call the callable. 
 258         if self
.callable and getattr(self
.callable, 'im_self', True): 
 261             self
.result 
= self
.callable(*self
.args
, **self
.kwargs
) 
 264             # if it wasn't restarted, then cleanup 
 265             wx
.CallAfter(self
.Stop
) 
 267     Interval 
= property(GetInterval
) 
 268     Result 
= property(GetResult
) 
 271 class FutureCall(CallLater
): 
 272     """A compatibility alias for `CallLater`.""" 
 274 #---------------------------------------------------------------------------- 
 275 # Control which items in this module should be documented by epydoc. 
 276 # We allow only classes and functions, which will help reduce the size 
 277 # of the docs by filtering out the zillions of constants, EVT objects, 
 278 # and etc that don't make much sense by themselves, but are instead 
 279 # documented (or will be) as part of the classes/functions/methods 
 280 # where they should be used. 
 284     A filter for epydoc that only allows non-Ptr classes and 
 285     functions, in order to reduce the clutter in the API docs. 
 287     def __init__(self
, globals): 
 288         self
._globals 
= globals 
 290     def __call__(self
, name
): 
 292         obj 
= self
._globals
.get(name
, None) 
 294         # only document classes and function 
 295         if type(obj
) not in [type, types
.ClassType
, types
.FunctionType
, types
.BuiltinFunctionType
]: 
 298         # skip other things that are private or will be documented as part of somethign else 
 299         if name
.startswith('_') or name
.startswith('EVT') or name
.endswith('_swigregister')  or name
.endswith('Ptr') : 
 302         # skip functions that are duplicates of static functions in a class 
 303         if name
.find('_') != -1: 
 304             cls 
= self
._globals
.get(name
.split('_')[0], None) 
 305             methname 
= name
.split('_')[1] 
 306             if hasattr(cls
, methname
) and type(getattr(cls
, methname
)) is types
.FunctionType
: 
 311 #---------------------------------------------------------------------------- 
 312 #---------------------------------------------------------------------------- 
 314 # Import other modules in this package that should show up in the 
 315 # "core" wx namespace 
 317 from _windows 
import * 
 318 from _controls 
import * 
 321 #---------------------------------------------------------------------------- 
 322 #----------------------------------------------------------------------------