前言 之前在b站刷到了Capoo的视频,这猫猫也太好玩了哈哈,最近原作者做了一个桌宠app,但是付款方式只有paypel(据说价格挺贵),so自己搓一个?
PyQt5编写程序 虽然说一般python不适合写这类应用程序,但是以我C的能力还是算了hhh
目录结构 Capoo └ normal . └ normal1.gif . └ normal2.gif . └ normal3.gif . └ normal4.gif . └………….. └ click . └ click.gif └ main.py └ dialog.txt └ tigerIcon.jpg
注释:normal
文件夹包含需要随机显示的全部图片,程序启动时首先打开的是normal1.gif
,其他文件名随意,建议图片设置透明背景click.gif
是点击时显示的图片main.py
主程序dialog.txt
多行文本,随机显示的话,编码格式为GBKtigerIcon.jpg
状态栏显示的图标
python程序 main.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 import osimport sysimport randomfrom PyQt5.QtGui import *from PyQt5.QtCore import *from PyQt5.QtWidgets import *class DesktopPet (QWidget ): def __init__ (self, parent=None , **kwargs ): super (DesktopPet, self ).__init__(parent) self .init() self .initPall() self .initPetImage() self .petNormalAction() def init (self ): self .setWindowFlags(Qt.FramelessWindowHint | Qt.WindowStaysOnTopHint | Qt.SubWindow) self .setAutoFillBackground(False ) self .setAttribute(Qt.WA_TranslucentBackground, True ) self .repaint() def initPall (self ): icons = os.path.join('tigerIcon.jpg' ) quit_action = QAction('退出' , self , triggered=self .quit) quit_action.setIcon(QIcon(icons)) showing = QAction(u'显示' , self , triggered=self .showwin) self .tray_icon_menu = QMenu(self ) self .tray_icon_menu.addAction(quit_action) self .tray_icon_menu.addAction(showing) self .tray_icon = QSystemTrayIcon(self ) self .tray_icon.setIcon(QIcon(icons)) self .tray_icon.setContextMenu(self .tray_icon_menu) self .tray_icon.show() def initPetImage (self ): self .talkLabel = QLabel(self ) self .talkLabel.setStyleSheet("font:15pt '楷体';border-width: 1px;color:blue;" ) self .image = QLabel(self ) self .movie = QMovie("normal/normal1.gif" ) self .movie.setScaledSize(QSize(200 , 200 )) self .image.setMovie(self .movie) self .movie.start() self .resize(1024 , 1024 ) self .randomPosition() self .show() self .pet1 = [] for i in os.listdir("normal" ): self .pet1.append("normal/" + i) self .dialog = [] with open ("dialog.txt" , "r" ) as f: text = f.read() self .dialog = text.split("\n" ) def petNormalAction (self ): self .timer = QTimer() self .timer.timeout.connect(self .randomAct) self .timer.start(3000 ) self .condition = 0 self .talkTimer = QTimer() self .talkTimer.timeout.connect(self .talk) self .talkTimer.start(3000 ) self .talk_condition = 0 self .talk() def randomAct (self ): if not self .condition: self .movie = QMovie(random.choice(self .pet1)) self .movie.setScaledSize(QSize(200 , 200 )) self .image.setMovie(self .movie) self .movie.start() else : self .movie = QMovie("./click/click.gif" ) self .movie.setScaledSize(QSize(200 , 200 )) self .image.setMovie(self .movie) self .movie.start() self .condition = 0 self .talk_condition = 0 def talk (self ): if not self .talk_condition: self .talkLabel.setText(random.choice(self .dialog)) self .talkLabel.setStyleSheet( "font: bold;" "font:25pt '楷体';" "color:white;" "background-color: white" "url(:/)" ) self .talkLabel.adjustSize() else : self .talkLabel.setText("别摸我" ) self .talkLabel.setStyleSheet( "font: bold;" "font:25pt '楷体';" "color:white;" "background-color: white" "url(:/)" ) self .talkLabel.adjustSize() self .talk_condition = 0 def quit (self ): self .close() sys.exit() def showwin (self ): self .setWindowOpacity(1 ) def randomPosition (self ): screen_geo = QDesktopWidget().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) def mousePressEvent (self, event ): self .condition = 1 self .talk_condition = 1 self .talk() self .randomAct() 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)) def enterEvent (self, event ): self .setCursor(Qt.ClosedHandCursor) def contextMenuEvent (self, event ): menu = QMenu(self ) quitAction = menu.addAction("退出" ) hide = menu.addAction("隐藏" ) action = menu.exec_(self .mapToGlobal(event.pos())) if action == quitAction: qApp.quit() if action == hide: self .setWindowOpacity(0 ) if __name__ == '__main__' : app = QApplication(sys.argv) pet = DesktopPet() sys.exit(app.exec_())
pyinstaller将程序打包为exe 1 pyinstaller -F -w main.py
打包生成的main.exe
放到主目录下
制作安装程序 刚才打包为exe后是一个文件夹,分享给他人后需要解压之后启动main.exe,可是如果,我是说如果,你有一个女朋友,但是她连解压都不会,so最好做成一个Setup.exe
,打开连点下一步,安装之后直接一个桌面快捷方式,那该多好。
安装环境 1.Nullsoft Inst all System(NSIS)
:编译 .nsi脚本文件,生成Setup.exe 2.VNISEdit
:生成 .nsi脚本文件 注意,如果没有安装NSIS直接打开VNISEdit,会在选择语言一步卡死,因为候选栏为空。 下载链接:VNISEdit.rar nsis-3.02.1-setup.exe
生成 .nsi脚本文件 1.打开VNISEdit 选择:文件->新建脚本:向导 2.填写应用程序信息 3.填写安装程序选项 4.设置快闪屏幕和背景窗口。花里胡哨的,我直接下一步 5.应用程序的目录和授权信息 没有授权文件的话,需要把输入框清空,再下一步 6.应用程序文件 先删除右边框子里所有的默认文件,然后点击添加目录树 一定要勾选上下面两个复选框 7.应用程序图标 记得准备一个ico格式的图标哦 8.安装程序之后运行 选择我们的主程序,也就是main.exe
9.解除安装程序,不用改 10.保存脚本 一定要勾选上前两个复选框
编译 .nsi脚本 打开Nullsoft Inst all System(NSIS) 选择第一个编译nsi 把之前生成的nsi文件推进去,等他编译完,就大功告成咯
下载链接 安装程序:CapooSetup.exe python编译exe文件:main.exe