Navigation Menu

Skip to content

Instantly share code, notes, and snippets.

@koo5
Last active December 23, 2015 01:29
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save koo5/6560916 to your computer and use it in GitHub Desktop.
Save koo5/6560916 to your computer and use it in GitHub Desktop.
kook@kook:~/kurva_pica/pyglet-1.2alpha1/examples$ ./text_input.py
Traceback (most recent call last):
File "./text_input.py", line 145, in <module>
window = Window(resizable=True)
File "./text_input.py", line 62, in __init__
TextWidget('', 200, 100, self.width - 210, self.batch),
File "./text_input.py", line 28, in __init__
font = self.document.get_font(0)
File "/usr/lib/pymodules/python2.7/pyglet/text/document.py", line 660, in get_font
return iter[position]
File "/usr/lib/pymodules/python2.7/pyglet/text/document.py", line 719, in __getitem__
font_name, font_size, bold, italic = self.zip_iter[index]
File "/usr/lib/pymodules/python2.7/pyglet/text/runlist.py", line 403, in __getitem__
return [i[index] for i in self.range_iterators]
File "/usr/lib/pymodules/python2.7/pyglet/text/runlist.py", line 293, in __getitem__
self.start, self.end, self.value = self.next()
StopIteration
#!/usr/bin/env python
'''Demonstrates basic use of IncrementalTextLayout and Caret.
A simple widget-like system is created in this example supporting keyboard and
mouse focus.
'''
__docformat__ = 'restructuredtext'
__version__ = '$Id: $'
import pyglet
class Rectangle(object):
'''Draws a rectangle into a batch.'''
def __init__(self, x1, y1, x2, y2, batch):
self.vertex_list = batch.add(4, pyglet.gl.GL_QUADS, None,
('v2i', [x1, y1, x2, y1, x2, y2, x1, y2]),
('c4B', [200, 200, 220, 255] * 4)
)
class TextWidget(object):
def __init__(self, text, x, y, width, batch):
self.document = pyglet.text.document.FormattedDocument(text)
self.document.set_style(0, len(self.document.text),
dict(color=(0, 0, 0, 255), font_size = 26)
)
font = self.document.get_font(0)
height = font.ascent - font.descent
self.layout = pyglet.text.layout.IncrementalTextLayout(
self.document, width, height, multiline=False, batch=batch)
self.caret = pyglet.text.caret.Caret(self.layout)
self.layout.x = x
self.layout.y = y
# Rectangular outline
pad = 2
self.rectangle = Rectangle(x - pad, y - pad,
x + width + pad, y + height + pad, batch)
def hit_test(self, x, y):
return (0 < x - self.layout.x < self.layout.width and
0 < y - self.layout.y < self.layout.height)
class Window(pyglet.window.Window):
def __init__(self, *args, **kwargs):
super(Window, self).__init__(400, 140, caption='Text entry')
self.batch = pyglet.graphics.Batch()
self.labels = [
pyglet.text.Label('Name', x=10, y=100, anchor_y='bottom',
color=(0, 0, 0, 255), batch=self.batch),
pyglet.text.Label('Species', x=10, y=60, anchor_y='bottom',
color=(0, 0, 0, 255), batch=self.batch),
pyglet.text.Label('Special abilities', x=10, y=20,
anchor_y='bottom', color=(0, 0, 0, 255),
batch=self.batch)
]
self.widgets = [
TextWidget('', 200, 100, self.width - 210, self.batch),
TextWidget('', 200, 60, self.width - 210, self.batch),
TextWidget('', 200, 20, self.width - 210, self.batch)
]
self.text_cursor = self.get_system_mouse_cursor('text')
self.focus = None
self.set_focus(self.widgets[0])
def on_resize(self, width, height):
super(Window, self).on_resize(width, height)
for widget in self.widgets:
widget.width = width - 110
def on_draw(self):
pyglet.gl.glClearColor(1, 1, 1, 1)
self.clear()
self.batch.draw()
def on_mouse_motion(self, x, y, dx, dy):
for widget in self.widgets:
if widget.hit_test(x, y):
self.set_mouse_cursor(self.text_cursor)
break
else:
self.set_mouse_cursor(None)
def on_mouse_press(self, x, y, button, modifiers):
for widget in self.widgets:
if widget.hit_test(x, y):
self.set_focus(widget)
break
else:
self.set_focus(None)
if self.focus:
self.focus.caret.on_mouse_press(x, y, button, modifiers)
def on_mouse_drag(self, x, y, dx, dy, buttons, modifiers):
if self.focus:
self.focus.caret.on_mouse_drag(x, y, dx, dy, buttons, modifiers)
def on_text(self, text):
if self.focus:
self.focus.caret.on_text(text)
def on_text_motion(self, motion):
if self.focus:
self.focus.caret.on_text_motion(motion)
def on_text_motion_select(self, motion):
if self.focus:
self.focus.caret.on_text_motion_select(motion)
def on_key_press(self, symbol, modifiers):
if symbol == pyglet.window.key.TAB:
if modifiers & pyglet.window.key.MOD_SHIFT:
dir = -1
else:
dir = 1
if self.focus in self.widgets:
i = self.widgets.index(self.focus)
else:
i = 0
dir = 0
self.set_focus(self.widgets[(i + dir) % len(self.widgets)])
elif symbol == pyglet.window.key.ESCAPE:
pyglet.app.exit()
def set_focus(self, focus):
if self.focus:
self.focus.caret.visible = False
self.focus.caret.mark = self.focus.caret.position = 0
self.focus = focus
if self.focus:
self.focus.caret.visible = True
self.focus.caret.mark = 0
self.focus.caret.position = len(self.focus.document.text)
window = Window(resizable=True)
pyglet.app.run()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment