Spis treści

Kurs języka Python - Lista 6.

Zadanie 1.

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

Zadanie 2.

Zadanie 3.