怎么用python画皮卡丘,怎么用python画一个皮卡丘

  怎么用python画皮卡丘,怎么用python画一个皮卡丘

  本文主要介绍如何用Python制作一个可爱的皮卡丘桌面挂件宠物。文中的样例代码解释的很详细,有兴趣的可以看看。

  00-1010介绍开发工具的原理介绍和步骤实现

  

目录

  前段时间有个小伙伴留言说想让我带你写一个桌面小挂件。今天就满足一个留了类似留言的小伙伴的要求吧~但是感觉写桌面日历没意思,就干脆带你做桌面宠物吧~

  事不宜迟,我们愉快的开始吧~

  

导语

  Python版本:3.6.4

  相关模块:

  PyQt5模块;

  以及Python附带的一些模块

  

开发工具

  既然要写一个桌面宠物,当然首先要做的就是找宠物的图片。这里用的是手机APP shimiji的宠物图片素材,比如皮卡丘:

  我下载了大约60种宠物图片供你选择:

  所有相关文件都打包在一起提供,这里就不分享爬虫代码了(我挑出来的,只要不是我特别难看的基本都保留了)。不要给别人的服务器施加不必要的压力。

  接下来,我们可以开始设计我们的桌面宠物。鉴于网上用python写的桌面挂件基本都是基于tkinter的,为了突出微信官方账号的唯一性,这里我们用PyQt5来实现我们的桌面宠物。

  

原理简介

  首先,让我们初始化桌面宠物的小部件:

  class DesktopPet(QWidget):

  def __init__(self,parent=None,**kwargs):

  超级(DesktopPet,self)。__init__(父级)

  self.show()

  它的效果是这样的:

  接下来,让我们设置窗口的属性,使其更适合作为宠物窗口:

  #初始化

  self.setWindowFlags(Qt。FramelessWindowHint Qt。WindowStaysOnTopHintQt。子窗口)

  self . setautofilbackground(False)

  self.setAttribute(Qt。WA_TranslucentBackground,True)

  self.repaint()

  并随机导入一张宠物图片,看看运行效果:

  #随机导入宠物

  self.pet_images,icon path=self . randomloadpetimages()

  #当前显示的图片

  self.image=QLabel(self)

  self . setimage(self . pet _ images[0][0])

  随机导入宠物所有图片的功能代码实现如下:

  随机导入桌面宠物的所有图片

  def randomLoadPetImages(self):

  pet _ name=random . choice(list(CFG。PET_ACTIONS_MAP.keys()))

  动作=cfg。宠物_动作_地图[宠物_名字]

  pet_images=[]

  对于行动中的行动:

  pet _ images . append([self . loadimage(OS . path . join(CFG。ROOT_DIR,pet_name, shime item 。png )),用于行动中的项目])

  iconpath=os.path.join(cfg。ROOT_DIR,pet_name, shime1.png )

  返回宠物图片,图标路径

  当然,我们也希望每一次宠物出现在桌面上,都会更有趣:

  随机到屏幕上的某个位置

  def随机组合(自身):

  screen_geo=QDesktop

  Widget().screenGeometry()

   pet_geo = self.geometry()

   width = (screen_geo.width() - pet_geo.width()) * random.random()

   height = (screen_geo.height() - pet_geo.height()) * random.random()

   self.move(width, height)

  现在,运行我们的程序时,效果是这样子的:

  

  好像蛮不错的呢~等等,好像有问题,重新设置了窗口属性之后,这玩意咋退出啊?在宠物右上角加个×这样的符号又好像很奇怪?

  别急,我们可以给我们的桌面宠物添加一个托盘图标,以实现桌面宠物程序的退出功能:

  

# 设置退出选项

  quit_action = QAction(退出, self, triggered=self.quit)

  quit_action.setIcon(QIcon(iconpath))

  self.tray_icon_menu = QMenu(self)

  self.tray_icon_menu.addAction(quit_action)

  self.tray_icon = QSystemTrayIcon(self)

  self.tray_icon.setIcon(QIcon(iconpath))

  self.tray_icon.setContextMenu(self.tray_icon_menu)

  self.tray_icon.show()

  效果是这样子的:

  

  OK,这样好像有模有样了呢~但是好像还是不太对的样子,这宠物每次在桌面生成的位置是随机的,但是我们却无法调整这个宠物的位置,这显然不合理,作为一个桌面宠物,你肯定不能在妨碍主人工作的位置啊!要不我们来写一下鼠标按下、移动以及释放时的函数吧,这样就可以用鼠标拖动它了:

  

鼠标左键按下时, 宠物将和鼠标位置绑定

  def mousePressEvent(self, event):

   if event.button() == Qt.LeftButton:

   self.is_follow_mouse = True

   self.mouse_drag_pos = event.globalPos() - self.pos()

   event.accept()

   self.setCursor(QCursor(Qt.OpenHandCursor))

  鼠标移动, 则宠物也移动

  def mouseMoveEvent(self, event):

   if Qt.LeftButton and self.is_follow_mouse:

   self.move(event.globalPos() - self.mouse_drag_pos)

   event.accept()

  鼠标释放时, 取消绑定

  def mouseReleaseEvent(self, event):

   self.is_follow_mouse = False

   self.setCursor(QCursor(Qt.ArrowCursor))

  效果如下:

  

  哈哈,越来越像样了呢~最后,作为一个活泼的宠物,你不能这么呆板,一动也不动吧?好歹要学会做做表情逗主人开心吧?OK,我们先来设置一个定时器:

  

# 每隔一段时间做个动作

  self.timer = QTimer()

  self.timer.timeout.connect(self.randomAct)

  self.timer.start(500)

  定时器每隔一段时间切换一下选中的宠物的图片,以达到宠物做表情动作的动画效果(视频是一帧帧的图片组成的这种基础内容就不需要我来科普了吧T_T)。当然,这里我们必须对图片进行动作分类(在做同一个动作的图片属于同一类),保证宠物做表情动作时的连贯性。具体而言,代码实现如下:

  

随机做一个动作

  def randomAct(self):

   if not self.is_running_action:

   self.is_running_action = True

   self.action_images = random.choice(self.pet_images)

   self.action_max_len = len(self.action_images)

   self.action_pointer = 0

   self.runFrame()

  完成动作的每一帧

  def runFrame(self):

   if self.action_pointer == self.action_max_len:

   self.is_running_action = False

   self.action_pointer = 0

   self.action_max_len = 0

   self.setImage(self.action_images[self.action_pointer])

   self.action_pointer += 1

  OK,大功告成了~

  到此这篇关于用Python制作一个可以聊天的皮卡丘版桌面宠物的文章就介绍到这了,更多相关Python桌面宠物内容请搜索盛行IT软件开发工作室以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT软件开发工作室!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: