#!/usr/bin/env python # -*- coding: utf-8 -*- import urwid, subprocess from urwid import curses_display class Conversation(object): def __init__(self): self.items = urwid.SimpleListWalker( [self.new_question()]) self.listbox = urwid.ListBox(self.items) instruct = urwid.Text("Press F8 to exit.") header = urwid.AttrWrap( instruct, 'header' ) self.top = urwid.Frame(self.listbox, header) def main(self): self.ui = urwid.curses_display.Screen() self.ui.register_palette([ ('header', 'black', 'dark cyan', 'standout'), ('I say', 'default', 'default', 'bold'), ]) self.ui.run_wrapper( self.run ) def run(self): size = self.ui.get_cols_rows() while True: self.draw_screen( size ) keys = self.ui.get_input() if "f8" in keys: break for k in keys: if k == "window resize": size = self.ui.get_cols_rows() continue self.keypress( size, k ) def keypress(self, size, k): if k == "enter": widget, pos = self.listbox.get_focus() if not hasattr(widget,'get_edit_text'): return text = widget.get_edit_text() answer = self.new_answer(text) if text.lower().startswith('yes'): self.suspend(True,answer) else: self.suspend(False,answer) else: self.top.keypress( size, k ) def suspend(self,suspend,answer): widget, pos = self.listbox.get_focus() if suspend is not False: self.ui.stop() fubar = subprocess.call("links www.google.de", shell=True) self.ui.start() if pos == len(self.items)-1: self.items.append( answer ) self.items.append( self.new_question() ) else: self.items[pos+1:pos+2] = [answer] self.listbox.set_focus( pos+2, coming_from='above' ) widget, pos = self.listbox.get_focus() widget.set_edit_pos(0) def draw_screen(self, size): canvas = self.top.render( size, focus=True ) self.ui.draw_screen( size, canvas ) def new_question(self): return urwid.Edit(('I say',"Suspend? Type 'yes' :)\n")) def new_answer(self, name): return urwid.Text(('I say',"kay.\n")) Conversation().main()