Держите линию stdin вверху или внизу экрана терминала
поэтому я пишу проект, где я запускаю программу, которая постоянно получает / отправляет сообщения на другие компьютеры, работающие с той же программой.
приемник / отправитель данных работает в потоке и печатает в stdout. Я получаю такие вещи:
[INFO] User 'blah' wants to send message to you.
[INFO] some other info
[MSG REC] Message 'hello' received from blah.
теперь проблема в том, что иногда я хочу вводить команды в терминал, проблема в том, когда я пытаюсь ввести команду и новое информационное сообщение или MSG REC
печатается в stdout. У меня есть такие команды, как quit
и status
etc.
> > указывает строку ввода.
что-то вроде этого может случиться так:
[INFO] User 'blah' wants to send message to you.
[INFO] some other info
[MSG REC] Message 'hello' received from blah.
>> stat[MSG REC] Message 'sup' received from Bob.
us
затем я нажму enter и команду status
выполняется, но выглядит так плохо в терминале. Сообщение появляется каждые 2-4 секунды, поэтому это проблема. Есть хороший способ решить эту проблему? Я попытался использовать команды курсора ANSI, чтобы попытаться вставить новую строку перед последней строкой, чтобы последняя строка всегда оставалась в качестве входной строки, и я мог ввести "stat", подождите некоторое время и закончите его с "нами" без каких-либо проблем.
Я также видел, что люди рекомендуют curses
но попытка интегрировать это с моей программой полностью испортила форматирование моего вывода среди прочего (и я думаю, что это, возможно, излишне).
Итак, есть простой способ сделать вставку резьбы новой MSG REC
строки 1 строка над последней строкой, чтобы последняя строка всегда оставалась как строка ввода С >> и все остальное, что я набрал в.
Использование Python2.7 в Linux.
EDIT: изменение, которое заставило Джеймса Миллса ответить на работу: Я должен был использовать это, когда моя нить печатала новую строку.
myY, myX = stdscr.getyx();
str = "blah blah"; #my message I want to print
stdscr.addstr(len(lines), 0, str)
lines.append(str)
stdscr.move(myY, myX) #move cursor back to proper position
1 ответов
здесь простой пример:
код:
#!/usr/bin/env python
from string import printable
from curses import erasechar, wrapper
PRINTABLE = map(ord, printable)
def input(stdscr):
ERASE = input.ERASE = getattr(input, "ERASE", ord(erasechar()))
Y, X = stdscr.getyx()
s = []
while True:
c = stdscr.getch()
if c in (13, 10):
break
elif c == ERASE:
y, x = stdscr.getyx()
if x > X:
del s[-1]
stdscr.move(y, (x - 1))
stdscr.clrtoeol()
stdscr.refresh()
elif c in PRINTABLE:
s.append(chr(c))
stdscr.addch(c)
return "".join(s)
def prompt(stdscr, y, x, prompt=">>> "):
stdscr.move(y, x)
stdscr.clrtoeol()
stdscr.addstr(y, x, prompt)
return input(stdscr)
def main(stdscr):
Y, X = stdscr.getmaxyx()
lines = []
max_lines = (Y - 3)
stdscr.clear()
while True:
s = prompt(stdscr, (Y - 1), 0) # noqa
if s == ":q":
break
# scroll
if len(lines) > max_lines:
lines = lines[1:]
stdscr.clear()
for i, line in enumerate(lines):
stdscr.addstr(i, 0, line)
stdscr.addstr(len(lines), 0, s)
lines.append(s)
stdscr.refresh()
wrapper(main)
это в основном устанавливает демо проклятия приложение, которое запрашивает пользователя для ввода и отображает приглашение на (24, 0)
. Демонстрация завершается при вводе пользователем :q
. Для любого другого входа он добавляет вход в верхнюю часть экрана. Наслаждайтесь! (<BACKSAPCE>
работает!):)
посмотреть: проклятие; все API, которые я использовал в этом примере, прямо из это стандартная библиотека. В то время как использование проклятий может быть или не быть "излишним" IHMO, я бы рекомендовал использовать urwid особенно, если сложность вашего приложения начинает перерастать простые проклятия.