【兄弟反目成仇系列】:我只是写了一个爆炸信息窗口脚本,好兄弟追了我几条街~

news2024/11/16 13:50:18

文章目录

  • ✨ 真的来咯~
  • 💥爆炸信息窗口
    • 💡设计思路
      • 🔑模块准备
    • ⚠️删除好友警告⚠️
    • 源代码
  • ❓这时你可能会问
    • 👀 批量获取表情包
  • 🛀结束语

专栏
Python零基础入门篇🔥
Python网络蜘蛛🔥
Python数据分析
Django基础入门宝典🔥
小玩意儿🔥
Web前端学习
tkinter学习笔记
Excel自动化处理

✨ 真的来咯~

📢Hello!大家好,有好几天没有跟大家见面咯~不知道大家是否在等待《小玩意儿》专栏的更新呢😉
上一篇的文章👉【老师见打系列】:我只是写了一个自动回复讨论的脚本~

感觉挺受大伙的喜欢的呢,非常感谢各位兄弟给哥们顶上热榜💪,你们的支持就是我更新的动力❗️
所以这几天我就在想是否继续往【老师见打系列】更新文章,想出一些能让”老师见打“的idear,当然,我并不是要故意惹老师生气的哈……

在这里插入图片描述

直到前天,突然想写点什么,于是打开了pycharm,当我正在想着还有什么好的idear的时候,突然看到了左下角的一个py文件,”爆炸信息.py“⁉️我啥时候写的?那时的我一脸懵逼的看着文件里的代码,脑海里没有任何有关于它的记忆,不会是哥们梦游的时候给敲的吧……👀
在这里插入图片描述

仔细把代码看了个遍,突然脑海里才回想起在某年某月某日闲着没事干瞎写了这么一个代码😂,当我再次运行的时候,弹出了一个在我看来丑……呃呃呃那个……界面不太好看的窗口,于是点击窗口发送信息……欸呀我滴妈!!!这这这,运行个啥,代码太短,功能太少,界面还丑八怪咿呀咿呀~
在这里插入图片描述
说时迟那时快,突然冒出一个idear💡,为啥不把这个代码完善一下呢?搞个好看整洁一点的界面,到时候再写一篇文章,文章名我都想好了,你看那标题,起得这么熟练!咱们说干就干💪

于是哥们又挺着千年老腰,花了两三个小时的时间敲出一个还算不错的代码,用了一下,效果很好,我兄弟把我好友给删了……
在这里插入图片描述

开个玩笑😜好了,具体实现效果如何,请各位看官往下看👇

💥爆炸信息窗口

适当娱乐,请勿打扰他人正常生活哦😄


💡设计思路

我是这样想的,如果只简单的写一个单一信息发送就太无趣了,于是我就像每次得发不同的话,那才有意思,于是就想到了txt文件,但是,只有文字是不是效果不强,于是想到了下最流行的交流方式:表情包,诶~这就齐了(当然各位还有其他的idear可以在评论区里评论哈😜)

🔑模块准备

  • tkinter?不行,窗口界面差点意思,那就用 ttkbootstrap模块,ttkbootstrap 是一个基于 tkinter 的界面美化库,使用这个工具可以开发出类似前端 bootstrap 风格的 tkinter 桌面程序,但是还是得用到tkinter中的文件读取函数
  • pynput模块,pynput是一个监听、操作键盘鼠标库,主要用来实现消息的发送,咱们的招数能不能放出去就靠它了
  • time模块,time用来控制放招的间隔,咱们得讲究攻守进退呀!
  • ctypes模块,
  • os模块,主要用来查找文件,配合ttkbootstrap,擦出大火花💥
  • PIL模块,可以叫它图像处理工具包,用来读取表情包
  • win32con模块,此模块与pywin32配合使用,模块中定义了Windows下关于图形操作的API
  • win32clipboard模块,它的功能主要有剪切中文、图片等信息,表情包能不能发出去就靠它了👈
  • pyautogui模块,主要用来控制按下键盘的Ctrl+V键,相信各位对Ctrl C 和 Ctrl V的操作相当之熟练了吧😁

⚠️删除好友警告⚠️

先给大家开一下演示结果,带不带劲
🚦 以下高能,娱乐有度❗️ 请勿频繁使用 ❗️ 删除好友警告⚠️

  • 第一式:只说一句☝️
    在这里插入图片描述

  • 第二式:唐僧念经👴(发送txt文件中的内容)
    在这里插入图片描述

  • 第三式:不说了,扔图😈(发送表情包)
    在这里插入图片描述

源代码

from tkinter import filedialog, Tk, Label
import ttkbootstrap as tk
from ttkbootstrap.constants import *
from pynput.keyboard import Key, Controller as key
from pynput.mouse import Button as Bu, Controller as mouse_el
import time
from ctypes import *
import os
from PIL import Image
import win32con, win32clipboard
import pyautogui


"""
============= 窗口设计 ===========
"""
class Explosion_window(tk.Frame):
    # master等待接收根窗口对象,app等待接收自定义的模块
    def __init__(self, master=None, app=None):
        tk.Frame.__init__(self, master)
        self.master = master
        self.pack()
        # 调用在根窗口创建组件的函数
        self.createWidget()

    def createWidget(self):
        tk.Label(self, text='IT工藤新一 爆炸信息窗口', font=('华文行楷', 25)).grid(row=0, column=0, pady=10)
        tk.Button(self, text='第一式:我只说一句', command=self.first_formula, bootstyle=SUCCESS).grid(row=1, column=0, pady=10)
        tk.Button(self, text='第二式:唐僧念经', command=self.second_formula, bootstyle=SUCCESS).grid(row=2, column=0, pady=10)
        tk.Button(self, text='第三式:不说了,扔图', command=self.three_formula, bootstyle=SUCCESS).grid(row=3, column=0, pady=10)

    # 第一式
    def first_formula(self):
        root_1 = tk.Toplevel() # 实例化一个顶级类窗口
        root_1.title('第一式')
        root_1.geometry('500x300')
        tk.Label(root_1, text='第一式:我只说一句', font=('华文行楷', 22)).grid(row=0, column=1, pady=10)
        tk.Label(root_1, text='招数内容:', font=('华文行楷', 15)).grid(row=1,column=0)
        tk.Label(root_1, text='放招次数:', font=('华文行楷', 15)).grid(row=2, column=0)
        tk.Label(root_1, text='放招间隔(s):', font=('华文行楷', 15)).grid(row=3, column=0)

        words = tk.StringVar() # 接收用户输入的文字
        times = tk.IntVar() # 结束放招次数
        time_interval = tk.IntVar() # 接收放招间隔

        tk.Entry(root_1, textvariable=words, font=('黑体', 15)).grid(row=1, column=1, pady=10)
        tk.Entry(root_1, textvariable=times, font=('黑体', 15)).grid(row=2, column=1, pady=10)
        tk.Entry(root_1, textvariable=time_interval, font=('黑体', 15)).grid(row=3, column=1, pady=10)
        tk.Button(root_1, text='确定放招', command=lambda: app.first_move(words.get(), times.get(), time_interval.get(), root_1), bootstyle=(SUCCESS, OUTLINE)).grid(row=4, column=1)
        root_1.mainloop()

    def second_formula(self):
        formula = 2
        self.second_three_formula(formula) # 调用放招函数

    def three_formula(self):
        formula = 3
        self.second_three_formula(formula)  # 调用放招函数

    def second_three_formula(self, formula): # 第二、第三式的窗口一样,为了提高代码的重用性,用选择判断语句进行操作
        root_2 = tk.Toplevel()

        if formula == 2:
            title1 = '第二式:唐僧念经'
            text1 = '选择txt文件'
            tk.Button(root_2, text='确定放招', command=lambda: app.second_move(filepath.get(), time_interval.get(), root_2),
                      bootstyle=(SUCCESS, OUTLINE)).grid(row=3, column=1, pady=10)

        elif formula == 3:
            title1 = '第三式:不说了,扔图'
            text1 = '选择表情包文件夹'
            tk.Button(root_2, text='确定放招', command=lambda: app.three_move(filepath.get(), time_interval.get(), root_2),
                      bootstyle=(SUCCESS, OUTLINE)).grid(row=3, column=1, pady=10)

        root_2.title(title1)
        root_2.geometry('700x190')
        filepath = tk.StringVar()  # 接收路径
        time_interval = tk.IntVar()  # 接收放招间隔
        tk.Label(root_2, text=title1, font=('华文行楷', 22)).grid(row=0, column=1)
        tk.Label(root_2, text='文件路径:', font=('华文行楷', 15)).grid(row=1, column=0)
        tk.Label(root_2, text='放招间隔(s):', font=('华文行楷', 15)).grid(row=2, column=0)

        def select_file(filepath):  # 选择
            # 选择文件夹
            if formula == 2:
                select_file_path = filedialog.askopenfilename()  # 使用askopenfilename函数选择单个文件
            elif formula == 3:
                select_file_path = filedialog.askdirectory() # askdirectory选择文件夹
            filepath.set(select_file_path)

        tk.Entry(root_2, textvariable=filepath, font=('黑体', 15)).grid(row=1, column=1)
        tk.Entry(root_2, textvariable=time_interval, font=('黑体', 15)).grid(row=2, column=1)
        tk.Button(root_2, text=text1, command=lambda: select_file(filepath)).grid(row=1, column=2, pady=10)

    # 倒计时
    def count_down(self, info=None):
        pass


"""
=============== 功能实现 ================
"""
class Send_information(object):
    def __init__(self):
        pass

    # 放招函数,用于第一、二式
    def Release_moves(self, words=None, times=0, time_interval=0, txt_li=None): # times接收发送的次数,time_interval接收发送的时间间隔
        keyboard = key()  # 获取键盘权限
        mouse = mouse_el()  # 获取鼠标权限
        mouse.press(Bu.left)  # 鼠标左键点击
        mouse.release(Bu.left)  # 鼠标左键松开
        n = 5
        print('请在五秒内将鼠标放到聊天框内并点击!!!')
        for k in range(5):
            print(f'倒计时{n - k}秒')
            time.sleep(1)  # 程序运行等待五秒你是猪

        if times == 0:
            for i in txt_li:
                keyboard.type(f"{i}")  # 输入框的内容
                keyboard.press(Key.enter)  # 回车键按下
                keyboard.release(Key.enter)  # 回车键松开
                time.sleep(time_interval)
        else:
            for i in range(times):
                keyboard.type(f"{words}")  # 输入框的内容
                keyboard.press(Key.enter)  # 回车键按下
                keyboard.release(Key.enter)  # 回车键松开
                time.sleep(time_interval)


    # 接收用户输入的数据
    def first_move(self, words, times, time_interval, root_1):
        root_1.destroy()
        self.Release_moves(words=words, times=times, time_interval=time_interval) # 调用放招函数


    # 接收用户选择的文件路径
    def second_move(self, txt_path, time_interval, root_2):
        root_2.destroy()
        txt_li = [] # 保存txt中的语句
        with open(txt_path, 'r', encoding='utf-8') as f:
            for line in f: # 循环遍历输出txt文件内容
                if line in ['\n', '\r\n']: # 判空处理
                    pass
                elif line.strip() == "": # 空行直接跳过
                    pass
                else:
                    txt_li.append(line.strip()) # 将内容保存到txt中
        self.Release_moves(txt_li=txt_li, time_interval=time_interval) # 调用放招哈数


    # 接收用户选择的图片
    def three_move(self, photo_path, time_interval, root_3):
        root_3.destroy()
        filepath = [photo_path + '/' + file for file in os.listdir(photo_path)] # 拼接路径
        i = 0
        n = 5
        print('请在五秒内将鼠标放到聊天框内并点击!!!')
        for k in range(5):
            print(f'倒计时{n - k}秒')
            time.sleep(1)  # 程序运行等待五秒你是猪

        # 复制图片
        for path in filepath:
            try:
                im = Image.open(path)
                im.save('11.bmp')
                aString = windll.user32.LoadImageW(0, r"11.bmp", win32con.IMAGE_BITMAP, 0, 0, win32con.LR_LOADFROMFILE)
            except:
                continue

            if aString != 0:  ## 由于图片编码问题  图片载入失败的话  aString 就等于0
                win32clipboard.OpenClipboard()
                win32clipboard.EmptyClipboard()
                win32clipboard.SetClipboardData(win32con.CF_BITMAP, aString)
                win32clipboard.CloseClipboard()

                keyboard = key()  # 获取键盘权限
                if i == 0:
                    i += 0
                pyautogui.hotkey('ctrl', 'v')
                keyboard.press(Key.enter)  # 回车键按下
                keyboard.release(Key.enter)  # 回车键松开
                time.sleep(time_interval)

if __name__ == '__main__':
    root = tk.Window()   # 建立一个根窗口
    root.title('爆炸信息') # 窗口名称
    root.geometry('500x300') # 窗口大小  宽x高
    app = Send_information() # 实例化Send_information对象
    Explosion_window(root, app) # 实例化Explosion_window对象
    root.mainloop()

❓这时你可能会问

诶,到了这的小伙伴可能会有些疑问:表情包怎么下载呀?一个个手动下载岂不是太麻烦了呀……
👉别担心,我怎么会让你们动手呢,最多动动脑😄

来来来!敲黑板了!!!现在布置一个作业!接下来我将放一个批量下载表情包的源码,通过观察源码进行操作,实现图片下载。

提醒!真相只有一个:只用改url 😁

在这里插入图片描述

👀 批量获取表情包

import requests
from lxml import etree
import os
import threading


def get_url(url, img_urls): #获取图片url
    res = requests.get(url, headers=headers)    # 发送请求
    html = etree.HTML(res.text)     # 将html元素转换成html对象
    img_urls += html.xpath('//div[@class="thumbnail"]/a/img/@src')


def user_choose(): # 用户选择下载图片的页数
    img_urls = []  # 存放图片url
    # 请输入下载网址
    url = 'http://www.bbsnet.com/egao'
    # 用户输入页数
    page = int(input('请输入获取的页数:'))
    for i in range(0, page):
        if page == 0:
            get_url(url, img_urls)
        elif page >= 1:
            link = url + f'/page/{i+1}'     # 拼接链接
            get_url(link, img_urls)   #调用获取图片url的函数
    return img_urls


def download_picture(img_url, i, j): # 下载图片
    res = requests.get(img_url, headers)
    with open(f'./表情包/表情包-{i}.{j}', 'wb') as f:
        f.write(res.content)


if __name__ == '__main__':
    if not os.path.exists('./表情包'):
        os.makedirs('./表情包')

    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36'
    }
    img_urls = user_choose()

    threads = []
    for i in range(len(img_urls)):
        t = threading.Thread(target=download_picture, args=(img_urls[i], i, img_urls[i][-3:]))
        threads.append(t)
    for t in threads:
        t.start()

🛀结束语

实话实说,写这篇文章总共画了我三个多小时😭,一边调试一边写,期间又删删改改一些内容,减少代码量,将代码逻辑变得更加严谨些,再加上之前写代码的时间,录视频,制作gif……,加起来应该有七八个小时吧,欸,千年老腰要塌了😐(卑微求个三连🙏)

不管怎样,总算是写完了😄
不知道小伙伴们是否喜欢这一片文章,如果喜欢,可以旋个三连 点赞👍 收藏🌈 关注哦💖 您的支持,就是我更新的最大动力!感谢🌹

❗️提醒:爆炸信息窗口仅供娱乐,请勿骚扰他人,避免给他人造成生活上的不便~

peace~

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

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

相关文章

高德地图 API,点击地图标记获取自定义标记 (Marker) 中的信息

高德地图 API,点击地图标记获取自定义标记 (Marker) 中的信息 通过 高德地图 JS Web 添加自定义图标,自定义窗口标记 已经能在地图中正常添加自定义标记了 这篇文章讲讲点击标记时,如何从自定义标记中获取你需要的信息,如何预置一…

计算机网络【IP协议与以太网】

计算机网络【IP协议与核心协议】🍎一.IP协议🍒1.1IPv4协议格式🍒1.2 IP协议地址🍒1.3IPv4协议的解决方案🍒1.4路由选择(了解)🍎二.以太网协议🍒2.1以太网协议格式🍒2.2认识MTU(了解)…

聊一聊JAVA中的缓存规范 —— 虽迟但到的JCache API与天生不俗的Spring Cache

为何需要规范 上一章中构建的最简化版本的缓存框架,虽然可以使用,但是也存在一个问题,就是它对外提供的实现接口都是框架根据自己的需要而自定义的。这样一来,项目集成了此缓存框架,后续如果想要更换缓存框架的时候&a…

哈希的应用

文章目录前言一、位图1.1位图概念1.2位图的实现1.3 位图的应用二、 布隆过滤器2.1 布隆过滤器提出2.2 布隆过滤器概念2.3 布隆过滤器的插入2.4 布隆过滤器的哈希函数2.5 布隆过滤器的查找2.6 布隆过滤器删除2.7 布隆过滤器的优点2.8 布隆过滤器的缺陷2.9 布隆过滤器的应用场景前…

散射辐射变送器的优势体现在哪些方面?

散射辐射是经过大气分子、水蒸气、灰尘等质点的散射,改变了方向的太阳辐射,也称天空散射辐射。太阳散射辐射强弱程度与太阳辐射的入射角、大气条件(云量、水汽、砂粒、烟尘等粒子的多少)和地面反射率有关。当天空的浑浊程度加大&a…

链路状态路由协议 OSPF (三)

作者简介:一名在校云计算网络运维学生、每天分享网络运维的学习经验、和学习笔记。 座右铭:低头赶路,敬事如仪 个人主页:网络豆的主页​​​​​​ 目录 前言 一.OSPF领接关系的建立 1.OSPF领接关系的建立概述 &#xff0…

彻底理解Java并发:乐观锁与CAS

本篇内容包括:悲观锁与乐观锁的概述、CAS(Compare And Swap)比较并交换的介绍、非阻塞算法与ABA问题,以及对 Java 中 CAS 的实现解读(AtomicInteger 对 CAS 的实现,Unsafe 类简介)。 一、悲观锁…

【树莓派不吃灰】Raspberry Pi上搭建NodeJS运行环境

目录1. 前言2. 安装NodeJS环境2.1 安装npm2.2 安装nodejs2.3 配置NPM国内镜像源3. 总结❤️ 博客主页 单片机菜鸟哥,一个野生非专业硬件IOT爱好者 ❤️❤️ 本篇创建记录 2022-10-28 ❤️❤️ 本篇更新记录 2022-10-28 ❤️🎉 欢迎关注 🔎点赞…

嵌入式C语言编程中经验教训总结(八)变量、指针和指针数组的内存管理

目录嵌入式C语言编程中经验教训总结(八)变量、指针和指针数组的内存管理变量、指针和指针数组的内存占用指针、指针数组的空间验证指针数组的元素数据访问方法嵌入式C语言编程中经验教训总结(八)变量、指针和指针数组的内存管理 …

【趣学算法】第一章读书笔记

14天阅读挑战赛 *努力是为了不平庸~ 算法学习有些时候是枯燥的,这一次,让我们先人一步,趣学算法! 文章目录1.1打开算法之门1.2 妙不可言——算法复杂性算法的特性好算法的标准时间复杂度和空间复杂度时间复杂度空间复杂度宕机1.4算…

62. 如何通过增强(Enhancement) 的方式给 SAP ABAP 标准程序增添新功能

文章目录 如何找到可以创建增强实现的增强点位置如何创建增强实现如何在 SE80 里找到增强实现本身如何调试 ABAP 增强实现总结ABAP 系统有比较完善的修改控制权限管控,比如笔者试图修改一个 SAP ABAP 系统里标准的函数,就会遇到如下的警告消息,然后修改的尝试会被阻止: You…

Winform和ASP.NET、Web API详解

Winform和ASP.NET、Web API 一、winform基础 1.1 基础学习 1、 winform应用程序是一种智能客户端技术,我们可以使用winform应用程序帮助我们获得信息或者传输信息等。 2、属性 Name:在后台要获得前台的控件对象,需要使用Name属性。 visible:指示一…

认识运营商机房

文章目录走线设备机房走线数据机房走线传输机房列头柜【供电】网络架构ONU设备OLT设备汇聚层交换机BARS设备核心路由器运营商网络架构【必看】铁塔基站核心机房ODF:光纤配线架MME光纤SGWPGWHSS交换机拓扑核心机房拓扑接入层基站(BaseStation)…

山西大同大学技术会,大同大学的家!

大家好,我是康来个程,山西大同大学技术会的创建者。 低谷时代 近几年校内的竞赛氛围越来越浓厚,随着自身参与并了解的赛事越来越多,随之而来的也是发现了我们学校竞赛方面的问题。疫情原因,我们的比赛取消的取消&…

Gitee在大数据中心的使用

在本地主机或者可以VSCode直接连接可视化的服务器上 1. 首先在gitee新建一个带有develop分支的仓库 2. 在自己的主机(e.g., server 1~3)上git clone下来,例如 git clone gitgitee.com:PeterBishop0/TransT-based.git 3. 切换成develop分支&…

深度学习入门(十) 模型选择、过拟合和欠拟合

深度学习入门(十) 模型选择、过拟合和欠拟合前言模型选择例子:预测谁会偿还贷款?训练误差和泛化误差验证数据集和测试数据集K-则交叉验证总结过拟合和欠拟合模型容量模型容量的影响估计模型容量VC维线性分类器的VC维VC维的用处数据…

[云原生之k8s] Kubernetes原理

引言 单机容器编排:docker-compose 容器集群编排:docker swarm、mesosmarathon、kubernetes 应用编排:ansible 一、Kubernetes是什么? Kubernetes的缩写为:K8S,这个缩写是因为k和s之间有八个字符的关系…

线段树模板

好文分享:【数据结构】线段树(Segment Tree) - 小仙女本仙 - 博客园 线段树和树状数组的基本功能都是在某一满足结合律的操作(比如加法,乘法,最大值,最小值)下,O(logn)的时间复杂度内修改单个元…

Python回归预测建模实战-支持向量机预测房价(附源码和实现效果)

机器学习在预测方面的应用,根据预测值变量的类型可以分为分类问题(预测值是离散型)和回归问题(预测值是连续型),前面我们介绍了机器学习建模处理了分类问题(具体见之前的文章)&#…

x86 --- 任务隔离特权级保护

程序是记录在载体上的数据和指令。 程序正在执行时的一个副本叫做任务 所有段描述符都放在GDT --> 不做区分。 内核程序(任务)所占段在GDT中,用户程序(任务)所占段在LDT中 --> 做区分。 每个任务都有自己独立的…