Linux终端动态进度条实现指南

版权申诉
0 下载量 117 浏览量 更新于2024-11-13 收藏 7KB RAR 举报
资源摘要信息: Linux终端上打印进度条 Linux操作系统是全球范围内广泛使用的开源类Unix系统,拥有强大的命令行界面(CLI)交互能力。在Linux终端中,可以使用Shell脚本来实现各种自动化任务。本文档描述了如何在Linux终端上打印进度条,并提供了多种样式供用户选择。为了达到这一目的,通常会涉及到Shell脚本编程、文本处理工具以及终端控制技术的使用。 首先,我们来看如何通过Shell脚本在终端中实现简单的进度条。一个基本的进度条脚本会涉及到以下几个方面: 1. 进度条长度:通常是一个固定的字符长度,例如使用"#"字符来表示完成的部分,使用空格来表示未完成的部分。 2. 进度更新:脚本需要能够更新进度条,通常这通过循环来完成,并在每次循环中更新显示的进度条。 3. 进度表示:进度可以通过百分比或者完成的长度(比如多少个"#")来表示。 4. 动态效果:为了让进度条看起来更生动,可以在终端中使用一些转义序列来控制光标位置,实现进度条的动态显示。 5. 多样样式:不同的进度条样式可以有不同的视觉效果,例如直线式、环形式或者文本跟随式等。 下面是一个简单的bash脚本示例,用于在终端中打印直线式进度条: ```bash #!/bin/bash total=100 # 总的进度次数 for i in $(seq 1 $total); do echo -ne "Progress: $i / $total \r" sleep 0.1 # 模拟耗时操作 done echo -e "\nProgress completed." ``` 以上脚本中,使用了`\r`(回车符)来返回行首,`-ne`选项告诉`echo`命令不在输出后添加新行。每次循环,脚本会打印当前的进度,并在一行内更新。当进度完成时,显示一条消息并换行。 更高级的进度条脚本可能会包含以下功能: - 多线程进度跟踪,允许同时进行多个进度显示。 - 进度条颜色化,使用ANSI转义序列来改变进度条颜色。 - 用户交互,允许用户通过按键操作暂停或取消进度条。 - 错误处理,确保进度条在脚本执行过程中遇到错误时能正确显示状态。 为了实现更复杂的进度条,比如环形进度条,可能需要使用像`tput`这样的终端控制工具,或者更复杂的文本渲染库,例如ncurses,这可以让我们控制终端中每个字符的位置,从而创建各种图形效果。 在脚本编写完成后,可以通过在Linux终端中使用`bash`命令来执行脚本。例如: ```bash bash progress_bar.sh ``` 这里假设脚本文件名为`progress_bar.sh`。 文档中提到的“Linux终端上打印进度条.doc”说明有关进度条的信息可能被详细地记录在了一个Word文档中,便于用户阅读和参考。文档中可能还会涉及到具体脚本的编写方法、进度条样式的实现细节、以及针对不同场景下进度条的使用建议等。 总结来说,本文档提供了在Linux终端中实现和打印进度条的方法,涉及到了Shell脚本编写、终端控制和文本处理等多方面的知识。通过阅读和实践这些内容,用户可以更好地理解如何在Linux环境下通过脚本来增强程序的交互性和用户体验。

def download_file(url, path, filename): file_path = os.path.join(path, filename) try: response = requests.get(url, stream=True, headers={'Accept-Encoding': None}) total_size = int(response.headers.get('content-length', 0)) block_size = 1024*1024 progress = 0 progress_bar = [[sg.Text('正在更新:')], [sg.ProgressBar(total_size, orientation='h', size=(20, 20), key='progressbar')]] window = sg.Window('自动开票', progress_bar) with open(file_path, 'wb') as f: for data in response.iter_content(block_size): start_time = time.time() f.write(data) progress += len(data) print(progress) # 计算下载速度和调整块大小 duration = time.time()-start_time #print(duration) # 得到下载一个块的时间 if duration > 2 and progress > block_size: # 当下载时间大于2秒以及下载进度条足够 speed = block_size/duration # 计算下载平均速度 # 将下载速度赋值给block_size if block_size > int(speed): # 如果原始块的大小大于后面计算出来的块大小,则将原始块的大小改小,如果是小于还是原来的块大小 block_size = int(speed) start_time = time.time() elif duration < 1 and progress > block_size * 2: # 当下载时间小于1秒并且已经下载超过两个块的大小时,增加块大小 block_size *= 2 start_time = time.time() #print(block_size) # 判断取消事件 window.Read(timeout=0) if progress_bar: progress_bar = window['progressbar'] progress_bar.UpdateBar(progress) sg.Popup('更新完成') print(sg.Popup) window.close() except requests.exceptions.RequestException: sg.Popup('下载更新失败,请检查网络')将以上代码切换为ftp服务器下载文件,服务器地址wei81.68.182.121,用户名为cttest,密码为123

2023-06-06 上传
2023-05-24 上传

import re,tkinter,requests,threading,tqdm as tt root = tkinter.Tk() root.title('在线视频解析') root.geometry('500x590+550+350') headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/115.0'} ac = tkinter.Listbox(root, width=50, height=20, font=('黑体', 12)) ac.grid(row=2, columnspan=10, sticky="n" + "s" + "w" + "e") def sousuo(): i = b1.get() ac.delete(0, 'end') def extract_music_info(content): p = '|' content = re.sub(p, '', content, flags=re.S) pattern = re.compile('subject.*?href="(.*?)">(.*?)', flags=re.S) return pattern.findall(content) def search_music(): url = 'https://www.hifini.com/search-' + i + '-1.htm' response = requests.get(url=url, headers=headers) return response.text def update_listbox(music_list): for music in music_list: pppp = music[1] + ":" + music[0] ac.insert('end', pppp) content = search_music() music_list = extract_music_info(content) update_listbox(music_list) def xiazzi(): def download_music(): ppp = ac.get(ac.curselection()) pp = re.search('thread.*?htm', ppp) v = pp.group() url1 = 'https://www.hifini.com/' + v response = requests.get(url=url1, headers=headers) ppp = response.text l2 = re.search('<script>.*?title:..(.*?).,.*?author:.(.*?).,.*?url:..(.*?).,', ppp, flags=re.S) p = 'https://www.hifini.com/' + l2.group(3) response = requests.get(url=p, headers=headers, stream=True) # 设置 stream=True 以启用流式下载 total_size = int(response.headers.get('Content-Length')) music_name = '{}-{}.mp3'.format(l2.group(2), l2.group(1)) progress_bar = tt.tqdm(total=total_size, unit='B', unit_scale=True) # 创建进度条 with open(music_name, 'wb') as f: for data in response.iter_content(chunk_size=1024): progress_bar.update(len(data)) # 更新进度条 f.write(data) progress_bar.close() # 关闭进度条 print(music_name) threading.Thread(target=download_music).start() a1 = tkinter.Label(root, text='音乐下载器', anchor="center", font=('黑体', 24)) a1.grid(row=0, columnspan=10, sticky="n" + "s" + "w" + "e") b1 = tkinter.Entry(root, width=35, font=('黑体', 16), ) b1.grid(row=1, column=3, padx=15) search_button = tkinter.Button(root, text='搜索', command=sousuo) search_button.grid(row=1, column=4) download_button = tkinter.Button(root, text='下载', command=xiazzi) download_button.grid(row=3, column=4) root.mainloop() 将download_button带有下载行为的按钮添加进列表,

2023-07-17 上传

import io import re import tkinter import requests import threading import tqdm from pydub import AudioSegment root = tkinter.Tk() root.title('在线视频解析') root.geometry('500x590+550+350') headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/115.0'} ac = tkinter.Listbox(root, width=50, height=20, font=('黑体', 12)) ac.grid(row=2, columnspan=10, sticky="n" + "s" + "w" + "e") def sousuo(): i = b1.get() ac.delete(0, 'end') def extract_music_info(content): p = '|' content = re.sub(p, '', content, flags=re.S) pattern = re.compile('subject.*?href="(.*?)">(.*?)', flags=re.S) return pattern.findall(content) def search_music(): url = 'https://www.hifini.com/search-' + i + '-1.htm' response = requests.get(url=url, headers=headers) return response.text def update_listbox(music_list): for music in music_list: pppp = music[1] + ":" + music[0] ac.insert('end', pppp) content = search_music() music_list = extract_music_info(content) update_listbox(music_list) def xiazzi(): def download_music(): ppp = ac.get(ac.curselection()) pp = re.search('thread.*?htm', ppp) v = pp.group() url1 = 'https://www.hifini.com/' + v response = requests.get(url=url1, headers=headers) ppp = response.text l2 = re.search('<script>.*?title:..(.*?).,.*?author:.(.*?).,.*?url:..(.*?).,', ppp, flags=re.S) p = 'https://www.hifini.com/' + l2.group(3) response = requests.get(url=p, headers=headers, stream=True) # 设置 stream=True 以启用流式下载 total_size = int(response.headers.get('Content-Length')) music_name = '{}-{}.mp3'.format(l2.group(2), l2.group(1)) progress_bar = tqdm(total=total_size, unit='B', unit_scale=True) # 创建进度条 with open(music_name, 'wb') as f: for data in response.iter_content(chunk_size=1024): progress_bar.update(len(data)) # 更新进度条 f.write(data) progress_bar.close() # 关闭进度条 print(music_name) threading.Thread(target=download_music).start() a1 = tkinter.Label(root, text='音乐下载器', anchor="center", font=('黑体', 24)) a1.grid(row=0, columnspan=10, sticky="n" + "s" + "w" + "e") b1 = tkinter.Entry(root, width=35, font=('黑体', 16), ) b1.grid(row=1, column=3, padx=15) search_button = tkinter.Button(root, text='搜索', command=sousuo) search_button.grid(row=1, column=4) download_button = tkinter.Button(root, text='下载', command=xiazzi) download_button.grid(row=3, column=4) root.mainloop() 报错TypeError: 'module' object is not callable

2023-07-17 上传