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()