##// END OF EJS Templates
GUI support for wx, qt and tk.
Brian Granger -
Show More
@@ -35,8 +35,11 b' def main():'
35 35 group = parser.add_mutually_exclusive_group()
36 36 group.add_argument('--pure', action='store_true', help = \
37 37 'use a pure Python kernel instead of an IPython kernel')
38 group.add_argument('--pylab', action='store_true',
39 help='use a kernel with PyLab enabled')
38 group.add_argument('--pylab', type=str, metavar='GUI', nargs='?',
39 const='auto', help = \
40 "Pre-load matplotlib and numpy for interactive use. If GUI is not \
41 given, the GUI backend is matplotlib's, otherwise use one of: \
42 ['tk', 'gtk', 'qt', 'wx', 'payload-svg'].")
40 43 parser.add_argument('--rich', action='store_true',
41 44 help='use a rich text frontend')
42 45 args = parser.parse_args()
@@ -56,7 +59,10 b' def main():'
56 59 if args.rich:
57 60 kernel_manager.start_kernel(pylab='payload-svg')
58 61 else:
59 kernel_manager.start_kernel(pylab='qt4')
62 if args.pylab == 'auto':
63 kernel_manager.start_kernel(pylab='qt4')
64 else:
65 kernel_manager.start_kernel(pylab=args.pylab)
60 66 else:
61 67 kernel_manager.start_kernel()
62 68 kernel_manager.start_channels()
@@ -73,8 +73,20 b' def activate_matplotlib(backend):'
73 73 else:
74 74 matplotlib.use(backend)
75 75 matplotlib.interactive(True)
76
77 # This must be imported last in the matplotlib series, after
78 # backend/interactivity choices have been made
76 79 import matplotlib.pylab as pylab
77 80
81 # XXX For now leave this commented out, but depending on discussions with
82 # mpl-dev, we may be able to allow interactive switching...
83 #import matplotlib.pyplot
84 #matplotlib.pyplot.switch_backend(backend)
85
86 pylab.show._needmain = False
87 # We need to detect at runtime whether show() is called by the user.
88 # For this, we wrap it into a decorator which adds a 'called' flag.
89 pylab.draw_if_interactive = flag_calls(pylab.draw_if_interactive)
78 90
79 91 def import_pylab(user_ns, import_all=True):
80 92 """Import the standard pylab symbols into user_ns."""
@@ -115,24 +127,8 b' def pylab_activate(user_ns, gui=None, import_all=True):'
115 127 The actual gui used (if not given as input, it was obtained from matplotlib
116 128 itself, and will be needed next to configure IPython's gui integration.
117 129 """
118
119 130 gui, backend = find_gui_and_backend(gui)
120 131 activate_matplotlib(backend)
121
122 # This must be imported last in the matplotlib series, after
123 # backend/interactivity choices have been made
124 import matplotlib.pylab as pylab
125
126 # XXX For now leave this commented out, but depending on discussions with
127 # mpl-dev, we may be able to allow interactive switching...
128 #import matplotlib.pyplot
129 #matplotlib.pyplot.switch_backend(backend)
130
131 pylab.show._needmain = False
132 # We need to detect at runtime whether show() is called by the user.
133 # For this, we wrap it into a decorator which adds a 'called' flag.
134 pylab.draw_if_interactive = flag_calls(pylab.draw_if_interactive)
135
136 132 import_pylab(user_ns)
137 133
138 134 print """
@@ -293,16 +293,79 b' class Kernel(Configurable):'
293 293
294 294
295 295 class QtKernel(Kernel):
296 """A Kernel subclass with Qt support."""
296 297
297 298 def start(self):
298 299 """Start a kernel with QtPy4 event loop integration."""
300
299 301 from PyQt4 import QtGui, QtCore
300 self.qapp = app = QtGui.QApplication([])
301 self.qtimer = QtCore.QTimer()
302 self.qtimer.timeout.connect(self.do_one_iteration)
303 self.qtimer.start(50)
304 self.qapp.exec_()
302 self.app = QtGui.QApplication([])
303 self.app.setQuitOnLastWindowClosed (False)
304 self.timer = QtCore.QTimer()
305 self.timer.timeout.connect(self.do_one_iteration)
306 self.timer.start(50)
307 self.app.exec_()
308
309
310 class WxKernel(Kernel):
311 """A Kernel subclass with Wx support."""
305 312
313 def start(self):
314 """Start a kernel with wx event loop support."""
315
316 import wx
317 doi = self.do_one_iteration
318
319 # We have to put the wx.Timer in a wx.Frame for it to fire properly.
320 # We make the Frame hidden when we create it in the main app below.
321 class TimerFrame(wx.Frame):
322 def __init__(self, func):
323 wx.Frame.__init__(self, None, -1)
324 self.timer = wx.Timer(self)
325 self.timer.Start(50)
326 self.Bind(wx.EVT_TIMER, self.on_timer)
327 self.func = func
328 def on_timer(self, event):
329 self.func()
330
331 # We need a custom wx.App to create our Frame subclass that has the
332 # wx.Timer to drive the ZMQ event loop.
333 class IPWxApp(wx.App):
334 def OnInit(self):
335 self.frame = TimerFrame(doi)
336 self.frame.Show(False)
337 return True
338
339 # The redirect=False here makes sure that wx doesn't replace
340 # sys.stdout/stderr with its own classes.
341 self.app = IPWxApp(redirect=False)
342 self.app.MainLoop()
343
344
345 class TkKernel(Kernel):
346 """A Kernel subclass with Tk support."""
347
348 def start(self):
349 """Start a Tk enabled event loop."""
350
351 import Tkinter
352 doi = self.do_one_iteration
353
354 # For Tkinter, we create a Tk object and call its withdraw method.
355 class Timer(object):
356 def __init__(self, func):
357 self.app = Tkinter.Tk()
358 self.app.withdraw()
359 self.func = func
360 def on_timer(self):
361 self.func()
362 self.app.after(50, self.on_timer)
363 def start(self):
364 self.on_timer() # Call it once to get things going.
365 self.app.mainloop()
366
367 self.timer = Timer(doi)
368 self.timer.start()
306 369
307 370 #-----------------------------------------------------------------------------
308 371 # Kernel main and launch functions
@@ -365,22 +428,21 b" given, the GUI backend is matplotlib's, otherwise use one of: \\"
365 428 _kernel_classes = {
366 429 'qt' : QtKernel,
367 430 'qt4' : QtKernel,
368 'payload-svg':Kernel
431 'payload-svg':Kernel,
432 'wx' : WxKernel,
433 'tk' : TkKernel
369 434 }
370 435 if namespace.pylab:
371 436 if namespace.pylab == 'auto':
372 437 gui, backend = pylabtools.find_gui_and_backend()
373 438 else:
374 439 gui, backend = pylabtools.find_gui_and_backend(namespace.pylab)
375 print gui, backend
376 440 kernel_class = _kernel_classes.get(gui)
377 441 if kernel_class is None:
378 442 raise ValueError('GUI is not supported: %r' % gui)
379 443 pylabtools.activate_matplotlib(backend)
380 444
381 print>>sys.__stdout__, kernel_class
382 445 kernel = make_kernel(namespace, kernel_class, OutStream)
383 print >>sys.__stdout__, kernel
384 446
385 447 if namespace.pylab:
386 448 pylabtools.import_pylab(kernel.shell.user_ns)
General Comments 0
You need to be logged in to leave comments. Login now