python tkinter实现桌面宠物

news/2024/11/25 5:32:22/

桌面宠物其实也就是在桌面自动播放动态图,在这基础上我添加了四处设计:

  1. 左键单击随机切换gif
  2. 左键长按拖动
  3. 滑轮修改播放速度
  4. 将gif和代码打包到一个exe
    其中第四步将gif转为二进制字节流,并添加到py文件中,转换代码如下
import os
import io
from PIL import Imageall_file = os.listdir()
for file in all_file:if file.endswith('.gif'):real_name = file[:-4]gif_frames = Image.open(file)write_data = "{}=[".format(real_name)for idx,frame in enumerate(ImageSequence.Iterator(gif_frames)):imgByteArr = io.BytesIO()  frame.save(imgByteArr, format='PNG')  imgByteArr = imgByteArr.getvalue()  write_data = write_data + "%s," % (imgByteArr)write_data = write_data + '{}]\n'.format(frame.info['duration'])f = open("all_image.py","a+")f.write(write_data)f.close()

该代码遍历了当前路径下的所有以".gif"结尾的文件,并把gif逐帧转换成png,转为字节流后保存到一个列表,并且列表的最后一个元素记录了每一帧的持续时间。(我尝试直接保存gif,但在使用时仅展示了第一帧,且保存的py文件也远小于所有gif的大小,因此才选择了逐帧保存的方案)
保存的py文件如下所示
在这里插入图片描述
引用以上方法创建的all_image.py,完整代码如下:

from tkinter import *
import io
from PIL import Image,ImageTk
from all_image import *
import randomTRANSCOLOUR = 'gray'
class MyPet():def __init__(self):self.root = Tk()#窗口坐标self.root_x=500self.root_y=150self.root.geometry('200x200+{}+{}'.format(self.root_x,self.root_y))#窗口置顶self.root.attributes('-topmost',1)#设置透明self.root.wm_attributes('-transparentcolor', TRANSCOLOUR)#隐藏边框self.root.overrideredirect(True)#鼠标点击坐标self.press_x = 0self.press_y = 0self.root.bind("<ButtonPress-1>", self.start_move)self.root.bind("<B1-Motion>", self.on_motion)self.root.bind("<ButtonRelease-1>", self.end_move)self.root.bind("<MouseWheel>",self.change_duration)#当前播放帧数self.frame_idx = 0#加载gifgif_name = [gif1,gif2,gif3,gif4,gif5]self.normal_frames_list = []self.normal_duration_list = []for temp_gif in gif_name:temp_frames,temp_duration = self.get_tk_image(temp_gif)self.normal_frames_list.append(temp_frames)self.normal_duration_list.append(temp_duration)self.float_frames,self.float_duration = self.get_tk_image(gif6)self.normal_frames = self.normal_frames_list.pop(0)self.normal_duration = self.normal_duration_list.pop(0)#当前gif速度self.cur_duration = self.normal_duration#当前播放gifself.cur_frames = self.normal_frames#当前状态self.pet_state = 'normal'self.root.after(0, self.update) # 立即启动定时器函数(update)#添加画板self.canvas = Canvas(self.root,borderwidth=0,highlightthickness=0)self.canvas.pack(fill=BOTH, expand=Y)self.last_rect = self.canvas.create_rectangle(0, 0, 200, 200, fill=TRANSCOLOUR,)self.last_image = self.canvas.create_image(0,0,image=self.cur_frames[0],anchor='nw')self.root.mainloop()def start_move(self,event):#鼠标左键单击self.press_x = event.x_rootself.press_y = event.y_rootdef end_move(self,event):#鼠标释放if self.pet_state=='float':self.change_state('normal')elif self.pet_state=='normal':self.change_state('change')def on_motion(self,event):#鼠标左键单击并移动if self.pet_state!='float':self.change_state('float')else:passdeltax = event.x_root - self.press_xdeltay = event.y_root - self.press_yself.press_x = self.press_x + deltaxself.press_y = self.press_y + deltayself.root_x = self.root_x + deltaxself.root_y = self.root_y + deltayself.root.geometry("+%s+%s" % (self.root_x,self.root_y))def change_state(self,state):#修改pet状态self.pet_state = stateself.frame_idx = 0if self.pet_state == 'float':self.cur_frames = self.float_framesself.cur_duration = self.float_durationelif self.pet_state == 'normal':self.cur_frames = self.normal_framesself.cur_duration = self.normal_durationelif self.pet_state == 'change':#随机更换giftemp_n = random.choice(range(len(self.normal_frames_list)))temp_frames = self.normal_framestemp_duration = self.normal_durationself.normal_frames = self.normal_frames_list.pop(temp_n)self.normal_duration = self.normal_duration_list.pop(temp_n)self.cur_frames = self.normal_framesself.cur_duration = self.normal_durationself.normal_frames_list.append(temp_frames)self.normal_duration_list.append(temp_duration)self.pet_state = 'normal'def change_duration(self,event):#鼠标滑轮if event.delta>0:if self.cur_duration<=10:returnelse:self.cur_duration-=5else:self.cur_duration+=5   def get_tk_image(self,gif):#从字节流获取图像和durationgif_frames = []for temp_png in gif[:-1]:bytes_stream = io.BytesIO(temp_png)gifimg = Image.open(bytes_stream)roiimg = ImageTk.PhotoImage(gifimg)gif_frames.append(roiimg)return gif_frames,gif[-1]def update(self): # 定时器函数frame = self.cur_frames[self.frame_idx]self.frame_idx += 1if self.frame_idx>=len(self.cur_frames):self.frame_idx=0self.canvas.delete(self.last_rect)self.canvas.delete(self.last_image)self.last_rect = self.canvas.create_rectangle(0, 0, 200, 200, fill=TRANSCOLOUR, outline=TRANSCOLOUR)self.last_image = self.canvas.create_image(0,0,image=frame,anchor='nw')self.root.after(self.cur_duration, self.update) # 0.1秒(100毫秒)之后继续执行定时器函数(update)if __name__=='__main__':mypet = MyPet()

此时使用以下命令打包时将生成一个独立运行的exe

pyinstaller -F -w tkinter_gif.py

效果如下
请添加图片描述


http://www.ppmy.cn/news/551414.html

相关文章

基于Qt实现桌面宠物

a总体效果 主要功能 可以通过设置进行桌面壁纸的切换&#xff1b;点击天气按钮可查看实时天气&#xff1b;显示实时时间 部分代码 widget.h #pragma once#include <QWidget> #include <QPixmap> #include<qlabel.h> #include<QPushButton> #inclu…

Python实现可以语音聊天的桌面宠物程序

目录 简介 程序 源代码 GUI DesktopWife.py MusicPlayer.py WeatherGui.py 语音 简介 普通的桌面宠物程序只能动一动&#xff0c;于是我给程序添加了语言&#xff0c;既可以聊天&#xff0c;也可以实现一些自动功能&#xff0c;不如搜索&#xff0c;打开程序什么的。 程序…

Android-APP之桌面宠物

Android-APP之桌面宠物 源码&#xff1a;https://github.com/benxhinGH/Desktopet.git 本是需要研究android-app漏洞挖掘&#xff0c;那前提就是要先了解android-app的内部原理。于是开始上手学习android-app&#xff0c;借机参加了腾讯提供的android移动开发课程。 这个app主…

python桌面宠物模块_利用python写个桌面挂件 | 手把手带大家做只桌面宠物呗

导语 前段时间有小伙伴留言说想让我带大家写写桌面小挂件&#xff0c;今天就满足一下留过类似言的小伙伴的请求呗~不过感觉写桌面的挂历啥的没意思&#xff0c;就简单带大家做一只桌面宠物吧~ 废话不多说&#xff0c;让我们愉快地开始吧~ 开发工具Python版本&#xff1a;3.6.4 …

用JavaScript写一个可以聊天的桌面宠物

好的,我们可以用 JavaScript 写一个聊天桌面宠物。首先,我们需要使用 JavaScript 的 GUI 库,比如 Electron 或 NW.js 来创建一个桌面应用程序。然后,我们可以使用文本输入框和文本框来构建聊天界面。我们可以使用 JavaScript 来处理用户输入,并使用语言处理库来解析用户的…

STM32实现延时

在STM32单片机中&#xff0c;实现延时一般都是使用定时器&#xff0c;既可以使用Systick定时器&#xff0c;也可以使用常规的定时器。 定时器在设置了定时并开启之后&#xff0c;就会进入自主运行模式&#xff0c;其中&#xff0c;初始化设置这一阶段是由CPU执行相应指令完成的…

linux桌面宠物

环境: ubuntu19.10 xfce4 步骤如下: python getpet.py(获取宠物动作图片) 然后会弹出来一个对话框&#xff0c;对话框里面你看中哪个宠物就用鼠标双击一下&#xff0c;然后终端就会开始下载这个宠物的图片 python start.py&#xff08;启动桌面宠物&#xff09; 小技巧: …

用QT实现一个简单的桌面宠物

有时候桌面空空的&#xff0c;或者屏幕空旷了&#xff0c;我们就可以找一点东西来点缀一下&#xff0c;那么桌面宠物是一个不错的选择。 作为一个程序猿&#xff0c;如何实现一个桌面宠物呢&#xff1f; 本文就给大家带来的是如何用qt提供一种思路并写一个简单的桌面宠物。 思…