如何同时运行两个Python函数,实现文字打印时显示加载动画的效果
逐字打印文本同步显示加载动画的实现方案
原代码存在三个核心问题:
- 函数名引用错误:定义的加载动画函数是
animated_loading,线程绑定的目标函数写为了不存在的animation - 加载动画仅循环一次就停止,无法适配不同长度的文本打印时长
- 没有设置停止信号,无法在文本打印完成后自动终止动画
可直接运行的修复代码
import sys import time from threading import Thread # 加载动画停止标志位,也可以用threading.Event实现更规范的线程通信 loading_stop = False # 逐字打印函数 def delay_print(string): for i in string: sys.stdout.write(i) sys.stdout.flush() time.sleep(0.04) # 加载动画函数 def animated_loading(): chars = "/—\\|" while not loading_stop: for char in chars: # 收到停止信号立刻退出,不完成本轮循环 if loading_stop: break sys.stdout.write('\r' + '加载中 ' + char) time.sleep(.1) sys.stdout.flush() # 动画停止后清空当前行的加载提示 sys.stdout.write('\r' + ' ' * 10 + '\r') sys.stdout.flush() # 文本打印任务 def text_task(): global loading_stop delay_print("\n\nText:\n" + "Hi there,\n\n" "XX航空为所有乘客提供丰富服务\n" "目前我们所有飞往三亚的航线正推出20%折扣优惠\n" "座位有限,立即预订!\n\n") # 文本打印完成,修改停止标志 loading_stop = True if __name__ == "__main__": t_loading = Thread(target=animated_loading) t_text = Thread(target=text_task) t_loading.start() t_text.start() # 等待两个线程执行完成 t_text.join() t_loading.join()
核心实现逻辑说明
- 使用标志位同步两个线程的状态:文本打印线程执行结束后修改标志位,加载动画线程每次循环都会检查标志位,收到停止信号立刻退出
- 加载动画用
\r回车符回到当前行首,实现同一位置的动画刷新,不会和上方的逐字打印内容冲突 - 动画停止后主动清空当前行的加载提示,不会残留多余字符
- 用
if __name__ == "__main__"包裹线程启动逻辑,避免Windows平台多线程运行时报错
内容的提问来源于stack exchange,提问作者Kuuda
相关产品推荐
相关产品推荐

