]>
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 wxWindows.
24 from __version__
import *
25 __version__
= VERSION_STRING
27 assert MAJOR_VERSION
== _core
.MAJOR_VERSION
, "wxPython/wxWindows version mismatch"
28 assert MINOR_VERSION
== _core
.MINOR_VERSION
, "wxPython/wxWindows version mismatch"
29 if RELEASE_VERSION
!= _core
.RELEASE_VERSION
:
31 warnings
.warn("wxPython/wxWindows release number mismatch")
33 #----------------------------------------------------------------------------
35 class PyDeadObjectError(AttributeError):
38 class _wxPyDeadObject(object):
40 Instances of wx objects that are OOR capable will have their __class__
41 changed to this class when the C++ object is deleted. This should help
42 prevent crashes due to referencing a bogus C++ pointer.
44 reprStr
= "wxPython wrapper for DELETED %s object! (The C++ object no longer exists.)"
45 attrStr
= "The C++ part of the %s object has been deleted, attribute access no longer allowed."
48 if not hasattr(self
, "_name"):
49 self
._name
= "[unknown]"
50 return self
.reprStr
% self
._name
52 def __getattr__(self
, *args
):
53 if not hasattr(self
, "_name"):
54 self
._name
= "[unknown]"
55 raise PyDeadObjectError(self
.attrStr
% self
._name
)
57 def __nonzero__(self
):
62 class PyUnbornObjectError(AttributeError):
65 class _wxPyUnbornObject(object):
67 Some stock objects are created when the wx.core module is
68 imported, but their C++ instance is not created until the wx.App
69 object is created and initialized. These object instances will
70 temporarily have their __class__ changed to this class so an
71 exception will be raised if they are used before the C++ instance
75 reprStr
= "wxPython wrapper for UNBORN object! (The C++ object is not initialized yet.)"
76 attrStr
= "The C++ part of this object has not been initialized, attribute access not allowed."
79 #if not hasattr(self, "_name"):
80 # self._name = "[unknown]"
81 return self
.reprStr
#% self._name
83 def __getattr__(self
, *args
):
84 #if not hasattr(self, "_name"):
85 # self._name = "[unknown]"
86 raise PyUnbornObjectError(self
.attrStr
) # % self._name )
88 def __nonzero__(self
):
92 #----------------------------------------------------------------------------
93 _wxPyCallAfterId
= None
95 def CallAfter(callable, *args
, **kw
):
97 Call the specified function after the current and pending event
98 handlers have been completed. This is also good for making GUI
99 method calls from non-GUI threads.
102 assert app
, 'No wxApp created yet'
104 global _wxPyCallAfterId
105 if _wxPyCallAfterId
is None:
106 _wxPyCallAfterId
= wx
.NewEventType()
107 app
.Connect(-1, -1, _wxPyCallAfterId
,
108 lambda event
: event
.callable(*event
.args
, **event
.kw
) )
110 evt
.SetEventType(_wxPyCallAfterId
)
111 evt
.callable = callable
114 wx
.PostEvent(app
, evt
)
117 #----------------------------------------------------------------------------
122 A convenience class for wx.Timer, that calls the given callable
123 object once after the given amount of milliseconds, passing any
124 positional or keyword args. The return value of the callable is
125 availbale after it has been run with the GetResult method.
127 If you don't need to get the return value or restart the timer
128 then there is no need to hold a reference to this object. It will
129 hold a reference to itself while the timer is running (the timer
130 has a reference to self.Notify) but the cycle will be broken when
131 the timer completes, automatically cleaning up the wx.FutureCall
134 def __init__(self
, millis
, callable, *args
, **kwargs
):
136 self
.callable = callable
137 self
.SetArgs(*args
, **kwargs
)
149 def Start(self
, millis
=None, *args
, **kwargs
):
154 if millis
is not None:
157 self
.SetArgs(*args
, **kwargs
)
159 self
.timer
= wx
.PyTimer(self
.Notify
)
160 self
.timer
.Start(self
.millis
, wx
.TIMER_ONE_SHOT
)
167 Stop and destroy the timer.
169 if self
.timer
is not None:
174 def GetInterval(self
):
175 if self
.timer
is not None:
176 return self
.timer
.GetInterval()
182 return self
.timer
is not None and self
.timer
.IsRunning()
185 def SetArgs(self
, *args
, **kwargs
):
187 (Re)set the args passed to the callable object. This is
188 useful in conjunction with Restart if you want to schedule a
189 new call to the same callable object but with different
204 The timer has expired so call the callable.
206 if self
.callable and getattr(self
.callable, 'im_self', True):
209 self
.result
= self
.callable(*self
.args
, **self
.kwargs
)
212 # if it wasn't restarted, then cleanup
213 wx
.CallAfter(self
.Stop
)
216 #----------------------------------------------------------------------------
217 #----------------------------------------------------------------------------
219 # Import other modules in this package that should show up in the
220 # "core" wx namespace
222 from windows
import *
223 from controls
import *
227 # Fixup the stock objects since they can't be used yet. (They will be
228 # restored in wx.PyApp.OnInit.)
229 _core
._wxPyFixStockObjects
()
231 #----------------------------------------------------------------------------
232 #----------------------------------------------------------------------------