Python + ttkbootstrap 制作全网小说下载神器

news2025/4/17 13:22:40

前言

ttkbootstrap是一个基于Python的开源库,用于创建漂亮且交互式的GUI应用程序。它是在Tkinter框架之上构建的,提供了一系列的Widget组件和样式,可以帮助开发者快速构建现代化的用户界面。

今天做的是这个东西,蓝色的是进度条

获取数据代码(附上代码)

def get_response(html):
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36',
    }
    response = requests.get(url=html, headers=headers)
    return response


def search(key):
    search_url = f'https://www.xzmncy.com/api/search?q={key}'
    search_data = get_response(search_url).json()
    search_info = []
    num = 1
    for index in search_data['data']['search']:
        dit = {
            'num': num,
            'name': index['book_name'],
            'author': index['author'],
            'book': index['book_list_url'].split('/')[-2],
        }
        search_info.append(dit)
        num += 1
    return search_info


def get_info(book):
    link = f'https://www.xzmncy.com/list/{book}/'
    link_data = get_response(link).text
    link_selector = parsel.Selector(link_data)
    href = link_selector.css('#list dd a::attr(href)').getall()
    href = ['https://www.xzmncy.com' + i for i in href]
    return href


def get_content(html):
    html_data = get_response(html).text
    selector = parsel.Selector(html_data)
    title = selector.css('.bookname  h1::text').get()
    content_list = selector.css('#htmlContent p::text').getall()
    content = '\n'.join(content_list)
    return title, content


def save(name, title, content):
    with open(name+'.txt', mode='a', encoding='utf-8') as f:
        f.write(title)
        f.write('\n')
        f.write(content)
        f.write('\n')

界面显示

所需模块

import ttkbootstrap as ttk
from PIL import ImageTk, Image
from download import *
from ttkbootstrap.dialogs import Messagebox

实例化创建应用程序窗口

root = ttk.Window(
    title="小说下载器",  # 设置窗口的标题
    themename="litera",  # 设置主题
    size=(470, 520),  # 窗口的大小
    position=(100, 100),  # 窗口所在的位置
    minsize=(0, 0),  # 窗口的最小宽高
    maxsize=(1920, 1080),  # 窗口的最大宽高
    resizable=None,  # 设置窗口是否可以更改大小
    alpha=1.0,  # 设置窗口的透明度(0.0完全透明)
)

ico = ImageTk.PhotoImage(Image.open("python.ico"))
root.iconphoto(False, ico)
root.place_window_center()    #让显现出的窗口居中
root.resizable(False, False)  # 让窗口不可更改大小


root.mainloop()

搜索框

image = Image.open("img\\123123.png")
photo = ImageTk.PhotoImage(image)
ttk.Label(root, image=photo).pack()
key_input_frame = ttk.Frame()
key_input_frame.pack(pady=10)
key_input_key_va = ttk.StringVar()
ttk.Label(key_input_frame, text='小说 | 作者', font=('微软雅黑', 12)).pack(side=ttk.LEFT)
ttk.Entry(key_input_frame, textvariable=key_input_key_va, font=('微软雅黑', 12)).pack(side=ttk.LEFT, padx=10,fill=ttk.BOTH)
num_input_frame = ttk.Frame()
num_input_frame.pack(pady=10)
num_input_key_va = ttk.StringVar()
ttk.Label(num_input_frame, text='小说 | 序号', font=('微软雅黑', 12)).pack(side=ttk.LEFT)
ttk.Entry(num_input_frame, textvariable=num_input_key_va, font=('微软雅黑', 12)).pack(side=ttk.LEFT, padx=10,fill=ttk.BOTH)
frame = ttk.Frame()
frame.pack(fill=ttk.BOTH)

按钮和进度条

ttk.Button(key_input_frame, text='搜索').pack(side=ttk.LEFT)
ttk.Button(num_input_frame, text='下载').pack(side=ttk.LEFT)
progress_bar = ttk.Progressbar(frame, orient='horizontal', length=300, mode='determinate')
progress_bar.pack(pady=20)

显示搜索到的书名、作者等

# 1. 创建字段
columns = ("num", "name", "author", "book")
columns_value = ('序号', '小说', '作者', '书ID')
# 2. 创建表格对象
tree_view = ttk.Treeview(root, show="headings", columns=columns)
# 3. 给表格添加字段名
tree_view.column('num', width=80, anchor='center')
tree_view.column('name', width=80, anchor='center')
tree_view.column('author', width=80, anchor='center')
tree_view.column('book', width=80, anchor='center')

# 4. 设置字段在页面上显示的内容
tree_view.heading('num', text='序号')
tree_view.heading('name', text='小说')
tree_view.heading('author', text='作者')
tree_view.heading('book', text='书ID')

# 5. 将表格对象布局到页面上
tree_view.pack(fill=ttk.BOTH, expand=True)

搜索功能设置

def show():
    key = key_input_key_va.get()
    search_info = search(key)
    # 6. 往表格中添加数据
    for index, stu in enumerate(search_info):
        tree_view.insert('', index + 1, values=(
            stu['num'], str(stu['name']), str(stu['author']), str(stu['book'])))

下载功能设置

def start_download():
    key = key_input_key_va.get()
    search_info = search(key)
    page = num_input_key_va.get()
    book = search_info[int(page) - 1]['book']
    href = get_info(book)
    # 模拟下载任务,这里使用一个简单的循环来表示
    for i in range(len(href)):
        # 更新进度条的值
        progress_bar['value'] = i
        # 更新进度条的显示
        progress_bar.update()
        list_url = href[i]
        title, content = get_content(list_url)
        save(name=search_info[int(page) - 1]['name'], title=title, content=content)

    Messagebox.show_info(title='下载提示', message=f'关于 {search_info[int(page) - 1]["name"]} 内容, 下载完成!!!!', alert=True)

最后运行效果

适合练手的25个Python案例源码分享,总有一个你想要的

👇问题解答 · 源码获取 · 技术交流 · 抱团学习请联系👇

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/868287.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[管理与领导-10]:IT基层管理者 - 目标、责任、落实 - 如何把管理者的高高在上的目标,落地、落实到团队实施

目录 前言: 情形1:下属不知如何下手 情形2:下属不敢承诺 情形3:下属能力不够 情形4:奖罚机制失效,干活的动力不够 补充:目标与落实过节的进一步分析 1. 目标分解出了问题:目…

abbitmq启动访问不了http://localhost:15672 通过修改服务登录admin

abbitmq默认的对Administration授权,而我的用户不是默认的Administration,所以后来打开服务,找到rabbitmq服务,属性,登陆,将本地系统账户修改为此账户,修改完成之后再重启服务,这时候…

“探索计算机世界:进程的基本概念与功能“

文章目录 前言什么是进程如何描述进程进程的属性1. 进程标识符2. 内存指针3. 文件描述符表4. 进程的状态5. 优先级6. 上下文7. 记账信息 内存分配并行和并发 前言 作为程序员,理解计算机的组成以及计算机是怎样运行的是很重要的,因为只有了解计算机我们…

SQL-每日一题【1517. 查找拥有有效邮箱的用户】

题目 表: Users 编写一个解决方案,以查找具有有效电子邮件的用户。 一个有效的电子邮件具有前缀名称和域,其中: 前缀 名称是一个字符串,可以包含字母(大写或小写),数字,下划线 _ &…

解决MySQL与Redis缓存一致性的问题

背景 考试系统中,教师会在后台发布一场考试,考试会存储在MySQL和Redis里面,考试有时候是会出错的,我们需要后台修改,如果多个教师在后台并发修改(概率不大),可能会出现数据库缓存不…

【mysql】MySQL CUP过高如何排查?

文章目录 一. 问题锁定二. QPS激增会导致CPU飘高三. 慢SQL会导致CPU飘高四. 大量空闲连接会导致CPU飘高五. MySQL问题排查常用命令 一. 问题锁定 通过top命令查看服务器CPU资源使用情况,明确CPU占用率较高的是否是mysqld进程,如果是则可以明确CUP飘高的原…

Java类和对象(一文读懂)

文章目录 类、对象是什么?创建类构造器 创建对象 类、对象是什么? 类:类是一个模板,它描述一类对象的行为和状态。类可以看成是创建 Java 对象的模板。 对象:对象是类的一个实例(对象不是找个女朋友&#x…

自动驾驶——驶向未来的革命性技术

自动驾驶——驶向未来的革命性技术 自动驾驶的组件自动驾驶的优势自动驾驶的应用自动驾驶的未来中国的自动驾驶 自动驾驶是一种技术,它允许车辆在没有人类驾驶员的情况下自主地进行行驶。它利用各种传感器、计算机视觉、人工智能和机器学习算法来感知和理解周围环境…

大模型开源,创业者又站在了同一起跑线

先聊聊最近接触的几个创业者,AI 领域的。有两位做艺术二维码变现的,一个模式比较简单 PSSD,另一个有点技术含量,预训练好几张图,让用户上传自己的二维码,再生成新的二维码,形式上要比 PS 的自动…

【单片机毕业设计】【hj-001】温度控制 | 恒温箱 | 保温箱 | 恒温孵化器 | 环境检测 | 温度检测

一、基本介绍 项目名: 基于单片机的温度控制系统设计 基于单片机的恒温箱系统设计 基于单片机的保温箱系统设计 基于单片机的恒温孵化器系统设计 基于单片机的环境检测系统设计 基于单片机的温度检测系统设计 项目编号:mcuclub-hj-001 单片机类型&…

Apache Paimon 在同程旅行的实践进展

摘要:本文整理自同程旅行大数据计算组负责人吴祥平,在 Apache Paimon Meetup 的分享。本篇内容主要分为四个部分: 1. Apache Paimon 引入 2. Apache Paimon 应用建设 3. Apache Paimon 优化实践 4. 未来规划和期待 Tips:点击「阅读…

VR虚拟现实素材大全助力开发者实现更加丰富的交互效果

VR虚拟现实素材大全由广州华锐互动开发,在VR虚拟现实项目制作中发挥着至关重要的作用。这些素材库提供了各种类型的3D模型、纹理、材质、灯光和特效,涵盖食品、建筑、汽车、运动、人物、科技等各个领域,使得开发者可以更加方便地构建逼真的虚…

数据库锁表 Lock wait timeout exceeded; try restarting transaction

锁等待超时 Lock wait timeout exceeded; try restarting transaction,是当前事务在等待其它事务释放锁资源造成的 解决办法 1、数据库中执行如下sql,查看当前数据库的线程情况: show full PROCESSLIST2、再到 INNODB_TRX 事务表中查看&…

一文教你如何创建 Python 虚拟环境

目录 前言一、配置虚拟环境1.1 Windows1.2 Linux 二、常用管理命令三、FAQ 前言 其实这都是 Python 基础该掌握的,今天博客记录一下,方便自己或其他人阅读。虚拟环境的好处在于达到环境上的隔离,如:不同的项目有自己独特的环境&a…

Spring Boot 统一功能处理(拦截器实现用户登录权限的统一校验、统一异常返回、统一数据格式返回)

目录 1. 用户登录权限校验 1.1 最初用户登录权限效验 1.2 Spring AOP 用户统⼀登录验证 1.3 Spring 拦截器 (1)创建自定义拦截器 (2)将自定义拦截器添加到系统配置中,并设置拦截的规则 1.4 练习:登录…

app测试和web测试的区别是什么?【软件测试经典面试题】

单纯从功能测试的层面上来讲的话: APP 测试、web 测试 在流程和功能测试上是没有区别的。 1.系统架构方面: web项目,一般都是b/s架构,基于浏览器的 app项目,则是c/s的,必须要有客户端,用户需…

AI绘画(1)stable diffusion安装教程

1、引言 stable diffusion 是一款免费开源的AI绘画工具,它能够帮助任何人轻松地进行绘画创作。不论你是有绘画基础还是完全没有经验,stable diffusion 都能让你在数字画布上释放创造力。 stable diffusion 提供了丰富多样的绘画工具和选项,…

公会在tiktok发展,有哪些国家,怎么入驻呢?

在秀场直播领域,众多公会都将目光聚焦在TikTok上。TikTok已成为一个新的金矿,许多公会已在这个平台上赚得盆满钵满。 这些公会在TikTok上月流水达到数百万美元,甚至在一场PK中流水达到40万美元,分成比例高达80%。TikTok的秀场直播…

PostGIS 矢量瓦片

title: PostGIS 矢量瓦片 date: 2023-08-07 author: ac tags: vector tile categories:Database Martin - 基于PostGIS的矢量瓦片服务器 1. 简介 目前流行的矢量瓦片的切图方案: mapbox gl tippecanoe :v2收费,tippecanoe是mapbox官方推…

【C语言】结构体详解

现实生活中一个事物,会有许多属性连接起来。而C语言引入一种构造数据类型——结构体 将属于一个事物的多个数据组织起来以体现其内部联系。 一、结构体类型的定义 结构体类型 是一种 构造类型,它是由若干成员组成的,每个成员可以是一个基本…