Как напечатать количество символов на основе ширины терминала, которая также изменяет размер?

Не уверен, если это возможно, но я надеялся сделать что-то, где я могу напечатать дефис для ширины терминала на одной строке. Если ширина окна изменяется, количество отображаемых дефисов будет печататься соответствующим образом.

Ответ 1

Это более продуманная версия, которая позволяет печатать все, что вы хотите, всегда в соответствии с размером терминала. Вы также можете изменить размер терминала, пока ничего не печатается, и содержимое будет соответствующим образом изменено.

Я немного прокомментировал код... но если вам нужно, я могу быть более явным.

#!/usr/bin/env python2

import threading
import Queue
import time
import sys
import subprocess
from backports.shutil_get_terminal_size import get_terminal_size

printq = Queue.Queue()
interrupt = False
lines = []

def main():

    ptt = threading.Thread(target=printer) # Turn the printer on
    ptt.daemon = True
    ptt.start()

    # Stupid example of stuff to print
    for i in xrange(1,100):
        printq.put(' '.join([str(x) for x in range(1,i)]))           # The actual way to send stuff to the printer
        time.sleep(.5)

def split_line(line, cols):
    if len(line) > cols:
        new_line = ''
        ww = line.split()
        i = 0
        while len(new_line) <= (cols - len(ww[i]) - 1):
            new_line += ww[i] + ' '
            i += 1
            print len(new_line)
        if new_line == '':
            return (line, '')

        return (new_line, ' '.join(ww[i:]))
    else:
        return (line, '')


def printer():

    while True:
        cols, rows = get_terminal_size() # Get the terminal dimensions
        msg = '#' + '-' * (cols - 2) + '#\n' # Create the
        try:
            new_line = str(printq.get_nowait())
            if new_line != '[email protected]#EXIT#@!': # A nice way to turn the printer
                                         # thread out gracefully
                lines.append(new_line)
                printq.task_done()
            else:
                printq.task_done()
                sys.exit()
        except Queue.Empty:
            pass

        # Build the new message to show and split too long lines
        for line in lines:
            res = line          # The following is to split lines which are
                                # longer than cols.
            while len(res) !=0:
                toprint, res = split_line(res, cols)
                msg += '\n' + toprint

        # Clear the shell and print the new output
        subprocess.check_call('clear') # Keep the shell clean
        sys.stdout.write(msg)
        sys.stdout.flush()
        time.sleep(.5)


if __name__ == '__main__':
    main()

Ответ 2

Проверьте это: (он работал на windows и python3)

import os

os.system('mode con: cols=100 lines=40')
input("Press any key to continue...")
os.system('mode con: cols=1000 lines=400')
input("Press any key to continue...")

Ответ 3

Это делает именно то, что вы просили... с очень маленькой проблемой: когда вы уменьшаете оболочку, курсор идет по одной строке, а материал, который выше, останется там... Я могу попытаться решить эту проблему... но результат будет более сложным.

Я предположил, что вы используете систему unix.

В коде используются потоки, чтобы поддерживать линию на экране при выполнении других действий. В этом случае просто спать... Кроме того, только использование потока действительно возможно иметь "быстрый" ответ на изменение размера терминала.

#!/usr/bin/env python2

import threading
import time
import sys
from backports.shutil_get_terminal_size import get_terminal_size

def main1():

    ptt = threading.Thread(target=printer2)
    ptt.daemon = True
    ptt.start()

    time.sleep(10)

def printer2():

    while True:
        cols, rows = get_terminal_size()
        line = '-' * (cols - 2)
        sys.stdout.write("\r" + '#' +  line + '#')
        sys.stdout.flush()
        time.sleep(.5)