制作工具下载器 by tkinter

DIY一个简易的(免驱)DAP下载器 阅读详情

前言

这是一次想 实现进度条功能 而引发的小程序开发,越做发现涉及的东西越多,本文只做简单成效实现过程的描述,优化项目以后再做补充。

目录


概述

  • 先上效果图
    开始任务
    完成
    目录文件

  • 功能介绍
    该下载器只能下载已知工具包(即将例如 QQ、python、nginx 等包文件的链接复制粘贴到那个链接 Entry 里),通过点按打开按钮,选择要存放的目录。
    视频质量下拉菜单和暂停下载功能暂未实现,有待后期补充,如有大神,请指点一二。

源代码

本程序基于 Python 3.6.6 编写,如用 3.x 版本编辑,问题应该不大,请自行解决。
后期生成 exe 程序,需要用到 PyInstaller,我用的版本是 3.3.1。

实现下载器功能

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2018/8/27 15:40
# @Author  : Nimo
# @File    : study.py
# @Software: PyCharm

import os
import urllib
import time
import requests
from tkinter import *
from tkinter.scrolledtext import ScrolledText
from PIL import Image, ImageTk
import threading
from tkinter.filedialog import askdirectory
# 这里引入的两个包是为了后期生成exe程序用,源程序测试时请注释掉这两行以及后面的相关行
import base64
from picture.bak import img as logo

class GetFile():  #下载文件
    def __init__(self, url, dir_path):
        self.url = url
        self.dir_path = dir_path
        self.filename = ""
        self.re = requests.head(self.url, allow_redirects=True)  # 运行head方法时重定向
    # url and path 有效性检查
    def _is_valid(self):
        if self.url is '':
            scrolled_text.insert(INSERT, '请输入包件链接...\n')
            scrolled_text.see(END)
            return None
        else:
            pattern = '^(https|http|ftp)://.+$'
            # pattern = '^(https|http:)//([0-9a-zA-Z]*\.[0-9a-zA-Z]*\.(com|org)/).+$'
            url_pattern = re.compile(pattern, re.S)
            result = re.search(url_pattern, self.url)
            if result is None:
                scrolled_text.insert(INSERT, '错误的链接,请重新输入...\n')
                scrolled_text.see(END)
                return None
            else:
                if self.dir_path is '':
                    scrolled_text.insert(INSERT, '请输入包件保存路径...\n')
                    scrolled_text.see(END)
                    return None
                else:
                    path_pattern = re.compile('(^[A-Z]:/[0-9a-zA-Z_]+(/[0-9a-zA-Z_]+)*$)|(^[A-K]:/[0-9a-zA-Z_]*$)',
                                              re.S)
                    result = re.search(path_pattern, self.dir_path)
                    if result is None:
                        scrolled_text.insert(INSERT, '错误的文件路径,请重新输入...\n')
                        scrolled_text.see(END)
                        return None
                    else:
                        return True

    # 下载文件主要方法
    def getsize(self):
        try:
            self.file_total = int(self.re.headers['Content-Length']) # 获取下载文件大小
            return self.file_total
        except:
            scrolled_text.insert(INSERT, '无法获取文件大小,请检查url\n')
            scrolled_text.see(END)
            return None
    def getfilename(self):  # 获取默认下载文件名
        if 'Content-Disposition' in self.re.headers:
            n = self.re.headers.get('Content-Disposition').split('name=')[1]
            self.filename = urllib.parse.unquote(n, encoding='utf8')
        elif os.path.splitext(self.re.url)[1] != '':
            self.filename = os.path.basename(self.re.url)
        return self.filename

    def down_file(self):  #下载文件
        self.r = requests.get(self.url,stream=True)
        with open(self.filename, "wb") as code:
            for chunk in self.r.iter_content(chunk_size=1024): #边下载边存硬盘
                if chunk:
                    code.write(chunk)
        time.sleep(1)
        text = os.getcwd()
        scrolled_text.insert(INSERT,str(self.filename) + ' 存放在' + text + ' 目录下' + '\n')
        scrolled_text.insert(INSERT, '下载完成!\n')
        scrolled_text.see(END)

    # 进度条实现方法
    def change_schedule(self):
        now_size = 0
        total_size = self.getsize()
        while now_size < total_size:
            time.sleep(1)
            if os.path.exists(self.filename):
                try:
                    down_rate = (os.path.getsize(self.filename) - now_size)/1024/1024 + 0.001
                    down_time = (total_size - now_size)/1024/1024/down_rate
                    now_size = os.path.getsize(self.filename)
                    # 文件大小进度
                    canvas.delete("t1")
                    size_text = '%.2f' % (now_size / 1024 / 1024) + '/' + '%.2f' % (total_size / 1024 / 1024) + 'MB'
                    canvas.create_text(90, 10, text=size_text, tags="t1")
                    # 下载速度
                    speed_text = str('%.2f' % down_rate + "MB/s")
                    speed.set(speed_text)
                    # 将下载秒数改为时间格式显示
                    m, s = divmod(down_time, 60)
                    h, m = divmod(m, 60)
                    time_text = "%02d:%02d:%02d" % (h, m, s)
                    remain_time.set(time_text)
                    # 进度条更新
                    canvas.coords(fill_rec, (0, 0, 5 + (now_size / total_size) * 180, 25))
                    top.update()

                    if round(now_size / total_size * 100, 2) == 100.00:
                        time_text = "%02d:%02d:%02d" % (0,0,0)
                        remain_time.set(time_text)
                        speed.set("完成")
                        button_start['text'] = "开始"

                except ZeroDivisionError as z:
                    scrolled_text.insert(INSERT, '出错啦:' + str(z) + '\n')
                    button_start['text'] = "重新开始"

    def run_up(self):
        if self._is_valid():  # 判断url的有效性
            print("url 和 dir 检查通过")
            scrolled_text.insert(INSERT, 'url 和 dir 检查通过\n')
            # 改变输入框文本颜色
            entry_url['fg'] = 'black'
            entry_path['fg'] = 'black'
            self.getfilename()
            print("开始下载...")
            scrolled_text.insert(INSERT, '开始下载...\n')

            th1 = threading.Thread(target=self.change_schedule, args=())
            th2 = threading.Thread(target=self.down_file, args=())
            th = [th1, th2]
            for t in th:
                t.setDaemon(True)
                t.start()
            # 由于threading本身不带暂停、停止、重启功能,我试图用线程阻塞的办法来实现,但是还是失败了,问题还在发现、解决中,欢迎网友来评论里交流。

'''+++++++++++++++++++++++++++++++Tk动作+++++++++++++++++++++++++++++++++++'''

def start():
    url = entry_url.get()
    dir_path = entry_path.get()
    os.chdir(dir_path)
    scrolled_text.delete('1.0', END)
    down_file = GetFile(url, dir_path)
    if os.path.exists(down_file.filename):
        os.remove(down_file.filename)
    down_file.run_up()

    # 暂停功能未能实现,这里便注释掉了
    # if button_start['text'] == "开始" or button_start['text'] == "继续":
    #     flag = True
    #     down_file.run_up(flag)
    #     button_start['text'] = "暂停"
    #
    # elif button_start['text'] == "暂停":
    #     flag = False
    #     down_file.run_up(flag)
    #     button_start['text'] = "继续"


def select_path():
    path_ = askdirectory()
    var_path_text.set(path_)

"""=============================tkinter窗口============================"""
# 顶层窗口
top = Tk()  # 创建顶层窗口
top.title('nimo_工具下载器')
screen_width = top.winfo_screenwidth()  # 屏幕尺寸
screen_height = top.winfo_screenheight()
window_width, window_height = 600, 450
x, y = (screen_width - window_width) / 2, (screen_height - window_height) / 3
size = '%dx%d+%d+%d' % (window_width, window_height, x, y)
top.geometry(size)  # 初始化窗口大小
top.resizable(False, False)  # 窗口长宽不可变
# top.maxsize(600, 450)
# top.minsize(300, 240)


# 插入背景图片
tmp = open('bak.png', 'wb+')  # 临时文件用来保存png图片
tmp.write(base64.b64decode(logo))
tmp.close()
image = Image.open('bak.png')
bg_img = ImageTk.PhotoImage(image)
label_img = Label(top, image=bg_img, cursor='spider')
os.remove('bak.png')

# 测试时,注释掉上面的图片插入方法
image = Image.open('bak.png')
bg_img = ImageTk.PhotoImage(image)
label_img = Label(top, image=bg_img, cursor='spider')

# 包件链接(Label+Entry)
label_url = Label(top, text='程序下载链接', cursor='xterm')
var_url_text = StringVar()
entry_url = Entry(top, relief=RAISED, fg='gray', bd=2, width=58, textvariable=var_url_text, cursor='xterm')

# 保存路径(Label+Entry)
label_path = Label(top, text='包件保存路径', cursor='xterm')
var_path_text = StringVar()
entry_path = Entry(top, relief=RAISED, fg='gray', bd=2, width=58, textvariable=var_path_text, cursor='xterm')
button_choice = Button(top, relief=RAISED, text='打开', bd=1, width=5, height=1, command=select_path, cursor='hand2')

# 视频清晰度选择(Label+OptionMenu),这里的功能没设计相关方法,其实可单独做一个视频下载器
label_option = Label(top, text='视频质量', cursor='xterm')
options = ['高清HD', '标清SD', '普清LD']
var_option_menu = StringVar()
var_option_menu.set(options[0])
option_menu = OptionMenu(top, var_option_menu, *options)

# 按钮控件
button_start = Button(top, text='开始', command=start, height=1, width=15, relief=RAISED, bd=4, activebackground='pink',
                      activeforeground='white', cursor='hand2')
# button_pause = Button(top, text='暂停', command='', height=1, width=15, relief=RAISED, bd=4, activebackground='pink',
#                      activeforeground='white', cursor='hand2')
button_quit = Button(top, text='退出', command=top.quit, height=1, width=10, relief=RAISED, bd=4, activebackground='pink',
                     activeforeground='white', cursor='hand2')

# 下载进度(标签,进度条,进度条里的已下载大小和总大小,下载速度,剩余时间)
progress_label = Label(top, text='下载进度', cursor='xterm')
canvas = Canvas(top, width=180, height=20, bg="white")
# 进度条填充
out_rec = canvas.create_rectangle(0, 0, 180, 20, outline="white", width=1)
fill_rec = canvas.create_rectangle(0, 0, 0, 0, outline="", width=0, fill="green")
speed  = StringVar()
speed_label = Label(top, textvariable=speed, cursor='xterm', width=15, height=1)
remain_time = StringVar()
remain_time_label = Label(top, textvariable=remain_time, cursor='xterm', width=15, height=1)

# 可滚动的多行文本区域
scrolled_text = ScrolledText(top, relief=GROOVE, bd=4, height=14, width=70, cursor='xterm')

# place布局
label_img.place(relx=0.5, rely=0.08, anchor=CENTER)
label_url.place(relx=0.12, rely=0.12, anchor=CENTER)
entry_url.place(relx=0.56, rely=0.12, anchor=CENTER)
label_path.place(relx=0.12, rely=0.20, anchor=CENTER)
entry_path.place(relx=0.56, rely=0.20, anchor=CENTER)
button_choice.place(relx=0.94, rely=0.20, anchor=CENTER)
label_option.place(relx=0.14, rely=0.30, anchor=CENTER)
option_menu.place(relx=0.29, rely=0.30, anchor=CENTER)
button_start.place(relx=0.80, rely=0.30, anchor=CENTER)
# button_pause.place(relx=0.58, rely=0.30, anchor=CENTER)
progress_label.place(relx=0.14, rely=0.40, anchor=CENTER)
canvas.place(relx=0.37, rely=0.4013, anchor=CENTER)
speed_label.place(relx=0.62, rely=0.40, anchor=CENTER, )
remain_time_label.place(relx=0.81, rely=0.40, anchor=CENTER)
scrolled_text.place(relx=0.48, rely=0.69, anchor=CENTER)
button_quit.place(relx=0.92, rely=0.96, anchor=CENTER)

# 输入框默认内容,可按需自行修改
var_url_text.set(r'https://www.python.org/ftp/python/3.7.0/Python-3.7.0.tgz')
var_path_text.set(r'C:/Users')

# 运行这个GUI应用
top.mainloop()

实现 exe 封装

由于下载器设置了背景图片,所以在成功生成 exe 文件后,运行时必须要把背景图和它放到同一目录下,但是这就很 low 了,所以用了下面的方法,将图片分解成可解析的 py 文件,代码如下:

# pic_to_py.py

import base64

def png_to_py(picture_name):
    open_png = open("%s.png" % picture_name, 'rb')
    b64str = base64.b64encode(open_png.read())
    open_png.close()
    write_data = 'img = "%s"' % b64str.decode()
    f = open('%s.py' % picture_name, 'w+')
    f.write(write_data)
    f.close()


if __name__ == '__main__':
    picture = ['bak']
    try:
        for p in picture:
            png_to_py(p)
    except Exception as e:
        print(e)

执行 pic_to_py.py 脚本,将在同目录下生成和背景图同名的 py 文件。
生成效果
将生成的 bak.py 文件里的 img 引入到 download.py 文件中,见上文代码。

  • 执行 exe 文件生成命令
    pyinstaller -F -w download.py -i nimo.ico

    生成文件效果
    生成1
    生成2

后记

本文参考了 polyhedronx 博主的文章

【Python Gui】Tkinter 的入门学习 一、前面的话 Python 提供了多个图形开发界面的库,几个常用 Python GUI 库如下: Tkinter:Tkinter 模块(Tk 接口)是 Python 的标准 Tk GUI 工具包的接口 .Tk 和 Tkinter 可以在大多数的 Unix 平台下使用,同样可以应用在 Windows 和 Macintosh 系统里。Tk8.0 的后续版本可以实现本地窗口风格,并良好地运行在... 阅读详情

相关推荐

【Python项目】Python基于tkinter实现笔趣阁小说下载器(附源码)

hello,大家好呀~笔趣阁小说应该很多小伙伴都知道但是用Python实现一个笔趣阁小说下载器那岂不是爽歪歪呀基于tkinter实现的Python版本的笔趣阁小说下载器今天小编给大家实现了部分重要代码已经在上方给大家展示出来了

weixin_72934044的博客 2005

【从零开始制作 bt 下载器】一、了解 torrent 文件

【从零开始制作 bt 下载器】一、了解 torrent 文件

lhys666的博客 3756

【Tkinter界面化小程序】用Python做一款免费音乐下载器、无广告无弹窗、清爽超流畅哦~

前言 嘿!一直在学习从没停下,最近的话一直没咋更新,因为小编也在忙着学编程~ 哈哈哈,今天刚好有时间嘛 那就给学习爬虫的小伙伴儿更新一期简单的爬虫案例实战给大家啦! 前几天我想在某某网站上下载几首音乐放到我的u盘里听,需要下载软件、登录注册......太麻烦 了!于是最后我还是选择了一种最简单,最方便的一种方法: python爬虫。 想听的音乐统统一次性下载下来,想听什么随便听,再也不用登录,超方便! 下面,我以爬取某某音乐为例,介绍一下我时如何学习python爬虫滴~?????????

xy258009的博客 3513

使用tkinter打造一个小说下载器,想看什么小说,就下什么

前言 今天教大家用户Python GUI编程——tkinter打造一个小说下载器,想看什么小说,就下载什么小说 先看下效果图 Tkinter 是使用 python 进行窗口视窗设计的模块。Tkinter模块("Tk 接口")是Python的标准Tk GUI工具包的接口。 作为 python 特定的GUI界面,是一个图像的窗口,tkinter是python 自带的,可以编辑的GUI界面,我们可以用GUI 实现很多直观的功能,比如想开发一个计算器,如果只是一个程序输入,输出窗口的话,是没用用..

Python案例分享,B站视频教程:https://space.bilibili.com/523606542 1216

如何实现一个高速文件下载器

我们从网络上下载文件时通常会使用浏览器或者迅雷这样的下载软件,他们的大多具有高速下载(下载速度快),断点续传(可以暂停之后继续下载)等特性。假如我们自己开发的应用软件中也需要支持这些下载功能,我们该如何设计和实现了?本文主要围绕这一问题进行论述。 首先,我们将一个完善的文件下载库需要具有的特性列举出来: 多线程分片下载 断点续传 磁盘缓存 最高下载速率限制及实时下载速率反馈(可选) 多协议支持,跨平台(可选) 1. 多线程分片下载 Chrome浏览器和迅雷能实现高速下载的核心就是多线程分片下载(这里忽略

while(1) { smile(); } 2043

Niobe Loader:Niobe Loader - 最佳下载器生成器-开源

Niobe Loader 是最好的和简单的加密下载器生成器,大小只有 6 ko,您可以使服务器下载器具有传播、自安装、更快的下载和清洁防病毒价值。

python爬虫GUI工具,tkinter网易云歌单歌曲下载器

网易云音乐应该是不少互联网人使用的听歌神器,不管是从界面还是从交互设计上,虽然现在很多歌曲因为版权下架了,但是并不妨碍粉丝使用及对它的喜爱,刚好刷吾爱破解,看到有大佬分享网易云歌单歌曲下...

二爷记 1048

详解如何用python实现一个简单下载器的服务端和客户端

话不多说,先看代码: 客户端: import socket def main(): #creat: download_client=socket.socket(socket.AF_INET,socket.SOCK_STREAM) #link: serv_ip=input(please input server IP) serv_port=int(input((please input server port))) serv_addr=(serv_ip,serv_port) download_client.connect(serv_addr) #sen

python种子下载器,tkinter版本

运行效果见上图,双击lisbox可以显示当前种子的状态,然后点击下载可以生成磁力链和迅雷链接,(暂时没有找到合适的接口来转换磁力链为torrent) 当搜索敏感词汇时会有温馨提示,不过不影响,点击是即可继续浏览 代码如下: 主窗体: from tkinter.ttk import Entry,Button from tkinter import Tk,Label,StringVa...

thindi的博客 1万+

Tesseract OCR 字库训练教程:提高识别率进阶版

通过 Tesseract 字库训练,你可以提高 OCR 对特定文本或字体的识别能力。训练过程包括准备训练数据、生成标签文件、运行训练工具,以及将训练结果集成到实际项目中。虽然训练过程需要一些时间和精力,但对于需要高精度文本识别的场景来说,字库训练是非常有效的提升识别率的方法。

小蜗牛的珍贵百宝箱 1868

Orange:一个基于 Python 的数据挖掘和机器学习平台

Orange是一个开源的数据挖掘和机器学习平台,采用可视化编程方式,用户可通过拖拽组件构建数据分析工作流。它支持交互式数据探索、多种机器学习算法,并允许Python脚本扩展。Orange特别适合教育和研究,提供直观的界面和丰富的可视化工具。最新版本为3.39.0,支持Windows、macOS和Linux系统。作为GPL许可的免费工具,它既能满足初学者需求,又能通过Python集成实现高级功能。

likuoelie的博客 1436

python tkinter下载器_下载小说还要去找网站?Python使用tkinter打造一个小说下载器...

前言今天教大家用户Python GUI编程——tkinter 打造一个小说下载器,想看什么小说,就下载什么小说先看下效果图Tkinter 是使用 python 进行窗口视窗设计的模块。Tkinter模块("Tk 接口")是Python的标准Tk GUI工具包的接口。作为 python 特定的GUI界面,是一个图像的窗口,tkinter是python 自带的,可以编辑的GUI界面,我们可以用GUI ...

weixin_39779537的博客 365

车载以太网入坑指南,从小白到懂哥的进阶之路【技术分享】

各位技术大佬们好!最近公司项目涉及到车载以太网,刚开始完全懵逼,花了大半个月时间各种查资料、测试设备,总算是摸清了门道。想着互联网上卧虎藏龙,肯定有不少大佬对这个技术感兴趣,所以写个帖子分享一下,顺便求各位大佬指点。

starelink的博客 1262

【Python项目】Python基于tkinter实现一个笔趣阁小说下载器 | 附源码

halo,包子们上午好 笔趣阁小说应该很多小伙伴都知道 但是用Python实现一个笔趣阁小说下载器 那不是爽歪歪呀 基于tkinter实现的Python版本的笔趣阁小说下载器今天小编给大家实现了关注小编,私信小编领取哟! 当然别忘了一件三连哟~~源码点击蓝色字体领取 Python零基础入门到精通视频合集【整整800集】Python爬虫项目零基础入门合集,细狗都学会了,你还不会?Python版本:3.7.8 相关模块: tkinter模块; json模块; 以及一些python自带的模块。安装Python并添

Gtieguo的博客 2791

玩转openclaw+企业微信

OpenClaw横空出世:AI从问答到执行的范式革命 OpenClaw作为2026年AI领域的重大突破,实现了从对话机器人到智能执行体的进化。其核心价值在于"自主执行"而非简单交互,通过六层解耦架构(表现层、网关层、运行时层、技能层、工具层、记忆层)构建完整执行闭环。关键技术包括Model Context Protocol实现多模型兼容,以及事件驱动架构确保实时响应。安装过程支持多平台,通过Node.js环境即可快速部署,并支持对接主流大模型。OpenClaw标志着AI开始真正&quot

西木风落 1591

VS2017中调用gdal(C#版)的方法二(含gdal下载地址,配置过程,代码测试,超详细!!)

VS2017中gdal(C#)版的配置与测试 上次记录了直接在VS2017中下载并应用gdal的方法,这次来记录一下网上下载的安装包配置与测试的方法。 一、环境、版本及下载地址 win10,vs2017社区版,gdal2.4.4 还是像之前在Unity中应用gdal一样,最好是下载已经编译好的C#版的gdal,不然自己配置真的很容易出错,我就是这样的,下面提供不同版本的gdal下载地址: 1.GDAL2.4.4(C#版、64位): https://download.youkuaiyun.com/download/che

chengbaola的博客 1365

sis地址获取器_使用tkinter打造一个小说下载器,想看什么小说,就下什么

前言今天教大家用户Python GUI编程——tkinter打造一个小说下载器,想看什么小说,就下载什么小说先看下效果图Tkinter 是使用 python 进行窗口视窗设计的模块。Tkinter模块("Tk 接口")是Python的标准Tk GUI工具包的接口。作为 python 特定的GUI界面,是一个图像的窗口,tkinter是python 自带的,可以编辑的GUI界面,我们可以...

weixin_39533361的博客 3237

用ADS复现一篇MTT顶刊的GAN功率放大器:从理论推导到版图仿真的完整避坑指南

本文详细解析了如何利用ADS软件复现MTT顶刊中的E/F3类GaN功率放大器设计,从理论推导到版图仿真的全流程。通过核心设计理念解析、ADS环境配置、输出匹配网络优化等关键步骤,提供了一套完整的工程实践指南,帮助工程师跨越学术理论与实际应用的鸿沟,实现高效率射频功率放大器的设计。

weixin_30654583的博客 315

python3制作下载器_Python制作优快云免积分下载器

优快云免积分下载 你懂的。1、输入资源地址如:http://download.youkuaiyun.com/download/gengqkun/41278082、输入验证码3、点击下载,会弹出浏览器下载。注:成功率在70-80% ,界面很丑,请将就着用。#-*-coding:utf-8-*-#python3.3.5import urllib.parse,urllib.request,http.cookiej...

weixin_39878247的博客 413

AUTOSAR NvM 实车故障深度剖析:车载存储问题快速定位与工程解决方案

软件配置与代码逻辑无问题时,排查底层驱动与ECU硬件,步骤如下:底层驱动排查:排查Fls/Eep驱动配置,是否适配目标MCU(如TC397、S32K),编程/擦除/读取时序是否合理;检查Fls/Eep驱动错误处理逻辑,是否未处理Flash编程失败、读取错误等异常;验证Flash高速编程模式是否启用,是否能提升写入/读取速度;排查MemIf层配置,是否正确对接NvM与Fls/Eep驱动,是否存在调度延迟。

getusushu的博客 78

2026年沐曦集成电路数字IC笔试试卷带答案

本文摘要: 这是一份数字IC设计笔试模拟题,包含单选题、波形分析、多选题和代码设计题。重点考察ASIC设计流程(如逻辑综合将RTL转为门级网表)、时序分析(建立时间余量计算)、跨时钟域处理(格雷码应用)、复位机制、状态机设计等核心知识点。涉及沐曦特色考点如GPU架构(SIMT模型)、国产GPU芯片(曦云C系列)及MXMACA软件栈。代码题要求实现50%占空比三分频电路,综合考察Verilog设计能力。试题强调PPA优化、低功耗技术等工程实践要点,覆盖数字IC前端设计全流程核心内容。(149字)

Open 260

python 表情包制作工具_python中tkinter模块制作表情包爬取工具遇到的问题

[Python] 纯文本查看 复制代码import tkinter as tkfrom tkinter.filedialog import askdirectoryimport requestsimport randomimport reclass picture():def __init__(self):self.root = tk.Tk()self.root.title('表情包下载器')se...

weixin_39999116的博客 209

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Python GUI编程之tkinter入门案例--简单的自动文件下载器

利用Python3.6开发了一个简易版的文件批量下载软件demo,使用的GUI工具是tkinter。默认打开桌面的文件夹,可以实现自动读取文本文件中的文件超链接,实现自动下载到桌面。

JasonStudy 2901

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

python实战笔记之(9):TKinter制作知乎视频下载器

前两天写了一个下载知乎视频的小程序,现在给他加了个图形界面,并生成exe文件。同时对原来的程序进行了优化,使用多线程进行任务分配和下载ts文件,解决了GUI卡顿的问题并大大加快了下载速度。 界面如下: 功能: 1.自动检测文章链接是否规范以及链接对应的文章是否含有视频 2.自动检测视频保存路径的规范性,路径可以自己填入或点击“打开”按钮选择 3.可以选择视频质量,有HD、SD、LD三...

polyhedronx的博客 1356
上一篇: 制作工具下载器 by tkinter
下一篇: python基础学习——函数和方法的区别与联系
nimo97
博客等级 码龄9年 6粉丝 16原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值