Ich habe mal wieder ein Problem bei einem Projekt.
Ich brauche ein Curses-Interface, und habe mir folgendes gebastelt:
Das ist meine Klasse fuer die Verwaltung des In- und Outputs, momentan erstmal der Output:
Code: Alles auswählen
import curses
class Screen(object):
curses.setupterm()
TERM_COLS = curses.tigetnum("cols")
TERM_LINES = curses.tigetnum("lines")
OUTWIN_COLS = TERM_COLS
OUTWIN_LINES = TERM_LINES - 5
OUTWIN_COLS_MAX = OUTWIN_COLS - 2
OUTWIN_LINES_MAX = OUTWIN_LINES - 2
OUTWIN_START_POS = [1, 2]
INWIN_COLS = TERM_COLS
INWIN_LINES = 5
INWIN_COLS_MAX = TERM_COLS - 2
INWIN_LINES_MAX = INWIN_LINES - 2
def __init__(self):
self.stdscr = curses.initscr()
self.outwin = self.stdscr.subwin(self.OUTWIN_LINES,
self.OUTWIN_COLS, 0, 0)
self.outwin.box()
self.outwin.refresh()
self.inwin = self.stdscr.subwin(self.INWIN_LINES,
self.INWIN_COLS,
self.OUTWIN_LINES, 0)
self.inwin.box()
self.inwin.refresh()
self._outwin_pos = self.OUTWIN_START_POS[:]
self._outwin_scroll = 0
self._outwin_content = ""
def __del__(self):
curses.endwin()
def write_output(self, data, attr=0):
data = data.replace("\r", "")
for char in data:
if char == "\n" or self._outwin_pos[1] == self.OUTWIN_COLS_MAX:
if self._outwin_pos[0] == self.OUTWIN_LINES_MAX:
self.scroll_outwin(1)
self._outwin_pos[0] += 1
self._outwin_content += "\n"
self._outwin_pos[1] = self.OUTWIN_START_POS[1]
if char == "\n":
continue
self.outwin.addstr(self._outwin_pos[0],
self._outwin_pos[1],
char, attr)
self._outwin_content += char
self._outwin_pos[1] += 1
self.outwin.refresh()
return True
def scroll_outwin(self, lines):
if lines != 0:
data = self._outwin_content.split("\n")
from_line = self._outwin_scroll + lines
till_line = self._outwin_scroll + lines + self.OUTWIN_LINES_MAX
data = data[from_line:till_line]
# data += ["" for dummy in xrange(self.OUTWIN_LINES_MAX - len(data))]
data = "\n".join(data)
print "\a"
self._outwin_pos[0] = self.OUTWIN_START_POS[0]
self._outwin_pos[1] = self.OUTWIN_START_POS[1]
self.outwin.clear()
self.outwin.box()
self.write_output(data)
self._outwin_scroll = from_line
self._outwin_pos[0] -= 1
print >>file("data", "w"), from_line, till_line, self._outwin_pos[0], data
return True
else:
return True
Code: Alles auswählen
#!/usr/bin/env python
import random, sys, time
def main():
scr = Screen()
while True:
scr.write_output(random.choice(["x\n", "xx\n", "xxx\n"]))
time.sleep(0.5)
if __name__ == "__main__":
try:
main()
except KeyboardInterrupt:
sys.exit(1)
Ich waere euch sehr dankbar fuer Hilfe!
Liebe Grueße,
roschi