From 3051f6ca49c82da46810199f2e5b822d094a1c89 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=BF=97=E5=BC=BA?= <357099073@qq.com> Date: Tue, 7 Apr 2026 10:48:27 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B00.02=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CleanDesktopOrganizer.spec | 2 +- __pycache__/shortcut_target.cpython-313.pyc | Bin 6611 -> 6612 bytes db/__pycache__/__init__.cpython-313.pyc | Bin 149 -> 150 bytes db/__pycache__/database.cpython-313.pyc | Bin 10433 -> 11204 bytes main.py | 2 +- requirements.txt | 1 + ui/__pycache__/__init__.cpython-313.pyc | Bin 149 -> 150 bytes ui/__pycache__/ball.cpython-313.pyc | Bin 15439 -> 26280 bytes ui/__pycache__/dialog_style.cpython-313.pyc | Bin 10096 -> 12044 bytes ui/__pycache__/dock.cpython-313.pyc | Bin 81306 -> 95258 bytes ui/__pycache__/flow_layout.cpython-313.pyc | Bin 11902 -> 11903 bytes ui/__pycache__/group.cpython-313.pyc | Bin 37640 -> 37641 bytes ui/__pycache__/item.cpython-313.pyc | Bin 24402 -> 24403 bytes .../settings_window.cpython-313.pyc | Bin 27100 -> 30950 bytes ui/__pycache__/theme.cpython-313.pyc | Bin 2120 -> 2121 bytes ui/ball.py | 69 +++++-- ui/dock.py | 138 +++++++++++--- ui/settings_window.py | 1 + ui/updater.py | 169 ++++++++++++++++++ 19 files changed, 345 insertions(+), 37 deletions(-) create mode 100644 ui/updater.py diff --git a/CleanDesktopOrganizer.spec b/CleanDesktopOrganizer.spec index 271343c..c5f88d0 100644 --- a/CleanDesktopOrganizer.spec +++ b/CleanDesktopOrganizer.spec @@ -37,7 +37,7 @@ exe = EXE( upx=True, upx_exclude=[], runtime_tmpdir=None, - console=True, + console=False, disable_windowed_traceback=False, argv_emulation=False, target_arch=None, diff --git a/__pycache__/shortcut_target.cpython-313.pyc b/__pycache__/shortcut_target.cpython-313.pyc index af634f8a355b1abfbfc60fda0f9c05cb6f06f5fa..fef1a155e984d65f8d39107876475dce89e1d13c 100644 GIT binary patch delta 46 zcmca?e8rgiGcPX}0}#9myRwnHiHXV5b#gzG1aDquX>MY1ep*R+Vo~bm%}fg70ArsI AbpQYW delta 45 zcmca&eA$@$GcPX}0}!M*oZraZ#KdHgI=P=of+smAH8C$GwK%&ZzhLtgCIxW-Ki>{# diff --git a/db/__pycache__/__init__.cpython-313.pyc b/db/__pycache__/__init__.cpython-313.pyc index b8ed6de5f9300db04df25cfd68327da87f036299..8433c2e97781d1b45be13852fcf6964bf1f530ff 100644 GIT binary patch delta 41 vcmbQrIE|6}GcPX}0}#9myE2j6n9+2iy(Dj5W@&C>aei7!d16uO#1umS^)n3) delta 40 ucmbQnIF*t6GcPX}0}yygo}b8V%xE&vUXmv{Cp9rICAB!aB)?!{sv!W*8VjEQ diff --git a/db/__pycache__/database.cpython-313.pyc b/db/__pycache__/database.cpython-313.pyc index 7b728aa1e51535949859dc6e0e24dd36110437da..3b1efd2458b065469b76f1de73219bdab211028c 100644 GIT binary patch delta 1420 zcmZuwTTB~A6!rK4gc=ePp2o)O2au%@J@_s8(d|2 z1va|$fEBKCK$DAc8Qe^R(q#mO8aU(JEIfsf6{3{2QYp^8E^ zKx{vMk;8&7BzOcb9ta4yp8Qzwd_g6|*nQYUDJsm3g1hG6k*q^B?~v#_Sg)+Br4;r5 ziGuefN^GS-CGZPmqsWAgk?)IoP%W_+e{8jb`__N6>5g(qtSX&dOLmK`s9h{6IgTuH z)eTQ5F||MF6M!g-zewFpBwT7l9pXo&*U3;O;v7ORlOIe)S((EAG8xfXv5a{gp~Gat-0_@~ie%#>w1j#J428W-p56|S+%(il zkfrb$nJRaDlrR<(Ixn_b4kP3soV5=5#AWM#l&)Tl`^i093mOo2ZFXen0|{1>R(h4n z$r`WG)lt$~WkEsWt2$X9E5-pI4tRxt#~--h4GjsN0nCLi`4BLl3>7TsxBC_8F_w|X z6{We2nK+{Wv!qP9XP;Kk_dDpeyQe#40|HLD5jKp-~}nMmGROU#55OEc2+ zWODu8c;vn0$`xsCekVE|6avHiPIP7~{7!Bi6OXK=#y6yiIqBwNYTyKQa+7>| z2WkFJDm)`Ct)`~t5{s+S^mS={Ewz4a`}WOraa-Y8DH2I8tfWia3ezp(8_U~w#*^>Q zrj~DPPl?j%RcIz23CAO!LqDLIAan8iOLU9Nx;BT?(L3f~+D~!H{o_SHg;6a6U}*zW6}ql6a4I#P5;i@DK!3@bSk1!iwLt3T@$)rf}OM zbwpIVih>ZqMejAHg7=S)QL~*w2Ze45^oPQ|6wXjMOW`~PAB6!5L4cULpW}w)aQw)RcUv-ZP}JK3$%b3(S~3`APq>0wNWIHG^IdW{84<}#*nB7 z{{u4zjdIXW+SV0mig`rYDY z$*i_2?cro_QI9}TZs}=&Dcp&rU`2k9bwcZ)E>Xh$_ynxW!9Kci*Gb24w}cm1*w(no zRtC2cI#h8xk;CVP7ozyisAmlh@%6Br4O56o{+wpaFylGpcyI YU+cI>CeYi^B=)P&ad6rVUBXMAKZ7f*uK)l5 diff --git a/main.py b/main.py index 39381a5..2865d52 100644 --- a/main.py +++ b/main.py @@ -9,7 +9,7 @@ from ui.ball import FloatBall, BALL_SIZE import ui.theme as theme from db import database -__VERSION__ = "0.0.1" +__VERSION__ = "0.0.2" # ===================== 打包兼容核心函数 ===================== def get_resource_path(relative_path): diff --git a/requirements.txt b/requirements.txt index f565544..f76ea70 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1 +1,2 @@ PyQt6>=6.4.0 +pillow>=9.0.0 \ No newline at end of file diff --git a/ui/__pycache__/__init__.cpython-313.pyc b/ui/__pycache__/__init__.cpython-313.pyc index 26f1ea1dc74716f23a0f6b07479fb36adadc58c3..b5fd8a873a0be9b922b58c714b0522fe62afe436 100644 GIT binary patch delta 41 vcmbQrIE|6}GcPX}0}#9myE2j6n9+2iy(Dj5W@&C>aei7!d16uO#1umS^)n3) delta 40 ucmbQnIF*t6GcPX}0}!}No}b8V%xE&vUXmv{Cp9rICAB!aB)?!{sv!W)$qSqS diff --git a/ui/__pycache__/ball.cpython-313.pyc b/ui/__pycache__/ball.cpython-313.pyc index af91f78f0630765bab26d2a17217bd4db69a60e8..da4eca8914df6dd46ff500195da3d237177fe44c 100644 GIT binary patch literal 26280 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 Bfyn>> literal 15439 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 aHESY>a!2NM5&mA^lIFf|7I-`0T>KyAAA`vN delta 16637 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 diff --git a/ui/__pycache__/flow_layout.cpython-313.pyc b/ui/__pycache__/flow_layout.cpython-313.pyc index 81b43812e284fe4c650a9955070455640a5580cb..40bbfa3fadd999da8e9102d856fd63558ac3adca 100644 GIT binary patch delta 46 zcmewt^FN0BGcPX}0}#9myRwmc2{V(0>*S5h61;htrMZd4`DrEPiAAZKuQIRH0sx6X B5g`Bo delta 45 zcmew#^Dl<`GcPX}0}%9ko!`j4gqg`ab@E1L37+Jf)Wp1$)Z*-t{DRHbm{)260Bb1_ ANB{r; diff --git a/ui/__pycache__/group.cpython-313.pyc b/ui/__pycache__/group.cpython-313.pyc index f355e40f81a2a6f834de3665534661232fbc4f6a..1908be3805daf05c2c9a43f521989a48ccac618d 100644 GIT binary patch delta 67 zcmeBJ#?-ltiTg7zFBbz4ybHUsk(-B2-N@A{#w9g3zZgvVm**A71XPw}Tm*f|0wqrZp0|3Sp7is_i diff --git a/ui/__pycache__/item.cpython-313.pyc b/ui/__pycache__/item.cpython-313.pyc index bcd80b3864225514bc6afd200292e90fb0276640..3b2955f7eeab93d95cb5cc0df62daf0d8d1d9b4f 100644 GIT binary patch delta 48 zcmcb#kMZ(8M()qNyj%=G@Gk7iMs5XGCPUZBx~vksd6}iTiN*P8CFO}lsha~?8KVG$ CLl24o delta 47 zcmcb-kMYtzM()qNyj%=GaL4`pMs5XGCWF+;x~vjB$vLTsc`2#I*(Lb}n}b*xqX2IW B4*LKA diff --git a/ui/__pycache__/settings_window.cpython-313.pyc b/ui/__pycache__/settings_window.cpython-313.pyc index a062859eaa6857bea100625325e3bd659859b7bb..11558ac6bf38007bbb420e796a05afc7890b634f 100644 GIT binary patch delta 6941 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 QiDP4jcl?>bUrES+1JXp3o&W#< delta 4441 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 Z&W~8;$MnmZ*4FBH+QF^gGkPnd{|iV+LBIe2 diff --git a/ui/__pycache__/theme.cpython-313.pyc b/ui/__pycache__/theme.cpython-313.pyc index 2f4b84dbad9a79b2c30215c1393ffd0b1a8051e0..ddf896c54c5dca34ed08137ac3bca8f80549d844 100644 GIT binary patch delta 45 zcmX>ha8iK#GcPX}0}#9myRwn{D>I|fWJVTA-n`7x+{EJiw370~qSVc5EJ`c@L?I3t delta 44 ycmX>pa6*9lGcPX}0}#B@KEILsD>I|vWJVTAp5&a=#JrT$;_Q str: + """从 main 模块取当前版本号,避免循环导入。""" + try: + import importlib + m = importlib.import_module("__main__") + return getattr(m, "__VERSION__", "0.0.0") + except Exception: + return "0.0.0" + + +def _is_newer(latest: str, current: str) -> bool: + try: + def _parse(v): + return tuple(int(x) for x in v.strip().lstrip("v").split(".")) + return _parse(latest) > _parse(current) + except Exception: + return latest != current + + +class _CheckWorker(QThread): + result = pyqtSignal(dict) # 成功:返回 data 字段 + error = pyqtSignal(str) + + def run(self): + try: + import json + import urllib.request + with urllib.request.urlopen(UPDATE_CHECK_URL, timeout=10) as resp: + body = json.loads(resp.read().decode()) + if body.get("code") == 200: + self.result.emit(body["data"]) + else: + self.error.emit(body.get("msg", "接口返回异常")) + except Exception as e: + self.error.emit(str(e)) + + +class _DownloadWorker(QThread): + progress = pyqtSignal(int) # 0-100 + finished = pyqtSignal(str) # 下载完成,返回临时文件路径 + error = pyqtSignal(str) + + def __init__(self, url: str): + super().__init__() + self._url = url + + def run(self): + try: + tmp = tempfile.NamedTemporaryFile(delete=False, suffix=".exe") + tmp.close() + dst = tmp.name + + def _reporthook(count, block_size, total_size): + if total_size > 0: + pct = min(100, int(count * block_size * 100 / total_size)) + self.progress.emit(pct) + + urllib.request.urlretrieve(self._url, dst, _reporthook) + self.progress.emit(100) + self.finished.emit(dst) + except Exception as e: + self.error.emit(str(e)) + + +def _replace_and_restart(new_exe: str): + """ + 写一个批处理脚本:等待当前进程退出 → 覆盖 exe → 启动新版。 + 仅在打包为 exe 时执行真正替换;开发环境直接启动下载文件。 + """ + current_exe = sys.executable if getattr(sys, "frozen", False) else None + + if current_exe: + bat = tempfile.NamedTemporaryFile(delete=False, suffix=".bat", mode="w", encoding="gbk") + bat.write(f"""@echo off +ping 127.0.0.1 -n 3 >nul +move /y "{new_exe}" "{current_exe}" +start "" "{current_exe}" +del "%~f0" +""") + bat.close() + subprocess.Popen(["cmd", "/c", bat.name], creationflags=subprocess.CREATE_NO_WINDOW) + else: + # 开发环境:直接运行下载的 exe + subprocess.Popen([new_exe]) + + QApplication.quit() + + +class Updater(QObject): + """对外接口:调用 check() 即可。""" + + def __init__(self, parent=None): + super().__init__(parent) + self._parent_widget = parent + + def check(self, silent_if_latest: bool = False): + self._silent = silent_if_latest + self._worker = _CheckWorker() + self._worker.result.connect(self._on_check_result) + self._worker.error.connect(self._on_check_error) + self._worker.start() + + def _on_check_result(self, data: dict): + current = _current_version() + latest = data.get("latestVersion", "") + url = data.get("downloadUrl", "") + + if not _is_newer(latest, current): + if not self._silent: + QMessageBox.information(self._parent_widget, "检查更新", f"当前已是最新版本 v{current}") + return + + notes = data.get("releaseNotes", "") or "" + msg = f"发现新版本 v{latest}(当前 v{current})" + if notes: + msg += f"\n\n更新内容:\n{notes}" + msg += "\n\n是否立即下载更新?" + + ret = QMessageBox.question( + self._parent_widget, "发现新版本", msg, + QMessageBox.StandardButton.Yes | QMessageBox.StandardButton.No, + QMessageBox.StandardButton.Yes, + ) + if ret != QMessageBox.StandardButton.Yes: + return + + self._download(url) + + def _on_check_error(self, err: str): + if not self._silent: + QMessageBox.warning(self._parent_widget, "检查更新失败", f"无法连接更新服务器:\n{err}") + + def _download(self, url: str): + self._progress = QProgressDialog("正在下载更新...", "取消", 0, 100, self._parent_widget) + self._progress.setWindowTitle("下载更新") + self._progress.setMinimumDuration(0) + self._progress.setValue(0) + + self._dl_worker = _DownloadWorker(url) + self._dl_worker.progress.connect(self._progress.setValue) + self._dl_worker.finished.connect(self._on_download_done) + self._dl_worker.error.connect(self._on_download_error) + self._progress.canceled.connect(self._dl_worker.terminate) + self._dl_worker.start() + + def _on_download_done(self, path: str): + self._progress.close() + _replace_and_restart(path) + + def _on_download_error(self, err: str): + self._progress.close() + QMessageBox.critical(self._parent_widget, "下载失败", f"下载更新失败:\n{err}")