forked from ipython/ipython
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge branch 'pyglet' by Nicolas Rougier, with minor fixes.
This adds pyglet event loop integration with a new 'pyglet' option for the --gui flag and %gui magic. The internal implementation is fairly similar to the one for Wx integration.
- Loading branch information
Showing
5 changed files
with
190 additions
and
3 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,115 @@ | ||
# encoding: utf-8 | ||
""" | ||
Enable pyglet to be used interacive by setting PyOS_InputHook. | ||
Authors | ||
------- | ||
* Nicolas P. Rougier | ||
* Fernando Perez | ||
""" | ||
|
||
#----------------------------------------------------------------------------- | ||
# Copyright (C) 2008-2009 The IPython Development Team | ||
# | ||
# Distributed under the terms of the BSD License. The full license is in | ||
# the file COPYING, distributed as part of this software. | ||
#----------------------------------------------------------------------------- | ||
|
||
#----------------------------------------------------------------------------- | ||
# Imports | ||
#----------------------------------------------------------------------------- | ||
|
||
import os | ||
import signal | ||
import sys | ||
import time | ||
from timeit import default_timer as clock | ||
import pyglet | ||
|
||
#----------------------------------------------------------------------------- | ||
# Platform-dependent imports and functions | ||
#----------------------------------------------------------------------------- | ||
|
||
if os.name == 'posix': | ||
import select | ||
|
||
def stdin_ready(): | ||
infds, outfds, erfds = select.select([sys.stdin],[],[],0) | ||
if infds: | ||
return True | ||
else: | ||
return False | ||
|
||
elif sys.platform == 'win32': | ||
import msvcrt | ||
|
||
def stdin_ready(): | ||
return msvcrt.kbhit() | ||
|
||
|
||
# On linux only, window.flip() has a bug that causes an AttributeError on | ||
# window close. For details, see: | ||
# http://groups.google.com/group/pyglet-users/browse_thread/thread/47c1aab9aa4a3d23/c22f9e819826799e?#c22f9e819826799e | ||
|
||
if sys.platform.startswith('linux'): | ||
def flip(window): | ||
try: | ||
window.flip() | ||
except AttributeError: | ||
pass | ||
else: | ||
def flip(window): | ||
window.flip() | ||
|
||
#----------------------------------------------------------------------------- | ||
# Code | ||
#----------------------------------------------------------------------------- | ||
|
||
def inputhook_pyglet(): | ||
"""Run the pyglet event loop by processing pending events only. | ||
This keeps processing pending events until stdin is ready. After | ||
processing all pending events, a call to time.sleep is inserted. This is | ||
needed, otherwise, CPU usage is at 100%. This sleep time should be tuned | ||
though for best performance. | ||
""" | ||
# We need to protect against a user pressing Control-C when IPython is | ||
# idle and this is running. We trap KeyboardInterrupt and pass. | ||
try: | ||
t = clock() | ||
while not stdin_ready(): | ||
pyglet.clock.tick() | ||
for window in pyglet.app.windows: | ||
window.switch_to() | ||
window.dispatch_events() | ||
window.dispatch_event('on_draw') | ||
flip(window) | ||
|
||
# We need to sleep at this point to keep the idle CPU load | ||
# low. However, if sleep to long, GUI response is poor. As | ||
# a compromise, we watch how often GUI events are being processed | ||
# and switch between a short and long sleep time. Here are some | ||
# stats useful in helping to tune this. | ||
# time CPU load | ||
# 0.001 13% | ||
# 0.005 3% | ||
# 0.01 1.5% | ||
# 0.05 0.5% | ||
used_time = clock() - t | ||
if used_time > 5*60.0: | ||
# print 'Sleep for 5 s' # dbg | ||
time.sleep(5.0) | ||
elif used_time > 10.0: | ||
# print 'Sleep for 1 s' # dbg | ||
time.sleep(1.0) | ||
elif used_time > 0.1: | ||
# Few GUI events coming in, so we can sleep longer | ||
# print 'Sleep for 0.05 s' # dbg | ||
time.sleep(0.05) | ||
else: | ||
# Many GUI events coming in, so sleep only very little | ||
time.sleep(0.001) | ||
except KeyboardInterrupt: | ||
pass | ||
return 0 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,33 @@ | ||
#!/usr/bin/env python | ||
"""Simple pyglet example to manually test event loop integration. | ||
This is meant to run tests manually in ipython as: | ||
In [5]: %gui pyglet | ||
In [6]: %run gui-pyglet.py | ||
""" | ||
|
||
import pyglet | ||
|
||
|
||
window = pyglet.window.Window() | ||
label = pyglet.text.Label('Hello, world', | ||
font_name='Times New Roman', | ||
font_size=36, | ||
x=window.width//2, y=window.height//2, | ||
anchor_x='center', anchor_y='center') | ||
@window.event | ||
def on_close(): | ||
window.close() | ||
|
||
@window.event | ||
def on_draw(): | ||
window.clear() | ||
label.draw() | ||
|
||
try: | ||
from IPython.lib.inputhook import enable_pyglet | ||
enable_pyglet() | ||
except ImportError: | ||
pyglet.app.run() |