如何根据也调整大小的终端宽度打印字符数?

Posted

技术标签:

【中文标题】如何根据也调整大小的终端宽度打印字符数?【英文标题】:How to print number of characters based on terminal width that also resize? 【发布时间】:2017-10-23 02:23:54 【问题描述】:

不确定是否可行,但我希望做一些事情,我可以在一行上打印一个连字符来表示终端的宽度。如果窗口的宽度被调整大小,显示的连字符的数量会相应地打印出来。

【问题讨论】:

How to get Linux console window width in Python的可能重复 @khelwood 这不是重复的:这里用户还询问是否可以调整已经写好的文本的大小。 如果问题已经解决,您能否告诉使用...您选择的解决方案是什么? 【参考方案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 != '!@#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】:

这正是你所要求的......有一个非常小的问题:当你缩小外壳时,光标会下降一行,上面的东西会留在那里......我可以尝试解决这个问题……但结果会更复杂。

我假设你使用的是 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)

【讨论】:

【参考方案3】:

检查一下:(它适用于 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...")

【讨论】:

以这种方式运行mode 命令只会在屏幕上显示信息,但不会捕获它。只有当它存在于当前系统上时,这种运行命令行实用程序的技术才有效。最好使用设计用于在所有/多种情况下工作的 Python 函数,而不是尝试调用特定于 Windows(或特定于 Unix)的实用程序。

以上是关于如何根据也调整大小的终端宽度打印字符数?的主要内容,如果未能解决你的问题,请参考以下文章

java中如何根据字符串长度来调整文本框大小

vim打开时窗口大小怎么调整,在_vimrc中怎么设置?

如何根据内容调整 UITextView 的大小,宽度固定

如何根据文本宽度动态调整 SVG 矩形的大小?

如何根据 div 宽度调整图像大小? [复制]

关于如何利用CSS自动调整图片的大小