Rozwiazanie w bibliotece urwid 0.9.8 (ncurses).
import sys import urwid.curses_display import urwid from math import * yscale = 0.1 xscale = 0.1 def ble(str, x, c = "*"): n = "" for i in range(len(str)): if i == x: n += c else: n += str[i] return n def gencol(cols, row): n = "" for i in range(cols): if i == cols/2: if row % 5 == 0: k = "%+.2f" % (row * yscale) n += k i += len(k)-1 else: n += "|" else: n += " " return n[0:cols] class Conversation(object): def __init__(self): self.ui = urwid.curses_display.Screen() self.args = [self.new_question(), urwid.Divider('-')] self.items = urwid.SimpleListWalker(self.args) self.listbox = urwid.ListBox(self.items) self.header = urwid.AttrWrap(urwid.Text("Press ESC to exit."), 'header') self.top = urwid.Frame(self.listbox, self.header) def main(self): self.ui.register_palette([ ('header', 'white', 'dark blue', 'standout'), ('graph', 'light green', 'black', 'standout'), ('func', 'default', 'default', 'bold'), ]) self.ui.run_wrapper(self.run) def run(self): cols, rows = dim = self.ui.get_cols_rows() self.draw_screen(dim) while True: self.draw_screen(dim) keys = self.ui.get_input() if "esc" in keys: break for k in keys: if k == "window resize": dim = self.ui.get_cols_rows() continue else: self.top.keypress(dim, k) if keys: try: r = rows-3 input = self.items[0].edit_text graph = [gencol(cols, (r/2)-i+1) for i in range(r)] self.args = self.args[0:2] graph[r/2+1] = "" i = 0 while i < cols: if i % 8 == 0: k = "%+.2f" % ((i-cols/2) * xscale) i += len(k) else: k = "-" i += 1 graph[r/2+1] += k for i in range(-cols/2, cols/2): x = i * xscale f = int(eval(input)/yscale + r/2) if 0 < f <= r: graph[r-f] = ble(graph[r-f], (i+cols/2)) for i in range(r): self.args.append(urwid.AttrWrap(urwid.Text(graph[i]), 'graph')) self.items = urwid.SimpleListWalker(self.args) self.listbox = urwid.ListBox(self.items) self.top = urwid.Frame(self.listbox, self.header) self.draw_screen(dim) except: pass def draw_screen(self, dim): self.ui.draw_screen(dim, self.top.render(dim, focus=True)) def new_question(self): return urwid.Edit(caption=("func", "f(x) = "), edit_text="sin(x)") if __name__ == "__main__": Conversation().main()