def enhanced_user_input(): root = ui.window_from_dicttree(yaml.load(file('ui.yaml'))) ui.desktop.add_child(root) ch = stackless.channel() for id_ in [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 'delete', 'return', 'star', 'hash']: button = ui.desktop.find_window(id_) button.callback = lambda btn=button: ch.send(btn.label.text) view = ui.desktop.find_window('view') text = [] serial_no = 0 # In a dict so they can be updated from within inner functions. # In Python 3 we'd use `nonlocal` vars. current = {'value': None, 'serial': 0} def get_current(): return current['value'] def set_current(val): current['value'] = val def wait_and_clear(): current['serial'] += 1 serial = current['serial'] start = time.time() while time.time() - start < key_timeout: stackless.schedule() if current['serial'] == serial: current['value'] = None while True: event = ch.receive() if event == 'RET': ui.desktop.remove_child(root) return ''.join(text) elif event == 'DEL': set_current(None) try: del text[-1] except IndexError: pass elif event == get_current(): index = (index + 1) % len(event) text[-1] = event[index] else: set_current(event) index = 0 text.append(event[0]) view.set_text(''.join(text)) stackless.tasklet(wait_and_clear)()
def run(filename): w = pyglet.window.Window(fullscreen=True) ui.init(w) @w.event def on_key_press(k, *etc): if k == key.ESCAPE: pyglet.app.exit() glPointSize(2) glClearColor(.2, .2, .2, 1.) glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) glEnable(GL_BLEND) ui.desktop.add_child(ui.window_from_dicttree(yaml.load(file(filename)))) stackless.tasklet(pyglet.app.run)() stackless.run()
def copy_children(self, filename): for child in ui.window_from_dicttree(yaml.load(file(filename))).children: self.children.append(child)