##// END OF EJS Templates
Added code for the pyglet interactive session
Nicolas Rougier -
Show More
@@ -0,0 +1,93 b''
1 # encoding: utf-8
2
3 """
4 Enable pyglet to be used interacive by setting PyOS_InputHook.
5
6 Authors: Nicolas P. Rougier
7 """
8
9 #-----------------------------------------------------------------------------
10 # Copyright (C) 2008-2009 The IPython Development Team
11 #
12 # Distributed under the terms of the BSD License. The full license is in
13 # the file COPYING, distributed as part of this software.
14 #-----------------------------------------------------------------------------
15
16 #-----------------------------------------------------------------------------
17 # Imports
18 #-----------------------------------------------------------------------------
19
20 import os
21 import signal
22 import sys
23 import time
24 from timeit import default_timer as clock
25 import pyglet
26
27 if os.name == 'posix':
28 import select
29 elif sys.platform == 'win32':
30 import msvcrt
31
32 #-----------------------------------------------------------------------------
33 # Code
34 #-----------------------------------------------------------------------------
35
36 def stdin_ready():
37 if os.name == 'posix':
38 infds, outfds, erfds = select.select([sys.stdin],[],[],0)
39 if infds:
40 return True
41 else:
42 return False
43 elif sys.platform == 'win32':
44 return msvcrt.kbhit()
45
46
47 def inputhook_pyglet():
48 """Run the pyglet event loop by processing pending events only.
49
50 This keeps processing pending events until stdin is ready. After
51 processing all pending events, a call to time.sleep is inserted. This is
52 needed, otherwise, CPU usage is at 100%. This sleep time should be tuned
53 though for best performance.
54 """
55 # We need to protect against a user pressing Control-C when IPython is
56 # idle and this is running. We trap KeyboardInterrupt and pass.
57 try:
58 t = clock()
59 while not stdin_ready():
60 pyglet.clock.tick()
61 for window in pyglet.app.windows:
62 window.switch_to()
63 window.dispatch_events()
64 window.dispatch_event('on_draw')
65 window.flip()
66
67 # We need to sleep at this point to keep the idle CPU load
68 # low. However, if sleep to long, GUI response is poor. As
69 # a compromise, we watch how often GUI events are being processed
70 # and switch between a short and long sleep time. Here are some
71 # stats useful in helping to tune this.
72 # time CPU load
73 # 0.001 13%
74 # 0.005 3%
75 # 0.01 1.5%
76 # 0.05 0.5%
77 used_time = clock() - t
78 if used_time > 5*60.0:
79 # print 'Sleep for 5 s' # dbg
80 time.sleep(5.0)
81 elif used_time > 10.0:
82 # print 'Sleep for 1 s' # dbg
83 time.sleep(1.0)
84 elif used_time > 0.1:
85 # Few GUI events coming in, so we can sleep longer
86 # print 'Sleep for 0.05 s' # dbg
87 time.sleep(0.05)
88 else:
89 # Many GUI events coming in, so sleep only very little
90 time.sleep(0.001)
91 except KeyboardInterrupt:
92 pass
93 return 0
@@ -0,0 +1,29 b''
1 #!/usr/bin/env python
2 """Simple pyglet example to manually test event loop integration.
3
4 This is meant to run tests manually in ipython as:
5
6 In [5]: %gui pyglet
7
8 In [6]: %run gui-pyglet.py
9 """
10
11 import pyglet
12
13
14 window = pyglet.window.Window()
15 label = pyglet.text.Label('Hello, world',
16 font_name='Times New Roman',
17 font_size=36,
18 x=window.width//2, y=window.height//2,
19 anchor_x='center', anchor_y='center')
20 @window.event
21 def on_draw():
22 window.clear()
23 label.draw()
24
25 try:
26 from IPython.lib.inputhook import enable_pyglet
27 enable_pyglet()
28 except ImportError:
29 pyglet.app.run()
General Comments 0
You need to be logged in to leave comments. Login now