效果图


前言

我一直在用python 写一下有趣的东西,让编程不那么无聊,之前一直有写一个桌面宠物的想法,无奈这些都是依赖资源文件,没有图片资源没办法写里面的逻辑,直到我看见了 shimiji手机桌面宠物软件


这个软件提供了很多宠物的图片资源,这样就简单了,用 charles 对手机简单抓包,抓取到这些资源链接
http://pepeswap.com/mascot/78
另外示例图片链接
http://pepeswap.com/thumb/78
这里是78,其实号码从 3 到90 都是有资源的,就是没有1,2(1,2是软件内置的)
所以这里一共有 90-3+1=88个资源,这下子图片资源就解决了
然后编写代码

代码

先写一个管理这些资源的软件

import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
import requests
import threading
import os
import zipfile
from PIL import Imageclass Workchange(QThread):"""docstring for WorkThread"""change_done = pyqtSignal()def __init__(self):super(Workchange, self).__init__()def run(self):url = self.urlname = url.split('/')[-1] + '.zip'print('正在下载资源',name)data = requests.get(url).contentwith open(name,'wb') as f:f.write(data)print('下载完成!')path = os.environ['HOME']+'/shimeji/'if not os.path.exists(path):os.makedirs(path)print('正在解压资源...')z = zipfile.ZipFile(name, 'r')z.extractall(path=path)z.close()for i in range(1,47):os.rename(path + 'shime%s.png'% str(i),path+str(i)+'.png')pri_image = Image.open(path+'%s.png' %str(i))pri_image.transpose(Image.FLIP_LEFT_RIGHT).save(path+'-%s.png'%str(i))for i in os.listdir(path):os.system('convert %s %s'%(path+i,path+i))print('解压完成')os.remove(name)self.change_done.emit()class Workinit(QThread):"""docstring for WorkThread"""init_done = pyqtSignal(dict)def __init__(self):super(Workinit, self).__init__()def run(self):for i in range(3,90):threading.Thread(target=self.load,args=(i,)).start()def load(self,i):url = ''' http://pepeswap.com/thumb/%s''' %str(i)data  = requests.get(url).contentname = str(i)dict_data = dict(data=data,name=name)self.init_done.emit(dict_data)class DQListWidget(QListWidget):def __init__(self):super(DQListWidget, self).__init__()self.workinit = Workinit()self.workchange = Workchange()self.workchange.change_done.connect(self.change_done)self.workinit.init_done.connect(self.load_picture)self.workinit.start()self.itemDoubleClicked.connect(self.change)def change_done(self):QMessageBox.about(self,'提示','更换完成!(*>﹏<*)')def change(self,item):self.workchange.url = 'http://pepeswap.com/mascot/' + item.text()self.workchange.start()def load_picture(self,dict_data):        item = QListWidgetItem(dict_data['name'])item.setSizeHint(QSize(10, 128))self.addItem(item)pixmap = QPixmap()label = QLabel()pixmap.loadFromData(dict_data['data'])label.setPixmap(pixmap)self.setItemWidget(item,label)class Mywin(QWidget):def __init__(self):super(Mywin, self).__init__()list_ = DQListWidget() layout = QVBoxLayout(self)layout.addWidget(list_) self.setLayout(layout) app = QApplication(sys.argv)
mywin = Mywin() # 实例化一个窗口小部件
mywin.setWindowTitle('Hello world!') # 设置窗口标题
mywin.show() #显示窗口
sys.exit(app.exec())

这个程序双击列表中的条目即可下载并更换对应的宠物图片资源

主程序

import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
import time
import random
import osdef random_probability(r):s = random.randint(1,100)if r >= s:return Trueelse:return Falseclass Donghua(QWidget):def __init__(self):super(Donghua, self).__init__()self.desktop = QApplication.desktop()self.screenRect = self.desktop.screenGeometry()self.HEIGHT = self.screenRect.height()self.WIDTH = self.screenRect.width()self.setWindowFlags(Qt.FramelessWindowHint)# self.setWindowFlags(Qt.SplashScreen)self.setAttribute(Qt.WA_TranslucentBackground)self.timer = QTimer()self.timer.timeout.connect(self.update)self.img_timer = QTimer()self.img_timer.timeout.connect(self.update_img)self.label = QLabel(self)self.label.setScaledContents(True)layout = QVBoxLayout(self)layout.addWidget(self.label)self.setLayout(layout)self.index = 0self.x = 0self.is_right = Trueself.m_flag = Falseself.action_dcit = {'left_go':(1,3),'right_go':(-3,-1),'left_hold':(5,7),'right_hold':(-7,-5),'left_release':(4,4),'right_release':(-4,-4),'left_down':(18,19),'right_down':(-19,-18),'left_crawl':(12,14),'right_crawl':(-14,-12),# 'left_rest':(15,17),# 'right_rest':(-17,-15),'left_rest':(26,27),'right_rest':(-27,-26),'left_rest2':(27,29),'right_rest2':(-29,-27),}self.action = 'right_release'self.pre_action = ''# 控制窗体移动及各种动作切换计时器self.timer.start(100)# 控制图片切换计时器self.img_timer.start(200)#监听鼠标动作def mousePressEvent(self, event):x = (event.globalPos()-self.pos()).x()y = (event.globalPos()-self.pos()).y()if event.button() == Qt.LeftButton and x < 128 and y < 128:self.m_flag = Trueself.m_Position = event.globalPos()-self.pos()  # 获取鼠标相对窗口的位置event.accept()if self.is_right:self.action='right_hold'else:self.action='left_hold'self.setCursor(QCursor(Qt.OpenHandCursor))def mouseMoveEvent(self, QMouseEvent):if Qt.LeftButton and self.m_flag:self.move(QMouseEvent.globalPos()-self.m_Position)  # 更改窗口位置QMouseEvent.accept()#鼠标左键释放def mouseReleaseEvent(self, QMouseEvent):self.m_flag = Falseif self.is_right:self.action = 'right_release'else:self.action = 'left_release'#手动将其放入屏幕边缘if self.x <= 0 and self.y > 0:self.action = 'left_crawl'elif self.x + self.width >= self.WIDTH and self.y > 0:self.action = 'right_crawl'self.setCursor(QCursor(Qt.ArrowCursor))#动作更新def update(self):self.width = self.geometry().width()self.height = self.geometry().height()self.x = self.geometry().x()self.y = self.geometry().y()# print(self.x,self.y)exec('self.%s()'% self.action)def right_crawl(self):if self.y > 0:self.y -= 10self.setGeometry(self.x,self.y,100,100)else:self.action = 'right_release'def left_crawl(self):if self.y > 0:self.y -= 10self.setGeometry(self.x,self.y,100,100)else:self.action = 'left_release'def right_down(self):if self.index+1 == self.action_dcit[self.action][1]:self.action = 'right_go'def left_down(self):if self.index+1 == self.action_dcit[self.action][1]:self.action = 'left_go'def right_release(self):if self.y + self.height > self.HEIGHT:self.action = 'right_down'else:self.action = 'right_release'self.y += 100self.setGeometry(self.x,self.y,100,100)def left_release(self):if self.y + self.height > self.HEIGHT:self.action = 'left_down'else:self.action = 'left_release'self.y += 100self.setGeometry(self.x,self.y,100,100)def right_go(self):self.x += 5self.action = 'right_go'if self.x + self.width> self.WIDTH:if random_probability(30):self.action = 'right_crawl'else:self.is_right = Falseself.action = 'left_go'if random_probability(1):self.action = 'right_rest'self.setGeometry(self.x,self.y,100,100)def left_go(self):self.x -= 5self.action = 'left_go'if self.x < 0:if random_probability(30):self.action = 'left_crawl'else:self.is_right = Trueself.action = 'right_go'if random_probability(1):self.action = 'left_rest'self.setGeometry(self.x,self.y,100,100)def right_rest(self):if random_probability(1):self.action = 'right_go'def left_rest(self):if random_probability(1):self.action = 'left_go'def right_hold(self):passdef left_hold(self):pass#更新图片def update_img(self):start_index,end_index = self.action_dcit[self.action]if self.pre_action != self.action:self.index = start_indexself.pre_action = self.actionif self.index == end_index:self.index = start_indexelse:self.index += 1q = QPixmap(path +'%s.png' % self.index)self.label.setPixmap(q)if __name__ == '__main__':path = os.environ['HOME']+'/shimeji/'app = QApplication(sys.argv)mywin = Donghua()mywin.show()sys.exit(app.exec())

写一个linux平台的桌面宠物相关推荐

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

    好的,我们可以用 JavaScript 写一个聊天桌面宠物.首先,我们需要使用 JavaScript 的 GUI 库,比如 Electron 或 NW.js 来创建一个桌面应用程序.然后,我们可以使用 ...

  2. 烧写linux内核的步骤,启动redboot后,向目标机烧写一个linux内核的全过程

    命令说明 对一个没有内核和根文件系统的板子是不可以运转的,当通过一种方式下载了RedBoot引导程序以后,我们可以通过下面的方式下载内核和根文件系统. 在本系统中,我们对内核和根文件系统的下载是通过t ...

  3. Linux打包软件版本带时间,带你写一个 linux 下的打包软件 tar

    相信你对 linux 的 .tar.gz 有点熟悉,这就是先 tar 打包(.tar 后缀),再对此 tar 文件用 gzip 压缩(.tar.gz)的后缀名. 值得注意的是, tar 不是压缩软件, ...

  4. 如何写一个Linux精灵进程

    --Devin Watson 这个文档演示了如何使用gcc在linux中写一个精灵进程,使用这篇文档的前提是有Linux的知识和熟悉C语言.这篇文档的版权者是Devin Watson,使用BSD协议. ...

  5. 写一个Linux下搭建Discuz论坛的全过程教程。

    本例使用的Linux系统为:RHEL5.3. 1.[root@linux ~]# mkdir /mnt/cdrom 2.[root@linux ~]# mount /dev/cdrom /mnt/cd ...

  6. vue vue-router vuex element-ui axios 写一个代理平台的学习笔记(十一)构思商品页面...

    在写商品页面product.vue之前,我应该思考一下,商品页面要实现那些功能,该不如布局? 要实现的功能 1.所有商品列表的展示 2.分类商品的列表展示 3.搜索商品或得列表展示 4.单一商品的详细 ...

  7. 利用有道云笔记接口写一个多端同步桌面便签

    软件下载地址 源码和打包后的软件 软件效果图 功能 1.利用有道云笔记的云端实现多端同步. 2.多个便签切换主题,背景颜色和字体颜色都有6种颜色可选.并可以记录单个便签选择的配色. 3.记录每一个便签 ...

  8. element ui登录界面_vue vue-router vuex element-ui axios 写一个代理平台的学习笔记(四)美化头部和登录界面...

    美化头部header.vue 找张头像当用户头像 在写点css来美化一下头部,完善一下现在能完成的功能 header.vue :default-active="$route.path&quo ...

  9. 如何成为一个Linux内核开发者

    你想成知道如何成为一个Linux内核开发者么?或者你的老板告诉你,"去为这个设备写一个Linux驱动."这篇文档的目的,就是通过描述你需要经历的过程和提示你如何和社区一起工作,来教 ...

最新文章

  1. 《Java程序设计》实验报告——Java的对象与类
  2. C语言用循环写出新年祝福语图案,非常漂亮的新年祝福!C语言实现漂亮的烟花效果...
  3. 《C++ Primer 第五版》(第4.11-4.12节)——static_cast,const_cast和reinterpret_cast类型转换, 运算符优先级表
  4. 前端学习(1295):第三方模块npm
  5. HDU2564 词组缩写【文本】
  6. class文件如何在linux下打开_Linux下文件的三个时间属性
  7. windows控制台cmd乱码的解决办法
  8. 清华大数据,365天我们持续在发声——数据院四周年系列报道之传播篇
  9. win7下笔记本电脑给手机开热点
  10. ps入门教程、ps修图基本工具使用方法视频教学
  11. PyTorch实现非极大值抑制(NMS)
  12. lisp倒入excel数据画图_将excel数据导入CAD画图的方法
  13. python手机编译器怎么编写程序_怎么用手机编写Python程序?
  14. 自适应波束形成(四)——Frost波束形成1
  15. IllegalArgumentException: mapper [signStatus] of different type, current_typ
  16. HTML中的水平布局
  17. php 类似于趣步,完整数据全开源早起打卡项目趣步模式源码
  18. 程序员真的是吃青春饭吗?分享我的6点面试经验,分分钟搞定!
  19. 三星N9109W刷机教程(线刷官方固件rom包)
  20. c语言通讯录论文免费下载,C语言通讯录程序设计.doc

热门文章

  1. 阿里P8面试扯了半小时:Java的Lock接口到底有什么用?
  2. 石油大--Contest2022 - 2020年秋季组队训练赛第二场--17100 Problem D、Find String in a Grid (AC自动机)
  3. jsb调用java_cocos2d-js 3.0 jsb环境调用底层java代码
  4. c.k.沉珂 的所有资料
  5. 在word中使用vba遍历Range对象的Characters
  6. 酷乐天气开发记录总结6
  7. android 酷狗demo_Android仿酷狗音乐自定义侧滑菜单控件简单实现
  8. 软件工程师与硬件工程师谁更有发展优势
  9. android平分布局的隐藏,Android布局 平分界面
  10. go struct标签详解