From d30d6f290dc05b50556455c2f095f144dbb30535 Mon Sep 17 00:00:00 2001 From: phil616 Date: Fri, 27 Jun 2025 15:59:08 +0800 Subject: [PATCH] update repo --- .gitattributes | 2 + .gitignore | 1 + GIF/angry.gif | 3 + GIF/appear.gif | 3 + GIF/baji.gif | 3 + GIF/boring.gif | 3 + GIF/cake.gif | 3 + GIF/call.gif | 3 + GIF/charge.gif | 3 + GIF/crying.gif | 3 + GIF/crying2.gif | 3 + GIF/exercise.gif | 3 + GIF/normal.gif | 3 + GIF/stick.gif | 3 + GIF/walkdog.gif | 3 + GIF/working.gif | 3 + GIF/working2.gif | 3 + Image/Energy.svg | 3 + Image/Happiness.svg | 3 + Image/MenuIcon.jpg | Bin 0 -> 33913 bytes main.py | 382 ++++++++++++++++++++++++++++++++++++++++++++ 21 files changed, 436 insertions(+) create mode 100644 .gitattributes create mode 100644 .gitignore create mode 100644 GIF/angry.gif create mode 100644 GIF/appear.gif create mode 100644 GIF/baji.gif create mode 100644 GIF/boring.gif create mode 100644 GIF/cake.gif create mode 100644 GIF/call.gif create mode 100644 GIF/charge.gif create mode 100644 GIF/crying.gif create mode 100644 GIF/crying2.gif create mode 100644 GIF/exercise.gif create mode 100644 GIF/normal.gif create mode 100644 GIF/stick.gif create mode 100644 GIF/walkdog.gif create mode 100644 GIF/working.gif create mode 100644 GIF/working2.gif create mode 100644 Image/Energy.svg create mode 100644 Image/Happiness.svg create mode 100644 Image/MenuIcon.jpg create mode 100644 main.py diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..82b660a --- /dev/null +++ b/.gitattributes @@ -0,0 +1,2 @@ +*.gif filter=lfs diff=lfs merge=lfs -text +*.svg filter=lfs diff=lfs merge=lfs -text \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..5509140 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +*.DS_Store diff --git a/GIF/angry.gif b/GIF/angry.gif new file mode 100644 index 0000000..dba4b44 --- /dev/null +++ b/GIF/angry.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c2eeae80ba146a482e091e5a5b25ce7d0cfb51205ed892d6d9901ef7f3af0be5 +size 27104 diff --git a/GIF/appear.gif b/GIF/appear.gif new file mode 100644 index 0000000..c8a4c9c --- /dev/null +++ b/GIF/appear.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fd45f2dd0e72e7b8ef148caedd4d0501522374122e5a530f1066e82aa917385e +size 73122 diff --git a/GIF/baji.gif b/GIF/baji.gif new file mode 100644 index 0000000..3aeebf8 --- /dev/null +++ b/GIF/baji.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cc976797e88048106db2fac2cd917368727c2e90890db57ce7919eadc1165531 +size 50789 diff --git a/GIF/boring.gif b/GIF/boring.gif new file mode 100644 index 0000000..65129e9 --- /dev/null +++ b/GIF/boring.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:32f0b8458082e678f53f26882bfbfc7f088dd40e752c1f1760b4ab5c5a34a326 +size 30980 diff --git a/GIF/cake.gif b/GIF/cake.gif new file mode 100644 index 0000000..14c9352 --- /dev/null +++ b/GIF/cake.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d31191ec67e69f48ff852185a44bffd57a99b4cb1961f8ae3d9858ddcccd4e3a +size 144620 diff --git a/GIF/call.gif b/GIF/call.gif new file mode 100644 index 0000000..d92f180 --- /dev/null +++ b/GIF/call.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:725c5ea8ae54882e8ed6736e0e2232acb14ae40ea4a7f9be01dae35d415db368 +size 25647 diff --git a/GIF/charge.gif b/GIF/charge.gif new file mode 100644 index 0000000..b002ce4 --- /dev/null +++ b/GIF/charge.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:699b245480151fb5fb6dc59be635be074b6f4cc6966cdc329dec430e5da32e39 +size 267219 diff --git a/GIF/crying.gif b/GIF/crying.gif new file mode 100644 index 0000000..9bd4584 --- /dev/null +++ b/GIF/crying.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7ad4309472a75856e7d533d113b499927b31ad34dbaefd5772051776f543b1e6 +size 75254 diff --git a/GIF/crying2.gif b/GIF/crying2.gif new file mode 100644 index 0000000..c954836 --- /dev/null +++ b/GIF/crying2.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d620cf74d1fe2045d9d86eab6865d4e01fdca3e778956f6582dd6909bc998225 +size 56038 diff --git a/GIF/exercise.gif b/GIF/exercise.gif new file mode 100644 index 0000000..9856826 --- /dev/null +++ b/GIF/exercise.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:41e88140d2a796a2442e83644ecbecfc2a7d106d116455907d2c38743a55bb4c +size 216941 diff --git a/GIF/normal.gif b/GIF/normal.gif new file mode 100644 index 0000000..f612626 --- /dev/null +++ b/GIF/normal.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:880ed3d23eb692dd10fafdad892d50a24d91c45507e4d986fbae426497610218 +size 270507 diff --git a/GIF/stick.gif b/GIF/stick.gif new file mode 100644 index 0000000..0a172c5 --- /dev/null +++ b/GIF/stick.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0e733706153e286180ded68e6a4ddb5b345d6d646cb538e2fc59e3e4a9faa8ab +size 127026 diff --git a/GIF/walkdog.gif b/GIF/walkdog.gif new file mode 100644 index 0000000..f057db7 --- /dev/null +++ b/GIF/walkdog.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e90e077437f1230a7ae41e803d838c216cdd9165f8b3e6676e21ef33c97acedb +size 102239 diff --git a/GIF/working.gif b/GIF/working.gif new file mode 100644 index 0000000..e2544cc --- /dev/null +++ b/GIF/working.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e6e38a80854781039a56b90bf5bc9e8df2e260e534694ffa0c088b0c1f50dbde +size 112218 diff --git a/GIF/working2.gif b/GIF/working2.gif new file mode 100644 index 0000000..cb7c959 --- /dev/null +++ b/GIF/working2.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:135f1e6236bfb3119839b314ef40dd9a5ee4a23b8597b4f6da6a52bc99bf6224 +size 46744 diff --git a/Image/Energy.svg b/Image/Energy.svg new file mode 100644 index 0000000..86765c2 --- /dev/null +++ b/Image/Energy.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:631d8f8ddeb66b3b0aace272779d6fda449a53846274402cff5bb03184a48787 +size 2141 diff --git a/Image/Happiness.svg b/Image/Happiness.svg new file mode 100644 index 0000000..5c9c9f9 --- /dev/null +++ b/Image/Happiness.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:56f76cf07081e5a123748687ee9f250e0ad9f9372bcbf691895d1142b1036c5e +size 869 diff --git a/Image/MenuIcon.jpg b/Image/MenuIcon.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8bcf213dfd3dc38ccba005bb9ebac31b9880a47a GIT binary patch literal 33913 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 DKQb@$ literal 0 HcmV?d00001 diff --git a/main.py b/main.py new file mode 100644 index 0000000..8ebe287 --- /dev/null +++ b/main.py @@ -0,0 +1,382 @@ +import sys +import os +import random +import datetime +from PyQt5.QtGui import QIcon, QMovie, QCursor, QPixmap +from PyQt5.QtWidgets import (QWidget, QApplication, QSystemTrayIcon, + QMenu, QAction, QLabel, QDesktopWidget, + QProgressBar, QVBoxLayout, QHBoxLayout) +from PyQt5.QtCore import Qt, QSize, QTimer + +class DesktopPet(QWidget): + def __init__(self, parent=None, **kwargs): + super(DesktopPet, self).__init__(parent) + self.init() + self.initPall() + self.action_timer = QTimer(self) + self.action_timer.setSingleShot(True) + self.action_timer.timeout.connect(self.checkInitialGif) + self.status_timer = QTimer(self) + self.status_timer.timeout.connect(self.statusTimer) + self.happiness_accumulated = 0 + self.energy_accumulated = 0 + self.working_timer = QTimer(self) + self.working_timer.timeout.connect(self.updateWorking) + self.boring_timer = QTimer(self) + self.boring_timer.setSingleShot(True) + self.boring_timer.timeout.connect(self.setBoring) + self.is_boring = False + self.resetBoringTimer() + self.resurrect_timer = QTimer(self) + self.resurrect_timer.setSingleShot(True) + self.resurrect_timer.timeout.connect(self.resurrectPet) + self.is_dead = False + self.initPetImage() + + def init(self): + self.setWindowFlags(Qt.FramelessWindowHint | Qt.WindowStaysOnTopHint | Qt.Tool | Qt.NoDropShadowWindowHint) + self.setAutoFillBackground(False) + self.setAttribute(Qt.WA_TranslucentBackground, True) + self.repaint() + + def initPall(self): + icons = os.path.join('Image/MenuIcon.jpg') + self.quit_action = QAction(u'退出', self, triggered=self.quit) + self.showing = QAction(u'显示', self, triggered=self.showup) + self.hideup = QAction(u'隐藏', self, triggered=self.hide) + self.hidestats = QAction(u'显示/隐藏状态栏', self, triggered=self.hideStatsBar) + self.tray_icon_menu = QMenu(self) + self.tray_icon_menu.addAction(self.quit_action) + self.tray_icon_menu.addAction(self.showing) + self.tray_icon_menu.addAction(self.hideup) + self.tray_icon_menu.addAction(self.hidestats) + 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.main_layout = QVBoxLayout(self) + self.main_layout.setContentsMargins(0, 0, 0, 0) + self.main_layout.setSpacing(0) + + self.stats_visible = True + self.happiness_layout = QHBoxLayout() + self.happiness_layout.setContentsMargins(0, 0, 0, 0) + self.happiness_layout.setSpacing(0) + self.happiness_icon = QLabel() + self.happiness_icon.setContentsMargins(0, 0, 0, 0) + self.happiness_icon_pixmap = QPixmap("Image/Happiness.svg") + self.happiness_icon_pixmap = self.happiness_icon_pixmap.scaled(QSize(20, 20), Qt.KeepAspectRatio, Qt.SmoothTransformation) + self.happiness_icon.setPixmap(self.happiness_icon_pixmap) + self.happiness_layout.addWidget(self.happiness_icon, alignment=Qt.AlignCenter) + self.happiness_bar = QProgressBar() + self.happiness_bar.setRange(0, 100) + self.happiness_bar.setValue(80) + self.happiness_bar.setFixedHeight(12) + self.happiness_bar.setFixedWidth(150) + self.happiness_bar.setStyleSheet(""" + QProgressBar { + border: 1px solid #ccc; + border-radius: 5px; + text-align: center; + } + QProgressBar::chunk { + background-color: #FF69B4; + } + """) + self.happiness_layout.addWidget(self.happiness_bar, alignment=Qt.AlignCenter) + + self.energy_layout = QHBoxLayout() + self.energy_layout.setContentsMargins(0, 0, 0, 0) + self.energy_layout.setSpacing(0) + self.energy_label = QLabel() + self.energy_label.setContentsMargins(0, 0, 0, 0) + self.energy_icon_pixmap = QPixmap("Image/Energy.svg") + self.energy_icon_pixmap = self.energy_icon_pixmap.scaled(QSize(20, 20), Qt.KeepAspectRatio, Qt.SmoothTransformation) + self.energy_label.setPixmap(self.energy_icon_pixmap) + self.energy_layout.addWidget(self.energy_label, alignment=Qt.AlignCenter) + self.energy_bar = QProgressBar() + self.energy_bar.setRange(0, 100) + self.energy_bar.setValue(80) + self.energy_bar.setFixedHeight(12) + self.energy_bar.setFixedWidth(150) + self.energy_bar.setStyleSheet(""" + QProgressBar { + border: 1px solid #ccc; + border-radius: 5px; + text-align: center; + } + QProgressBar::chunk { + background-color: #1E90FF; + } + """) + self.energy_layout.addWidget(self.energy_bar, alignment=Qt.AlignCenter) + + self.image = QLabel(self) + self.image.setContentsMargins(0, 0, 0, 0) + self.checkInitialGif() + + self.main_layout.addWidget(self.image) + self.main_layout.addLayout(self.happiness_layout) + self.main_layout.addLayout(self.energy_layout) + + self.resize(200, 240) + self.randomPosition() + self.show() + self.pet1 = [] + for filename in os.listdir("GIF"): + self.pet1.append(os.path.join("GIF", filename)) + + def showMenu(self): + menu = QMenu() + menu.addAction(u"贴贴", self.stick) + menu.addAction(u"拍一拍", self.call) + menu.addAction(u"锻炼", self.exercise) + menu.addAction(u"充电", self.charge) + menu.addAction(u"投喂小白", self.cake) + menu.addAction(u"吧唧", self.baji) + menu.addAction(u"随机出现", self.appear) + menu.addAction(u"遛小鸡毛", self.walkDog) + right_pos = self.mapToGlobal(self.rect().topRight()) + menu.exec_(right_pos) + + def stick(self): + if self.is_dead: + return + self.resetBoringTimer() + self.working_timer.stop() + self.changeGif("GIF/stick.gif") + self.action_timer.start(10 * 60 * 1000) + self.updateStatus(15, -5, 10 * 60 * 1000) + + def call(self): + if self.is_dead: + return + self.resetBoringTimer() + self.working_timer.stop() + self.changeGif("GIF/call.gif") + self.action_timer.start(2000) + + def exercise(self): + if self.is_dead: + return + self.resetBoringTimer() + self.working_timer.stop() + self.changeGif("GIF/exercise.gif") + self.action_timer.start(10 * 60 * 1000) + self.updateStatus(5, -10, 10 * 60 * 1000) + + def charge(self): + if self.is_dead: + return + self.resetBoringTimer() + self.working_timer.stop() + self.changeGif("GIF/charge.gif") + self.action_timer.start(45 * 60 * 1000) + self.updateStatus(30, 30, 30 * 60 * 1000) + + def cake(self): + if self.is_dead: + return + self.resetBoringTimer() + self.working_timer.stop() + self.changeGif("GIF/cake.gif") + self.action_timer.start(5 * 60 * 1000) + self.updateStatus(10, 5, 5 * 60 * 1000) + + def baji(self): + if self.is_dead: + return + self.resetBoringTimer() + self.working_timer.stop() + self.changeGif("GIF/baji.gif") + self.action_timer.start(5 * 60 * 1000) + self.updateStatus(10, 10, 5 * 60 * 1000) + + def appear(self): + if self.is_dead: + return + self.resetBoringTimer() + self.working_timer.stop() + self.changeGif("GIF/appear.gif") + self.action_timer.start(3500) + self.randomPosition() + + def walkDog(self): + if self.is_dead: + return + self.resetBoringTimer() + self.working_timer.stop() + self.changeGif("GIF/walkdog.gif") + self.action_timer.start(10 * 60 * 1000) + self.updateStatus(15, -10, 10 * 60 * 1000) + + def checkInitialGif(self): + current_time = datetime.datetime.now() + current_hour = current_time.hour + weekday = current_time.weekday() + self.is_working_time = (0 <= weekday <= 4) and (10 <= current_hour < 18) + happiness = self.happiness_bar.value() + energy = self.energy_bar.value() + + if happiness == 0 and energy == 0: + self.petDied() + elif happiness < 20 and energy < 20: + if self.is_working_time: + self.working_timer.stop() + self.working_timer.start(60 * 1000) + return self.changeGif("GIF/angry.gif") + elif happiness < 20: + if self.is_working_time: + self.working_timer.stop() + self.working_timer.start(2 * 60 * 1000) + return self.changeGif("GIF/crying2.gif") + elif energy < 20: + if self.is_working_time: + self.working_timer.stop() + self.working_timer.start(2 * 10 * 1000) + return self.changeGif("GIF/crying.gif") + + if self.is_working_time: + self.working_timer.start(3 * 60 * 1000) + return self.changeGif("GIF/working2.gif") + else: + self.working_timer.stop() + return self.changeGif("GIF/normal.gif") + + def updateWorking(self): + self.updateHappiness(-1) + self.updateEnergy(-1) + if self.happiness_bar.value() <= 20 or self.energy_bar.value() <= 20: + self.checkInitialGif() + + def updateStatus(self, happinesschange, energychange, duration): + self.total_happiness_change = happinesschange + self.total_energy_change = energychange + interval = 100 + self.remaining = duration / interval + self.happiness_change_step = happinesschange / self.remaining + self.energy_change_step = energychange / self.remaining + self.status_timer.start(interval) + + def statusTimer(self): + if self.remaining <= 0: + self.status_timer.stop() + return + self.happiness_accumulated += self.happiness_change_step + self.energy_accumulated += self.energy_change_step + if self.happiness_accumulated >= 1 or self.happiness_accumulated <= -1: + self.updateHappiness(int(self.happiness_accumulated)) + self.happiness_accumulated = 0 + if self.energy_accumulated >= 1 or self.energy_accumulated <= -1: + self.updateEnergy(int(self.energy_accumulated)) + self.energy_accumulated = 0 + self.remaining -= 1 + + def setBoring(self): + if not self.is_boring and not self.is_working_time: + self.is_boring = True + self.changeGif("GIF/boring.gif") + self.updateHappiness(-5) + + def resetBoringTimer(self): + if self.is_boring: + self.is_boring = False + self.checkInitialGif() + self.boring_timer.stop() + self.boring_timer.start(60 * 60 * 1000) + + def petDied(self): + if self.is_dead: + return + self.is_dead = True + self.working_timer.stop() + self.boring_timer.stop() + self.action_timer.stop() + self.status_timer.stop() + self.showing.setEnabled(False) + self.hidestats.setEnabled(False) + self.hideup.setEnabled(False) + self.hide() + self.resurrect_timer.start(5000) + + def resurrectPet(self): + self.is_dead = False + self.happiness_bar.setValue(50) + self.energy_bar.setValue(50) + self.showing.setEnabled(True) + self.hidestats.setEnabled(True) + self.hideup.setEnabled(True) + self.showup() + self.resetBoringTimer() + self.checkInitialGif() + + def randomPosition(self): + screen_geometry = QDesktopWidget().screenGeometry() + pet_geometry = self.geometry() + width = int((screen_geometry.width() - pet_geometry.width()) * random.random()) + height = int((screen_geometry.height() - pet_geometry.height()) * random.random()) + self.move(width, height) + + def changeGif(self, path): + self.movie = QMovie(path) + self.movie.setScaledSize(QSize(200, 200)) + self.image.setMovie(self.movie) + self.movie.start() + + def mousePressEvent(self, event): + self.condition = 1 + if event.button() == Qt.LeftButton: + self.is_follow_mouse = True + self.mouse_drag_pos = event.globalPos() - self.pos() + self.setCursor(QCursor(Qt.OpenHandCursor)) + elif event.button() == Qt.RightButton: + self.showMenu() + event.accept() + + 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 updateHappiness(self, value): + current_value = self.happiness_bar.value() + new_value = max(0, min(100, current_value + value)) + self.happiness_bar.setValue(new_value) + + def updateEnergy(self, value): + current_value = self.energy_bar.value() + new_value = max(0, min(100, current_value + value)) + self.energy_bar.setValue(new_value) + + def hideStatsBar(self): + if self.is_dead: + return + self.stats_visible = not self.stats_visible + self.happiness_icon.setVisible(self.stats_visible) + self.happiness_bar.setVisible(self.stats_visible) + self.energy_label.setVisible(self.stats_visible) + self.energy_bar.setVisible(self.stats_visible) + + def quit(self): + self.close() + sys.exit() + + def showup(self): + self.setWindowOpacity(1) + + def hide(self): + self.setWindowOpacity(0) + +if __name__ == '__main__': + app = QApplication(sys.argv) + pet = DesktopPet() + sys.exit(app.exec_()) \ No newline at end of file