2015-12-20 2 views
0

Я хотел бы иметь оба:терминала с каждой линией после другого + некоторых фиксированного текста, а

  • линия отображается каждый один за другим (Ло 12, Ло 13, Ли 14 и т.д.), как в обычном терминале

  • фиксированная позиция информация (справа): Дата + фиксированный текст "Bonjour"

Это почти работ, до ~ 250 Мля, ​​белый ru Взгляд разрушен! Зачем?

http://gget.it/kcir9kmg/asds.gif

from sys import stdout 
import time 

ESC = "\x1b" 
CSI = ESC+"[" 

def movePos(row, col): 
    stdout.write("%s%d;%dH" % (CSI, row, col)) 

stdout.write("%s2J" % CSI)  # CLEAR SCREEN 

for i in range(1,1000): 
    movePos(i+1,60) 
    print time.strftime('%H:%M:%S', time.gmtime()) 
    movePos(i+5,60) 
    print 'Bonjour' 

    movePos(24+i,0) 
    print "Blah %i" % i 
    time.sleep(0.01) 

С терминала ANSI, как иметь как нормальное поведение терминала (одну новую строку для каждого print) + фиксированное положение дисплея?

Примечание: В Windows я использую ansicon.exe для поддержки ANSI в Windows cmd.exe.

+0

Я думаю, что ругательства является рекомендуемым способом сделать это (не то, что ответы ваш конкретный вопрос) –

+0

Я не могу заставить 'curses' работать в Windows. Я пробовал много примеров, найденных здесь и там, но ни один из них не работал на Win7. Если у вас есть работаемый пример, мне интересно! – Basj

+0

Вы видели [подсказку в документах] (https://docs.python.org/3/howto/curses.html#what-is-curses): 'Версия Python для Windows не включает модуль curses , Доступна портированная версия под названием UniCurses. Вы также можете попробовать консольный модуль, написанный Fredrik Lundh, который не использует тот же API, что и проклятия, но предоставляет текстовый вывод с курсором и полную поддержку ввода мыши и клавиатуры.' – albert

ответ

0

От данного изображения: ansicon, по-видимому, выделяет буфер консоли для выполнения своей работы; который имеет ограниченный размер (из-за консоли Windows, которая ограничивает размер буфера до 64 килобайт). Когда ваш скрипт достигнет конца буфера и попытается переместить курсор за конец, ansicon заставляет весь буфер прокручиваться вверх. Это изменяет стиль обновления.

Если ваши звонки в movePos были ограничены в рабочем пространстве ansicon, вы получите более последовательные результаты.

Что касается «множественных линий» для «Bonjour», этот кусок

movePos(i+1,60) 
print time.strftime('%H:%M:%S', time.gmtime()) 
movePos(i+5,60) 
print 'Bonjour' 

печатает дату на одной линии, а затем движется вперед 4 линии, печать «Bonjour» на той же самой колонке. Кажется, что там достаточно места (10 колонок) на той же строке, чтобы сделать это:

movePos(i+1,60) 
print time.strftime('%H:%M:%S', time.gmtime()) 
movePos(i+1,70) 
print 'Bonjour' 

, который, по крайней мере, сделать текст на право выглядеть последовательным. Однако прокрутка от movePos приведет к некоторому удвоенному интервалу.

+0

Благодарю. В более общем плане, есть ли у вас идея написать строки (Blah 11, Blah 12 и т. Д.), Как обычный текст 'print' + fixed position в некоторых местах? – Basj

0

Вот решение:

http://gget.it/a8p0ye00/term.gif

Код (проверка here для последней версии):

""" 
zeroterm is a light weight terminal allowing both: 
* lines written one after another (normal terminal/console behaviour) 
* fixed position text 

Note: Requires an ANSI terminal. For Windows 7, please download https://github.com/downloads/adoxa/ansicon/ansi160.zip and run ansicon.exe -i to install it. 
""" 

from sys import stdout 
import time 

class zeroterm: 
    def __init__(self, nrow=24, ncol=50):  # nrow, ncol determines the size of the scrolling (=normal terminal behaviour) part of the screen 
     stdout.write("\x1b[2J")    # clear screen 
     self.nrow = nrow 
     self.ncol = ncol 
     self.buf = [] 

    def write(self, s, x=None, y=None):  # if no x,y specified, normal console behaviour 
     if x is not None and y is not None: # if x,y specified, fixed text position 
      self.movepos(x,y) 
      print s 
     else: 
      if len(self.buf) < self.nrow: 
       self.buf.append(s) 
      else: 
       self.buf[:-1] = self.buf[1:] 
       self.buf[-1] = s 

      for i, r in enumerate(self.buf): 
       self.movepos(i+1,0) 
       print r[:self.ncol].ljust(self.ncol) 

    def movepos(self, row, col): 
     stdout.write("\x1b[%d;%dH" % (row, col)) 


if __name__ == '__main__': 
    # An exemple 
    t = zeroterm() 
    t.write('zeroterm', 1, 60) 

    for i in range(1000): 
     t.write(time.strftime("%H:%M:%S"), 3, 60) 
     t.write("Hello %i" % i) 
     time.sleep(0.1) 
Смежные вопросы