Не уверен, если это возможно, но я надеялся сделать что-то, где я могу напечатать дефис для ширины терминала на одной строке. Если ширина окна изменяется, количество отображаемых дефисов будет печататься соответствующим образом.
Как напечатать количество символов на основе ширины терминала, которая также изменяет размер?
Ответ 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)