当前位置:   article > 正文

桌面宠物python_python桌宠代码

python桌宠代码

  1. import os
  2. import sys
  3. import random
  4. from PyQt5.QtGui import *
  5. from PyQt5.QtCore import *
  6. from PyQt5.QtWidgets import *
  7. class DesktopPet(QWidget):
  8. def __init__(self, parent=None, **kwargs):
  9. super(DesktopPet, self).__init__(parent)
  10. # 窗体初始化
  11. self.init()
  12. # 托盘化初始
  13. self.initPall()
  14. # 宠物静态gif图加载
  15. self.initPetImage()
  16. # 宠物正常待机,实现随机切换动作
  17. self.petNormalAction()
  18. # 窗体初始化
  19. def init(self):
  20. # 初始化
  21. # 设置窗口属性:窗口无标题栏且固定在最前面
  22. # FrameWindowHint:无边框窗口
  23. # WindowStaysOnTopHint: 窗口总显示在最上面
  24. # SubWindow: 新窗口部件是一个子窗口,而无论窗口部件是否有父窗口部件
  25. # https://blog.csdn.net/kaida1234/article/details/79863146
  26. self.setWindowFlags(Qt.FramelessWindowHint | Qt.WindowStaysOnTopHint | Qt.SubWindow)
  27. # setAutoFillBackground(True)表示的是自动填充背景,False为透明背景
  28. self.setAutoFillBackground(False)
  29. # 窗口透明,窗体空间不透明
  30. self.setAttribute(Qt.WA_TranslucentBackground, True)
  31. # 重绘组件、刷新
  32. self.repaint()
  33. # 托盘化设置初始化
  34. def initPall(self):
  35. # 导入准备在托盘化显示上使用的图标
  36. icons = os.path.join('tigerIcon.jpg')
  37. # 设置右键显示最小化的菜单项
  38. # 菜单项退出,点击后调用quit函数
  39. quit_action = QAction('退出', self, triggered=self.quit)
  40. # 设置这个点击选项的图片
  41. quit_action.setIcon(QIcon(icons))
  42. # 菜单项显示,点击后调用showing函数
  43. showing = QAction(u'显示', self, triggered=self.showwin)
  44. # 新建一个菜单项控件
  45. self.tray_icon_menu = QMenu(self)
  46. # 在菜单栏添加一个无子菜单的菜单项‘退出’
  47. self.tray_icon_menu.addAction(quit_action)
  48. # 在菜单栏添加一个无子菜单的菜单项‘显示’
  49. self.tray_icon_menu.addAction(showing)
  50. # QSystemTrayIcon类为应用程序在系统托盘中提供一个图标
  51. self.tray_icon = QSystemTrayIcon(self)
  52. # 设置托盘化图标
  53. self.tray_icon.setIcon(QIcon(icons))
  54. # 设置托盘化菜单项
  55. self.tray_icon.setContextMenu(self.tray_icon_menu)
  56. # 展示
  57. self.tray_icon.show()
  58. # 宠物静态gif图加载
  59. def initPetImage(self):
  60. # 对话框定义
  61. self.talkLabel = QLabel(self)
  62. # 对话框样式设计
  63. self.talkLabel.setStyleSheet("font:15pt '楷体';border-width: 1px;color:blue;")
  64. # 定义显示图片部分
  65. self.image = QLabel(self)
  66. # QMovie是一个可以存放动态视频的类,一般是配合QLabel使用的,可以用来存放GIF动态图
  67. self.movie = QMovie("normal/normal1.gif")
  68. # 设置标签大小
  69. self.movie.setScaledSize(QSize(200, 200))
  70. # 将Qmovie在定义的image中显示
  71. self.image.setMovie(self.movie)
  72. self.movie.start()
  73. self.resize(1024, 1024)
  74. # 调用自定义的randomPosition,会使得宠物出现位置随机
  75. self.randomPosition()
  76. # 展示
  77. self.show()
  78. # https://new.qq.com/rain/a/20211014a002rs00
  79. # 将宠物正常待机状态的动图放入pet1中
  80. self.pet1 = []
  81. for i in os.listdir("normal"):
  82. self.pet1.append("normal/" + i)
  83. # 将宠物正常待机状态的对话放入pet2中
  84. self.dialog = []
  85. # 读取目录下dialog文件
  86. with open("dialog.txt", "r") as f:
  87. text = f.read()
  88. # 以\n 即换行符为分隔符,分割放进dialog中
  89. self.dialog = text.split("\n")
  90. # 宠物正常待机动作
  91. def petNormalAction(self):
  92. # 每隔一段时间做个动作
  93. # 定时器设置
  94. self.timer = QTimer()
  95. # 时间到了自动执行
  96. self.timer.timeout.connect(self.randomAct)
  97. # 动作时间切换设置
  98. self.timer.start(3000)
  99. # 宠物状态设置为正常
  100. self.condition = 0
  101. # 每隔一段时间切换对话
  102. self.talkTimer = QTimer()
  103. self.talkTimer.timeout.connect(self.talk)
  104. self.talkTimer.start(3000)
  105. # 对话状态设置为常态
  106. self.talk_condition = 0
  107. # 宠物对话框
  108. self.talk()
  109. # 随机动作切换
  110. def randomAct(self):
  111. # condition记录宠物状态,宠物状态为0时,代表正常待机
  112. if not self.condition:
  113. # 随机选择装载在pet1里面的gif图进行展示,实现随机切换
  114. self.movie = QMovie(random.choice(self.pet1))
  115. # 宠物大小
  116. self.movie.setScaledSize(QSize(200, 200))
  117. # 将动画添加到label中
  118. self.image.setMovie(self.movie)
  119. # 开始播放动画
  120. self.movie.start()
  121. # condition不为0,转为切换特有的动作,实现宠物的点击反馈
  122. # 这里可以通过else-if语句往下拓展做更多的交互功能
  123. else:
  124. # 读取特殊状态图片路径
  125. self.movie = QMovie("./click/click.gif")
  126. # 宠物大小
  127. self.movie.setScaledSize(QSize(200, 200))
  128. # 将动画添加到label中
  129. self.image.setMovie(self.movie)
  130. # 开始播放动画
  131. self.movie.start()
  132. # 宠物状态设置为正常待机
  133. self.condition = 0
  134. self.talk_condition = 0
  135. # 宠物对话框行为处理
  136. def talk(self):
  137. if not self.talk_condition:
  138. # talk_condition为0则选取加载在dialog中的语句
  139. self.talkLabel.setText(random.choice(self.dialog))
  140. # 设置样式
  141. self.talkLabel.setStyleSheet(
  142. "font: bold;"
  143. "font:25pt '楷体';"
  144. "color:white;"
  145. "background-color: white"
  146. "url(:/)"
  147. )
  148. # 根据内容自适应大小
  149. self.talkLabel.adjustSize()
  150. else:
  151. # talk_condition为1显示为别点我,这里同样可以通过if-else-if来拓展对应的行为
  152. self.talkLabel.setText("别点我")
  153. self.talkLabel.setStyleSheet(
  154. "font: bold;"
  155. "font:25pt '楷体';"
  156. "color:white;"
  157. "background-color: white"
  158. "url(:/)"
  159. )
  160. self.talkLabel.adjustSize()
  161. # 设置为正常状态
  162. self.talk_condition = 0
  163. # 退出操作,关闭程序
  164. def quit(self):
  165. self.close()
  166. sys.exit()
  167. # 显示宠物
  168. def showwin(self):
  169. # setWindowOpacity()设置窗体的透明度,通过调整窗体透明度实现宠物的展示和隐藏
  170. self.setWindowOpacity(1)
  171. # 宠物随机位置
  172. def randomPosition(self):
  173. # screenGeometry()函数提供有关可用屏幕几何的信息
  174. screen_geo = QDesktopWidget().screenGeometry()
  175. # 获取窗口坐标系
  176. pet_geo = self.geometry()
  177. width = (screen_geo.width() - pet_geo.width()) * random.random()
  178. height = (screen_geo.height() - pet_geo.height()) * random.random()
  179. self.move(width, height)
  180. # 鼠标左键按下时, 宠物将和鼠标位置绑定
  181. def mousePressEvent(self, event):
  182. # 更改宠物状态为点击
  183. self.condition = 1
  184. # 更改宠物对话状态
  185. self.talk_condition = 1
  186. # 即可调用对话状态改变
  187. self.talk()
  188. # 即刻加载宠物点击动画
  189. self.randomAct()
  190. if event.button() == Qt.LeftButton:
  191. self.is_follow_mouse = True
  192. # globalPos() 事件触发点相对于桌面的位置
  193. # pos() 程序相对于桌面左上角的位置,实际是窗口的左上角坐标
  194. self.mouse_drag_pos = event.globalPos() - self.pos()
  195. event.accept()
  196. # 拖动时鼠标图形的设置
  197. self.setCursor(QCursor(Qt.OpenHandCursor))
  198. # 鼠标移动时调用,实现宠物随鼠标移动
  199. def mouseMoveEvent(self, event):
  200. # 如果鼠标左键按下,且处于绑定状态
  201. if Qt.LeftButton and self.is_follow_mouse:
  202. # 宠物随鼠标进行移动
  203. self.move(event.globalPos() - self.mouse_drag_pos)
  204. event.accept()
  205. # 鼠标释放调用,取消绑定
  206. def mouseReleaseEvent(self, event):
  207. self.is_follow_mouse = False
  208. # 鼠标图形设置为箭头
  209. self.setCursor(QCursor(Qt.ArrowCursor))
  210. # 鼠标移进时调用
  211. def enterEvent(self, event):
  212. # 设置鼠标形状 Qt.ClosedHandCursor 非指向手
  213. self.setCursor(Qt.ClosedHandCursor)
  214. # 宠物右键点击交互
  215. def contextMenuEvent(self, event):
  216. # 定义菜单
  217. menu = QMenu(self)
  218. # 定义菜单项
  219. quitAction = menu.addAction("退出")
  220. hide = menu.addAction("隐藏")
  221. # 使用exec_()方法显示菜单。从鼠标右键事件对象中获得当前坐标。mapToGlobal()方法把当前组件的相对坐标转换为窗口(window)的绝对坐标。
  222. action = menu.exec_(self.mapToGlobal(event.pos()))
  223. # 点击事件为退出
  224. if action == quitAction:
  225. qApp.quit()
  226. # 点击事件为隐藏
  227. if action == hide:
  228. # 通过设置透明度方式隐藏宠物
  229. self.setWindowOpacity(0)
  230. if __name__ == '__main__':
  231. # 创建了一个QApplication对象,对象名为app,带两个参数argc,argv
  232. # 所有的PyQt5应用必须创建一个应用(Application)对象。sys.argv参数是一个来自命令行的参数列表。
  233. app = QApplication(sys.argv)
  234. # 窗口组件初始化
  235. pet = DesktopPet()
  236. # 1. 进入时间循环;
  237. # 2. wait,直到响应app可能的输入;
  238. # 3. QT接收和处理用户及系统交代的事件(消息),并传递到各个窗口;
  239. # 4. 程序遇到exit()退出时,机会返回exec()的值。
  240. sys.exit(app.exec_())

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/657558
推荐阅读
相关标签
  

闽ICP备14008679号