鱼C论坛

 找回密码
 立即注册
查看: 669|回复: 8

[已解决]加载进度哪里的问题导致重复刷新出来

[复制链接]
发表于 2024-2-21 20:05:31 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 lc88824 于 2024-2-21 22:12 编辑

加载进度哪里的问题导致打印出那么多来,只要求固定刷新
最佳答案
2024-2-21 22:48:19
lc88824 发表于 2024-02-21 22:47
尝试在pycharm中可以实现,但是在idle自带环境不行, ...


在有些终端环境中,`\r`并不能实现回车到行首的效果,这可能是由于不同终端程序的特性导致的。幸运的是,我们可以使用其他方法来实现类似的效果。

您可以尝试使用ANSI转义序列来实现回车到行首的效果。下面是一个示例代码:
import time

def show_loading_bar(progress):
    bar_length = 20
    filled_length = int(progress * bar_length)
    bar = '#' * filled_length + '-' * (bar_length - filled_length)
    percent = int(progress * 100)
    print(f'\033[F {percent}%  {bar}')

def load_data():
    total = 100
    for i in range(1, total+1):
        # 模拟加载数据的操作
        time.sleep(0.1)
        progress = i / total
        show_loading_bar(progress)

load_data()
print('\n加载完成!')

在这个示例代码中,我们使用了ANSI转义序列 `\033[F` 来实现光标返回到上一行的起始位置。这样,在每次更新加载进度时,会先将光标移动到上一行的起始位置,然后重新打印加载进度条,并且不换行。这样就可以实现类似 `\r` 的效果了。

请注意,ANSI转义序列在不同的终端中可能会有不同的表现,因此在某些终端环境中可能无法正常工作。如果以上方法在您的终端环境中仍然无法实现预期的效果,您可能需要考虑其他替代方案,比如使用第三方库来创建加载进度条。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
屏幕截图 2024-02-21 221122.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-2-21 20:05:45 | 显示全部楼层
加载进度重复刷新的问题,通常是由于重复调用了打印加载进度的代码导致的。为了固定刷新加载进度,可以使用进度条代替重复打印。

下面是一个使用进度条展示加载进度的示例代码:
import time

def show_loading_bar(progress):
    bar_length = 20
    filled_length = int(progress * bar_length)
    bar = '#' * filled_length + '-' * (bar_length - filled_length)
    percent = int(progress * 100)
    print(f'\r[{bar}] {percent}%  ', end='', flush=True)

def load_data():
    total = 100
    for i in range(1, total+1):
        # 模拟加载数据的操作
        time.sleep(0.1)
        progress = i / total
        show_loading_bar(progress)

load_data()
print('\n加载完成!')

在这个示例代码中,`show_loading_bar()`函数用于展示加载进度条。在每次加载数据之后,调用`show_loading_bar()`函数显示加载进度。通过不断更新进度条的长度和百分比,达到固定刷新的效果。

提示:使用`\r`实现回车到行首的效果,`end=''`使print语句结束时不换行,并使用`flush=True`强制刷新输出。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-2-21 20:19:57 | 显示全部楼层
用终端运行并且在 for 循环里加上
import os
os.system('cls')
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-2-21 22:06:31 | 显示全部楼层
使用"\r"操作符
也就是在"正在加载"前加个\r
这是目前我知道的最优方法
有用就给个最佳吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-2-21 22:20:27 | 显示全部楼层
FishC 发表于 2024-2-21 20:05
加载进度重复刷新的问题,通常是由于重复调用了打印加载进度的代码导致的。为了固定刷新加载进度,可以使用 ...

为什么我使用`\r`实现不了回车到行首的效果,打印出了一堆
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-2-21 22:21:16 | 显示全部楼层
lc88824 发表于 2024-02-21 22:20
为什么我使用`\r`实现不了回车到行首的效果,打印出了 ...


抱歉,我之前给出的代码可能存在问题。在某些情况下,`\r`在终端中可能无法正常实现回车到行首的效果。这可能是由于不同操作系统或终端程序对于特殊字符的处理方式不同导致的。

如果您想要在终端中展示一个固定刷新的加载进度条,您可以考虑使用第三方库,如`tqdm`。`tqdm`是一个用于创建进度条的Python库,具有功能强大且易于使用的特点。您可以通过以下步骤安装`tqdm`库:
pip install tqdm

下面是使用`tqdm`库创建并展示加载进度条的示例代码:
import time
from tqdm import tqdm

def load_data():
    total = 100
    for i in tqdm(range(total)):
        # 模拟加载数据的操作
        time.sleep(0.1)

load_data()
print('加载完成!')

在这个示例代码中,我们使用`tqdm(range(total))`来创建一个加载进度条,然后在每次加载数据之后不需要手动刷新进度条,`tqdm`会自动更新并显示加载进度。您只需要调用`tqdm(range(total))`即可。

希望这次能解决您的问题。如还有疑问,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-2-21 22:47:50 | 显示全部楼层
FishC 发表于 2024-2-21 22:21
抱歉,我之前给出的代码可能存在问题。在某些情况下,`\r`在终端中可能无法正常实现回车到行首的效果。 ...

尝试在pycharm中可以实现,但是在idle自带环境不行,有什么办法可以实现\r效果吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-2-21 22:48:19 | 显示全部楼层    本楼为最佳答案   
lc88824 发表于 2024-02-21 22:47
尝试在pycharm中可以实现,但是在idle自带环境不行, ...


在有些终端环境中,`\r`并不能实现回车到行首的效果,这可能是由于不同终端程序的特性导致的。幸运的是,我们可以使用其他方法来实现类似的效果。

您可以尝试使用ANSI转义序列来实现回车到行首的效果。下面是一个示例代码:
import time

def show_loading_bar(progress):
    bar_length = 20
    filled_length = int(progress * bar_length)
    bar = '#' * filled_length + '-' * (bar_length - filled_length)
    percent = int(progress * 100)
    print(f'\033[F {percent}%  {bar}')

def load_data():
    total = 100
    for i in range(1, total+1):
        # 模拟加载数据的操作
        time.sleep(0.1)
        progress = i / total
        show_loading_bar(progress)

load_data()
print('\n加载完成!')

在这个示例代码中,我们使用了ANSI转义序列 `\033[F` 来实现光标返回到上一行的起始位置。这样,在每次更新加载进度时,会先将光标移动到上一行的起始位置,然后重新打印加载进度条,并且不换行。这样就可以实现类似 `\r` 的效果了。

请注意,ANSI转义序列在不同的终端中可能会有不同的表现,因此在某些终端环境中可能无法正常工作。如果以上方法在您的终端环境中仍然无法实现预期的效果,您可能需要考虑其他替代方案,比如使用第三方库来创建加载进度条。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-2-22 20:33:32 From FishC Mobile | 显示全部楼层
\r效果一般可以在控制台/cmd 中实现
但是 idle 中不能实现
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-6-29 09:17

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表