Show More
@@ -586,6 +586,73 b' class GTKKernel(Kernel):' | |||||
586 | gtk_kernel.start() |
|
586 | gtk_kernel.start() | |
587 |
|
587 | |||
588 |
|
588 | |||
|
589 | class OSXKernel(TkKernel): | |||
|
590 | """A Kernel subclass with Cocoa support via the matplotlib OSX backend.""" | |||
|
591 | ||||
|
592 | def start(self): | |||
|
593 | """Start the kernel, coordinating with the Cocoa CFRunLoop event loop | |||
|
594 | via the matplotlib MacOSX backend. | |||
|
595 | """ | |||
|
596 | import matplotlib | |||
|
597 | if matplotlib.__version__ < '1.1.0': | |||
|
598 | self.log.warn( | |||
|
599 | "MacOSX backend in matplotlib %s doesn't have a Timer, " | |||
|
600 | "falling back on Tk for CFRunLoop integration. Note that " | |||
|
601 | "even this won't work if Tk is linked against X11 instead of " | |||
|
602 | "Cocoa (e.g. EPD). To use the MacOSX backend in the kernel, " | |||
|
603 | "you must use matplotlib >= 1.1.0, or a native libtk." | |||
|
604 | ) | |||
|
605 | return TkKernel.start(self) | |||
|
606 | ||||
|
607 | from matplotlib.backends.backend_macosx import TimerMac, show | |||
|
608 | ||||
|
609 | # scale interval for sec->ms | |||
|
610 | poll_interval = int(1000*self._poll_interval) | |||
|
611 | ||||
|
612 | real_excepthook = sys.excepthook | |||
|
613 | def handle_int(etype, value, tb): | |||
|
614 | """don't let KeyboardInterrupts look like crashes""" | |||
|
615 | if etype is KeyboardInterrupt: | |||
|
616 | io.raw_print("KeyboardInterrupt caught in CFRunLoop") | |||
|
617 | else: | |||
|
618 | real_excepthook(etype, value, tb) | |||
|
619 | ||||
|
620 | # add doi() as a Timer to the CFRunLoop | |||
|
621 | def doi(): | |||
|
622 | # restore excepthook during IPython code | |||
|
623 | sys.excepthook = real_excepthook | |||
|
624 | self.do_one_iteration() | |||
|
625 | # and back: | |||
|
626 | sys.excepthook = handle_int | |||
|
627 | t = TimerMac(poll_interval) | |||
|
628 | t.add_callback(doi) | |||
|
629 | t.start() | |||
|
630 | ||||
|
631 | # but still need a Poller for when there are no active windows, | |||
|
632 | # during which time mainloop() returns immediately | |||
|
633 | poller = zmq.Poller() | |||
|
634 | poller.register(self.shell_socket, zmq.POLLIN) | |||
|
635 | ||||
|
636 | while True: | |||
|
637 | try: | |||
|
638 | # double nested try/except, to properly catch KeyboardInterrupt | |||
|
639 | # due to pyzmq Issue #130 | |||
|
640 | try: | |||
|
641 | # don't let interrupts during mainloop invoke crash_handler: | |||
|
642 | sys.excepthook = handle_int | |||
|
643 | show.mainloop() | |||
|
644 | sys.excepthook = real_excepthook | |||
|
645 | # use poller if mainloop returned (no windows) | |||
|
646 | # scale by extra factor of 10, since it's a real poll | |||
|
647 | poller.poll(10*poll_interval) | |||
|
648 | self.do_one_iteration() | |||
|
649 | except: | |||
|
650 | raise | |||
|
651 | except KeyboardInterrupt: | |||
|
652 | # Ctrl-C shouldn't crash the kernel | |||
|
653 | io.raw_print("KeyboardInterrupt caught in kernel") | |||
|
654 | ||||
|
655 | ||||
589 | #----------------------------------------------------------------------------- |
|
656 | #----------------------------------------------------------------------------- | |
590 | # Aliases and Flags for the IPKernelApp |
|
657 | # Aliases and Flags for the IPKernelApp | |
591 | #----------------------------------------------------------------------------- |
|
658 | #----------------------------------------------------------------------------- | |
@@ -639,7 +706,7 b' class IPKernelApp(KernelApp, InteractiveShellApp):' | |||||
639 | 'qt' : QtKernel, |
|
706 | 'qt' : QtKernel, | |
640 | 'qt4': QtKernel, |
|
707 | 'qt4': QtKernel, | |
641 | 'inline': Kernel, |
|
708 | 'inline': Kernel, | |
642 |
'osx': |
|
709 | 'osx': OSXKernel, | |
643 | 'wx' : WxKernel, |
|
710 | 'wx' : WxKernel, | |
644 | 'tk' : TkKernel, |
|
711 | 'tk' : TkKernel, | |
645 | 'gtk': GTKKernel, |
|
712 | 'gtk': GTKKernel, |
@@ -61,7 +61,7 b' Pylab' | |||||
61 | ===== |
|
61 | ===== | |
62 |
|
62 | |||
63 | One of the most exciting features of the new console is embedded matplotlib |
|
63 | One of the most exciting features of the new console is embedded matplotlib | |
64 |
figures. You can use any standard matplotlib GUI backend |
|
64 | figures. You can use any standard matplotlib GUI backend | |
65 | to draw the figures, and since there is now a two-process model, there is no |
|
65 | to draw the figures, and since there is now a two-process model, there is no | |
66 | longer a conflict between user input and the drawing eventloop. |
|
66 | longer a conflict between user input and the drawing eventloop. | |
67 |
|
67 |
General Comments 0
You need to be logged in to leave comments.
Login now