我写了这个简单的python代码,因为我想为我创建一些进度条模块,并在buffor中'for'期间抓取打印数据,让我在循环期间打印值,即使我使用像tqdm()这样的栏 . 终端一切正常 .

import builtins
import sys
import os


def prgssb(container):
    # Defines length of the progress bar
    prgssb_len = 10

    class ContainerWithBar:
            def __init__(self, container_to_copy):
                self.container_len = len(container)
            self.index = 0
            self.copy_container_iter = iter(container_to_copy)
            self.print_buffor = []
            # Overrides the built-in 'print' function
            self.print_bar = builtins.print
            builtins.print = self.add_to_buffor

        def __iter__(self):
            return self

        def __next__(self):
            # Normalize the built-in 'print' function and prints content the buffor
            if self.index == self.container_len:
                builtins.print = self.print_bar
                print('\n*** Buffored data:')
                for arg_data in self.print_buffor:
                    print(arg_data[0], end='', file=arg_data[1], flush=arg_data[2])
                print('\n*** End of buffored data')
                raise StopIteration
            # Calculates properties of the progress bar
            self.index += 1
            iter_progress = round(self.index / self.container_len * prgssb_len)
            percentage = round(self.index / self.container_len * 100)
            element_progress_padding = 2 + len(str(self.container_len)) - len(str(self.index))
            bar_content = '[' + '▓' * iter_progress + '░' * (prgssb_len - iter_progress) + ']' + f'{percentage:4d}%' + \
                      ' ' * element_progress_padding + str(self.index) + '/' + str(self.container_len)
        # Adjusts properties if script is running in the terminal
        if os.isatty(0):
            bar_content = '\r' + bar_content
        # Prints the progress bar
        self.print_bar('\b' * len(bar_content) + bar_content, end='')
        return next(self.copy_container_iter)

        def add_to_buffor(self, *objects, sep=' ', end='\n', file=sys.stdout, flush=False):
            arg_str = ''
            arg_index = 0
            for arg in objects:
                if arg_index == len(objects) - 1:
                    separator = ''
                else:
                    separator = sep
                arg_str += str(arg)
                arg_str += separator
                arg_index += 1
            arg_str += end
            arg_data = (arg_str, file, flush)
            self.print_buffor.append(arg_data)

    return ContainerWithBar(container)

好吧,它在pycharm终端或解释器中的另一台PC上运行良好,但是当我现在运行它时,它会变得非常奇怪 . 它在解释器中打印出额外的行,而不是删除旧栏 . 是的,没有什么有趣的,不同的终端,控制台,等等 . 但是,关键是如果我在测试函数中使用它,'\ b'字符工作得很好:

from progress_bar import prgssb
from time import sleep

a = {}

for x in range(4):
    a[x] = x

for x in prgssb(a):
    sleep(1)
    print(x, '\b' * 2, end='')

我在这段代码中覆盖'print'函数,让它成为我想要的方式,如果有人在循环中使用它 . 如果还不够,解释器也会输出'\ b',即使我在同一个测试文件中使用我创建的方法也是如此:

from progress_bar import prgssb
from time import sleep

a = {}

for x in range(4):
    a[x] = x

b = prgssb(a)

for x in b:
    sleep(1)
    b.print_bar(x, '\b' * 2, end='')

现在真的看起来这就是self.print_bar方法在类中 . 我不确定它是否应该像那样工作 . 我真的很喜欢通过正确显示顺利显示btw的好进度条,我不知道它是否可能,但我非常感谢这方面的任何帮助,因为我在这一点上陷入了一段时间 .

另外现在我看到这个脚本没有在pycharm python解释器中正确打印,但在cmd终端仍然没问题 . 那么使用python解释器有什么不对,为什么它在不同的PC上有这么不同的行为?