飞道的博客

教你一招python 520表白!!!

324人阅读  评论(0)

TIPS:

程序效果:
视频地址 :哔哩哔哩个人空间(可能还没过审,2020 5.16 上传的。)
以上效果可在下面的项目中实现,视频中出现的文字可以修改,但是为了防止个别童靴的‘’拿来主义‘’这里就不说明哪里改了,自己慢慢看。
文末获取完整码源。

项目结构

废话不多说,先来看看项目:

这里先介绍一下各个模块的功能
Fold_win用于生成一个窗口,主要用于最后面显示表白语句。
main主控程序,负责最后的效果呈现。
Image_c负责对图像进行处理,添加图片水印,设置壁纸。
set_p_w获取相应的图片资源和表白的句子,主要是爬虫去爬取。
这里要说明一下的是虽然爬虫会爬取相应的资源,但是有一个文件必须手动下载,也就是自己去找,如图:

这三个爬虫没有去爬取需要自己下载设置,当然你可以在文末获取完整码源。

获取图片

表白么,怎么也得弄几张背景图片衬托一下。
下面是
set_p_w
文件

import requests

import os

import re

header = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) \
Chrome/80.0.3987.149 Safari/537.36'}

def get_iamges():
    try:

        images_path='D:/Confession/image'
        if not os.path.exists(images_path):
            os.makedirs(images_path)

            url='http://pic.netbian.com/e/search/result/?searchid=18'

            data=requests.get(url,headers=header)
            data=data.content.decode('gbk')
            #print(data)
            path='</b></a></li><li><a href="(.*?)" target="_blank"><img src="/'
            path=re.compile(path,re.M)
            url_=path.findall(data)
            #print(url_)
            view_url=[]
            urlx='http://pic.netbian.com'
            for i in url_:
                url_l=urlx+i
                view_url.append(url_l)
            #print(view_url)
            path_2='<a href="" id="img"><img src="(.*?)" data-pic="'
            path_2=re.compile(path_2)
            number=0
            pics_url=[]
            for i in view_url:
                data_=requests.get(i,header)
                data_2=data_.content.decode('gbk')
                pic_=path_2.findall(data_2)[0]
                pic_url=urlx+pic_
                pics_url.append(pic_url)
                if  not os.path.exists(images_path):
                    os.makedirs(images_path)
                data_p_=requests.get(pic_url,header)
                data_p=data_p_.content
                path_image_one=images_path+'/'+str(number)+'.jpg'
                number+=1
                with open(path_image_one,'wb') as f:
                    f.write(data_p)
                    f.close()
    except Exception as e:
        print(e)
    #print(pics_url)

#get_iamges()
def get_words():
    try:

        path='D:/Confession/words'
        if not os.path.exists(path):
            os.makedirs(path)
            url_w='https://baijiahao.baidu.com/s?id=1634005464753918917&wfr=spider&for=pc'
            data_w=requests.get(url_w,header)
            data_w=data_w.content.decode('utf-8')
            path_w_r='<span class="bjh-p">..(.*?).?</span>'
            path_w_r=re.compile(path_w_r)
            words=path_w_r.findall(data_w)
            del words[-1]
            del words[-1]
            save_path=path+'/'+'word.love'
            with open(save_path,'w',encoding='utf-8') as f:
                f.write(str(words))
                f.close()
    except Exception as e:
        print(e)

if __name__=='__main__':
    get_iamges()
    get_words()

``如上所示他还爬取了情话,当然你也可以自己写,存入D:\Confession\words\word.love。注意这里是写入list

图片处理

Image_c 的功能
首先代码如下:

from PIL import Image, ImageDraw, ImageFont,ImageSequence

import win32api
import win32con
import win32gui
import os





def add_word(image, text, color=None):
    try:
        font=ImageFont.truetype("simsun.ttc", 30)
        r_image = image.convert('RGBA')
        text_lay = Image.new('RGBA', r_image.size, (255, 255, 255, 0))
        image_draw = ImageDraw.Draw(text_lay)
        text_x_, text_y_ = image_draw.textsize(text, font=font)
        text_xy = ((r_image.size[0] - text_x_) / 2, (r_image.size[1] - text_y_) / 2)
        image_draw.text(text_xy, text, color, font=font)
        image_ok=Image.alpha_composite(r_image,text_lay)
        #image_ok.show()
        return image_ok
    except Exception  as e:
        print(e)


def watermark_on_gif(in_gif, out_gif, text='test'):
    """给gif添加水印,由于图像处理问题部分图像处理后会程灰黑色"""

    frames = []
    font = ImageFont.truetype('simsun.ttc', 44)


    im = Image.open(in_gif)

    water_im = Image.new("RGBA", im.size,(255, 255, 255, 0))

    draw = ImageDraw.Draw(water_im)
    text_x_, text_y_ = draw.textsize(text, font=font)
    text_xy = ((im.size[0] - text_x_) / 2, (im.size[1] - text_y_) / 2)
    draw.text(text_xy, text,font=font)

    for frame in ImageSequence.Iterator(im):

        frame = frame.convert("RGBA")

        frame.paste(water_im, None,water_im)

        frames.append(frame)

    newgif = frames[0]

        # quality参数为质量,time为每幅图像播放的毫秒时间

    newgif.save(out_gif, save_all=True,
                    append_images=frames[1:], quality=300, time=100)
    im.close()



def setWallpaperFromBMP(imagepath):
        k = win32api.RegOpenKeyEx(win32con.HKEY_CURRENT_USER,"Control Panel\\Desktop",0,win32con.KEY_SET_VALUE)
        win32api.RegSetValueEx(k, "WallpaperStyle", 0, win32con.REG_SZ, "2") #2拉伸适应桌面,0桌面居中
        win32api.RegSetValueEx(k, "TileWallpaper", 0, win32con.REG_SZ, "0")
        win32gui.SystemParametersInfo(win32con.SPI_SETDESKWALLPAPER,imagepath, 1+2)

def setWallPaper(imagePath,name):
        """
        Given a path to an image, convert it to bmp and set it as wallpaper
        """
        StoreFolder=r'D:\Confession\image_add_w'
        if  not os.path.exists(r'D:\Confession\image_add_w'):
            os.makedirs(StoreFolder)
        bmpImage = Image.open(imagePath)
        newPath = StoreFolder + '\\'+str(name)+'.bmp'
        bmpImage.save(newPath, "BMP")
        setWallpaperFromBMP(newPath)
if __name__=='__main__':

    setWallPaper(r'D:\Confession\image\0.jpg',0)
    im_test=Image.open(r'D:\Confession\image\0.jpg')
    im_t=add_word(im_test,'''sdad\nsadasdas''')
    #im_t.show()
    #im_t.save('1.png','png')


    watermark_on_gif(r'D:\Confession\image\1.gif',r'D:\Confession\image\use.gif','XIA MENG I COMING')
这里有两个关于图像处理的,和一个设置壁纸的函数。
其中

```python

def watermark_on_gif(in_gif, out_gif, text='test'):
    """给gif添加水印,由于图像处理问题部分图像处理后会程灰黑色"""

    frames = []
    font = ImageFont.truetype('simsun.ttc', 44)


    im = Image.open(in_gif)

    water_im = Image.new("RGBA", im.size,(255, 255, 255, 0))

    draw = ImageDraw.Draw(water_im)
    text_x_, text_y_ = draw.textsize(text, font=font)
    text_xy = ((im.size[0] - text_x_) / 2, (im.size[1] - text_y_) / 2)
    draw.text(text_xy, text,font=font)

    for frame in ImageSequence.Iterator(im):

        frame = frame.convert("RGBA")

        frame.paste(water_im, None,water_im)

        frames.append(frame)

    newgif = frames[0]

        # quality参数为质量,time为每幅图像播放的毫秒时间

    newgif.save(out_gif, save_all=True,
                    append_images=frames[1:], quality=300, time=100)
    im.close()


用于处理gif动图,当然有一些瑕疵。而这个函数的主要目的是为了处理gif图片加入水印,之后在tkinter的窗口显示。
(处理侯的gif)

窗口处理

现在万事俱备,但是如果只是单纯的换壁纸没啥意思,所以我们在来一个动态窗口,用tkinter播放gif动图。
Fold_win函数。代码如下:

import  tkinter as tk
import threading


def root_show(x_,y_,width,height,path,part):
    try:
        root =part
        screen_width=root.winfo_screenwidth()
        screen_height=root.winfo_screenheight()
        x=int((screen_width-width)/x_)
        y=int((screen_height-height)/y_)
        root.geometry(str(width)+'x'+str(height)+'+'+(str(x))+'+'+(str(y)))

        root.overrideredirect(True)
        #播放gif动态图
        unmdex=25#设置帧数
        frames=[tk.PhotoImage(file=path,format='gif -index %i' %(i)) for i in range(unmdex)]
        def update(id_x):
            frame=frames[id_x]
            id_x+=1
            label_1.configure(image=frame)
            root.after(100,update,id_x%unmdex)
        def down():
            root.quit()


        label_1=tk.Label(root)
        label_1.pack()
        root.after(0,update,0)
        root.after(10000,down)

        root.mainloop()
    except Exception as e:
        print(e)
if __name__=='__main__':

    try:
        def first():
            root_show(4,2,300,300,'image/01.gif',tk.Tk())
        def secend():
            root_show(2, 2,350, 100, 'image/02.gif', tk.Toplevel())
            #在tkinter中只允许一个窗口的创建另一个窗口必须位frame或者置顶窗口


        Trade=[]#创建线程
        t_f=threading.Thread(target=first)
        Trade.append(t_f)
        t_s=threading.Thread(target=secend)
        Trade.append(t_s)
        for t in Trade:
            t.setDaemon(True)
            t.start()
        t_f.join()
        t_s.join()
    except Exception as e:
        print(e)

这里,你们可能注意到了单独运行该模块可以同时运行两个窗口,这里蹦来是想要同时形成一个爱心矩阵播放动图来着的,但是这里比较麻烦,就算了,有兴趣的话你们可以试试。

(这里没有调好窗口位置)

主控程序

也就是main函数,来,继续上代码。

import set_p_w ,image_c,Fold_win
from PIL import Image
import time
import tkinter as tk
import playsound
import os

import threading
def star_inital():
    try:
        sign_mark_0=r'D:\Confession\image\use.gif'

        sign_mark_1=r'D:\Confession\words'
        def do_fist():
            if not os.path.exists(sign_mark_0):

                image_c.watermark_on_gif(r'D:\Confession\image\1.gif',r'D:\Confession\image\use.gif','XIA MENG I COMING!')

        def do_secend():
            if not os.path.exists(sign_mark_1):



                set_p_w.get_iamges()
        def do_third():
            if not os.path.exists(sign_mark_1):
                set_p_w.get_iamges()

        Tade=[]

        t_1=threading.Thread(target=do_fist)
        Tade.append(t_1)
        t_2=threading.Thread(target=do_secend)
        Tade.append(t_2)
        t_3=threading.Thread(target=do_third)
        Tade.append(t_3)

        for t in Tade:
            t.setDaemon(True)
            t.start()
        t_1.join()
        t_2.join()
        t_3.join()
    except Exception as e:
        print(e)

def word_read():

    with open(r'D:\Confession\words\word.love','r',encoding='utf-8') as w:
        word_=w.read()
        safe={}
        word_=eval(word_,safe)
        w.close()
    #print(word_)
    bad_word='<span class="bjh-br"'
    word=[]

    for wo_ in word_:
        if bad_word in wo_ :
            wo_=wo_.replace(bad_word,' ')
            wo_=wo_.replace(',','\n')
            wo_=wo_+'\n BY_HUTEROX(可删去)'

            word.append(wo_)
        else:
            wo_ = wo_.replace(',', '\n')
            #print(wo_)
            wo_ = wo_ + '\n BY_HUTEROX(可删去)'

            word.append(wo_)
    #print(word)
    return word


star_inital()
'''完成初始化这里请注意 D:\Confession\image\1.gif 需要自己额外下载,其余的可以通过爬虫自动下载'''




def show():

    pic_n=0
    path_u=r'D:\Confession\image_add_w\mark_image.png'
    word=word_read()
    for text in word:

        path = 'D:\\Confession\\image\\' + str(pic_n) + '.jpg'
        pic_n+=1
        im_test = Image.open(path)
        im_t = image_c.add_word(im_test, text)
        im_t.save(path_u)
        image_c.setWallPaper(path_u,0)
        time.sleep(4)#参数可调

    Fold_win.root_show(2, 2,600, 600,r'D:\Confession\image\use.gif',tk.Tk())
    time.sleep(10)



def play_sound():
    path=r'D:\Confession\music\music.mp3'
    playsound.playsound(path)

#play_sound()
def go():
    Tade_=[]
    tx_1=threading.Thread(target=show)
    Tade_.append(tx_1)
    tx_2=threading.Thread(target=play_sound)
    Tade_.append(tx_2)
    for x in Tade_:
        x.setDaemon(True)
        x.start()
    tx_1.join()
    #tx_2.join()二选一

go()



这里要提醒一下,就是star_inital()函数,它的作用就是初始化(本来是定义了一个类的,比较懒写了个函数。)把相应的要使用的媒体资源加载好。但是有时候会出问题。所以你可以先把其他的模块运行一遍,再跑一遍主函数。
这里还有一个MP3文件要注意一下。

这玩意,也就是背景音乐。哦对了,你还可以自己再写一个计时,先让主程序运行,然后程序计时,等你女票来了刚刚好运行效果。(PS:本人严格遵守《中学生行为规范》)

SUMMARY:

时间有限,水平有限,如有不足多多指教!
码源地址:
链接:https://pan.baidu.com/s/1X9pstnTI3X3qUZeERXILiQ
提取码:i0o2


转载:https://blog.csdn.net/FUTEROX/article/details/106163416
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场