Show More
@@ -19,7 +19,8 b' from IPython.lib.inputhook import (' | |||||
19 | enable_wx, disable_wx, |
|
19 | enable_wx, disable_wx, | |
20 | enable_gtk, disable_gtk, |
|
20 | enable_gtk, disable_gtk, | |
21 | enable_qt4, disable_qt4, |
|
21 | enable_qt4, disable_qt4, | |
22 | enable_tk, disable_tk |
|
22 | enable_tk, disable_tk, | |
|
23 | set_inputhook, clear_inputhook | |||
23 | ) |
|
24 | ) | |
24 |
|
25 | |||
25 | #----------------------------------------------------------------------------- |
|
26 | #----------------------------------------------------------------------------- |
@@ -23,6 +23,7 b' import ctypes' | |||||
23 |
|
23 | |||
24 |
|
24 | |||
25 | class InputHookManager(object): |
|
25 | class InputHookManager(object): | |
|
26 | """Manage PyOS_InputHook for different GUI toolkits.""" | |||
26 |
|
27 | |||
27 | def __init__(self): |
|
28 | def __init__(self): | |
28 | self.PYFUNC = ctypes.PYFUNCTYPE(ctypes.c_int) |
|
29 | self.PYFUNC = ctypes.PYFUNCTYPE(ctypes.c_int) | |
@@ -34,12 +35,16 b' class InputHookManager(object):' | |||||
34 | self._installed = False |
|
35 | self._installed = False | |
35 |
|
36 | |||
36 | def get_pyos_inputhook(self): |
|
37 | def get_pyos_inputhook(self): | |
|
38 | """Return the current PyOS_InputHook as a ctypes.c_void_p. | |||
|
39 | """ | |||
37 | return ctypes.c_void_p.in_dll(ctypes.pythonapi,"PyOS_InputHook") |
|
40 | return ctypes.c_void_p.in_dll(ctypes.pythonapi,"PyOS_InputHook") | |
38 |
|
41 | |||
39 | def get_pyos_inputhook_as_func(self): |
|
42 | def get_pyos_inputhook_as_func(self): | |
|
43 | """Return the current PyOS_InputHook as a ctypes.PYFUNCYPE. | |||
|
44 | """ | |||
40 | return self.PYFUNC.in_dll(ctypes.pythonapi,"PyOS_InputHook") |
|
45 | return self.PYFUNC.in_dll(ctypes.pythonapi,"PyOS_InputHook") | |
41 |
|
46 | |||
42 | def set_inputhook(callback): |
|
47 | def set_inputhook(self, callback): | |
43 | """Set PyOS_InputHook to callback and return the previous one. |
|
48 | """Set PyOS_InputHook to callback and return the previous one. | |
44 | """ |
|
49 | """ | |
45 | self._callback = callback |
|
50 | self._callback = callback | |
@@ -52,7 +57,8 b' class InputHookManager(object):' | |||||
52 | return original |
|
57 | return original | |
53 |
|
58 | |||
54 | def clear_inputhook(self): |
|
59 | def clear_inputhook(self): | |
55 |
"""Set PyOS_InputHook to NULL and return the previous one. |
|
60 | """Set PyOS_InputHook to NULL and return the previous one. | |
|
61 | """ | |||
56 | pyos_inputhook_ptr = self.get_pyos_inputhook() |
|
62 | pyos_inputhook_ptr = self.get_pyos_inputhook() | |
57 | original = self.get_pyos_inputhook_as_func() |
|
63 | original = self.get_pyos_inputhook_as_func() | |
58 | pyos_inputhook_ptr.value = ctypes.c_void_p(None).value |
|
64 | pyos_inputhook_ptr.value = ctypes.c_void_p(None).value | |
@@ -60,13 +66,44 b' class InputHookManager(object):' | |||||
60 | return original |
|
66 | return original | |
61 |
|
67 | |||
62 | def enable_wx(self): |
|
68 | def enable_wx(self): | |
|
69 | """Enable event loop integration with wxPython. | |||
|
70 | ||||
|
71 | This methods sets the PyOS_InputHook for wxPython, which allows | |||
|
72 | the wxPython to integrate with terminal based applications like | |||
|
73 | IPython. | |||
|
74 | ||||
|
75 | Once this has been called, you can use wx interactively by doing:: | |||
|
76 | ||||
|
77 | >>> import wx | |||
|
78 | >>> app = wx.App(redirect=False, clearSigInt=False) | |||
|
79 | ||||
|
80 | Both options this constructor are important for things to work | |||
|
81 | properly in an interactive context. | |||
|
82 | ||||
|
83 | But, *don't start the event loop*. That is handled automatically by | |||
|
84 | PyOS_InputHook. | |||
|
85 | """ | |||
63 | from IPython.lib.inputhookwx import inputhook_wx |
|
86 | from IPython.lib.inputhookwx import inputhook_wx | |
64 | self.set_inputhook(inputhook_wx) |
|
87 | self.set_inputhook(inputhook_wx) | |
65 |
|
88 | |||
66 | def disable_wx(self): |
|
89 | def disable_wx(self): | |
|
90 | """Disable event loop integration with wxPython. | |||
|
91 | ||||
|
92 | This merely sets PyOS_InputHook to NULL. | |||
|
93 | """ | |||
67 | self.clear_inputhook() |
|
94 | self.clear_inputhook() | |
68 |
|
95 | |||
69 | def enable_qt4(self): |
|
96 | def enable_qt4(self): | |
|
97 | """Enable event loop integration with PyQt4. | |||
|
98 | ||||
|
99 | This methods sets the PyOS_InputHook for wxPython, which allows | |||
|
100 | the PyQt4 to integrate with terminal based applications like | |||
|
101 | IPython. | |||
|
102 | ||||
|
103 | Once this has been called, you can simply create a QApplication and | |||
|
104 | use it. But, *don't start the event loop*. That is handled | |||
|
105 | automatically by PyOS_InputHook. | |||
|
106 | """ | |||
70 | from PyQt4 import QtCore |
|
107 | from PyQt4 import QtCore | |
71 | # PyQt4 has had this since 4.3.1. In version 4.2, PyOS_InputHook |
|
108 | # PyQt4 has had this since 4.3.1. In version 4.2, PyOS_InputHook | |
72 | # was set when QtCore was imported, but if it ever got removed, |
|
109 | # was set when QtCore was imported, but if it ever got removed, | |
@@ -78,9 +115,23 b' class InputHookManager(object):' | |||||
78 | pass |
|
115 | pass | |
79 |
|
116 | |||
80 | def disable_qt4(self): |
|
117 | def disable_qt4(self): | |
|
118 | """Disable event loop integration with PyQt4. | |||
|
119 | ||||
|
120 | This merely sets PyOS_InputHook to NULL. | |||
|
121 | """ | |||
81 | self.clear_inputhook() |
|
122 | self.clear_inputhook() | |
82 |
|
123 | |||
83 | def enable_gtk(self): |
|
124 | def enable_gtk(self): | |
|
125 | """Enable event loop integration with PyGTK. | |||
|
126 | ||||
|
127 | This methods sets the PyOS_InputHook for PyGTK, which allows | |||
|
128 | the PyGTK to integrate with terminal based applications like | |||
|
129 | IPython. | |||
|
130 | ||||
|
131 | Once this has been called, you can simple create PyGTK objects and | |||
|
132 | use them. But, *don't start the event loop*. That is handled | |||
|
133 | automatically by PyOS_InputHook. | |||
|
134 | """ | |||
84 | import gtk |
|
135 | import gtk | |
85 | try: |
|
136 | try: | |
86 | gtk.set_interactive(True) |
|
137 | gtk.set_interactive(True) | |
@@ -90,6 +141,10 b' class InputHookManager(object):' | |||||
90 | add_inputhook(inputhook_gtk) |
|
141 | add_inputhook(inputhook_gtk) | |
91 |
|
142 | |||
92 | def disable_gtk(self): |
|
143 | def disable_gtk(self): | |
|
144 | """Disable event loop integration with PyGTK. | |||
|
145 | ||||
|
146 | This merely sets PyOS_InputHook to NULL. | |||
|
147 | """ | |||
93 | self.clear_inputhook() |
|
148 | self.clear_inputhook() | |
94 |
|
149 | |||
95 | def enable_tk(self): |
|
150 | def enable_tk(self): | |
@@ -97,6 +152,10 b' class InputHookManager(object):' | |||||
97 | pass |
|
152 | pass | |
98 |
|
153 | |||
99 | def disable_tk(self): |
|
154 | def disable_tk(self): | |
|
155 | """Disable event loop integration with Tkinter. | |||
|
156 | ||||
|
157 | This merely sets PyOS_InputHook to NULL. | |||
|
158 | """ | |||
100 | self.clear_inputhook() |
|
159 | self.clear_inputhook() | |
101 |
|
160 | |||
102 | inputhook_manager = InputHookManager() |
|
161 | inputhook_manager = InputHookManager() | |
@@ -109,3 +168,5 b' enable_gtk = inputhook_manager.enable_gtk' | |||||
109 | disable_gtk = inputhook_manager.disable_gtk |
|
168 | disable_gtk = inputhook_manager.disable_gtk | |
110 | enable_tk = inputhook_manager.enable_tk |
|
169 | enable_tk = inputhook_manager.enable_tk | |
111 | disable_tk = inputhook_manager.disable_tk |
|
170 | disable_tk = inputhook_manager.disable_tk | |
|
171 | clear_inputhook = inputhook_manager.clear_inputhook | |||
|
172 | set_inputhook = inputhook_manager.set_inputhook No newline at end of file |
@@ -13,9 +13,17 b' Authors: Brian Granger' | |||||
13 | # the file COPYING, distributed as part of this software. |
|
13 | # the file COPYING, distributed as part of this software. | |
14 | #----------------------------------------------------------------------------- |
|
14 | #----------------------------------------------------------------------------- | |
15 |
|
15 | |||
|
16 | #----------------------------------------------------------------------------- | |||
|
17 | # Imports | |||
|
18 | #----------------------------------------------------------------------------- | |||
|
19 | ||||
16 | import sys |
|
20 | import sys | |
17 | import gtk, gobject |
|
21 | import gtk, gobject | |
18 |
|
22 | |||
|
23 | #----------------------------------------------------------------------------- | |||
|
24 | # Code | |||
|
25 | #----------------------------------------------------------------------------- | |||
|
26 | ||||
19 |
|
27 | |||
20 | def _main_quit(*args, **kwargs): |
|
28 | def _main_quit(*args, **kwargs): | |
21 | gtk.main_quit() |
|
29 | gtk.main_quit() |
General Comments 0
You need to be logged in to leave comments.
Login now