Python桌面宠物实战:Tkinter透明窗口与帧动画开发指南
简介一款基于Python3.7与PyQt5开发的桌面宠物程序适合Python学习者、桌面应用开发者或对桌面美化感兴趣的用户。程序默认每10秒播放一个动作支持鼠标双击激活行走、右键呼出快捷功能并提供托盘与守护进程模式整体交互轻量有趣。核心动作与图片配置分离可根据需要增减动作或替换素材便于二次开发与扩展。资源包共46个文件以31张png动作序列帧和9个py源码文件为主配合说明文档、依赖清单、打包脚本等压缩后仅457KB。文件结构清晰core目录下分别管理宠物动作、能力与配置逻辑适合直接阅读和修改。目前已有1759人学习下载。通过源码可了解PyQt5定时器、鼠标事件、托盘图标及多状态动画的实现思路附带的run.spec还提供了打包参考在macOS上验证可帮助快速将项目转为可执行程序整体麻雀虽小、五脏俱全。1. 桌面宠物不是小游戏是一个会移动的透明窗口桌面上养一只会走来走去、睡觉、被鼠标拖着跑的小宠物看起来像个小玩具但真正动手做的人会发现它既不是图形引擎渲染也不是什么动画特效核心就三件事——一个无边框透明窗口、一套帧动画循环、一个行为状态机。用 Python 实现这套东西并不复杂Tkinter 加 Pillow 加一个小托盘库就能搞定。这个标题下的技术落地解决的是“桌面个性化、轻量常驻应用、GUI 事件编程入门”这一类真实需求而不是游戏开发。适合的人群也很明确想学 Python GUI 又想立刻看到趣味结果的新手以及想快速验证窗口管理、透明色键、事件绑定、打包发布这套链路的中级开发者。它会用一种“看着像玩具处处是门道”的方式帮你把桌面应用的骨骼摸清楚。2. 先跑通一只会动的宠物选型、透明窗口与逐帧动画2.1 用 Tkinter 还是 PySide6先想清楚三件事做桌面宠物第一个技术抉择就是 GUI 框架。常见的做法是二选一Tkinter 或者 PySide6。有人一上来就选 PySide6觉得“反正功能强”结果打包出来 80MB初始化还要写一堆类也有人死守 Tkinter结果想要半透明毛玻璃效果时发现根本做不到。我的建议是分三件事来判断。第一你需不需要真正的 alpha 透明。Tkinter 的transparentcolor是单色色键透明也就是说它只允许一整块颜色隐去不支持半透明渐变。如果你要的宠物是像素风、硬边、Q 版贴图Tkinter 完全够用。如果素材是带抗锯齿圆角、投影、半透明光的精细插画那真的别纠结直接 PySide6。第二包体和分发成本。Tkinter 是 Python 自带的标准库配合 PyInstaller 打包出来通常只有 15~25MB。PySide6 哪怕只用到 QtWidgets单文件也随便奔着 50MB 以上去。桌面宠物这种“图一乐”的项目用户不会愿意为一个 100MB 的 exe 买单。第三托盘和常驻生态。Tkinter 本身没有托盘 API但配合 pystray 十几行代码就能实现这也是桌面宠物项目里最主流的组合。PySide6 则要用 QSystemTrayIcon功能更强但坑也不少。所以我的选型结论是默认 Tkinter Pillow pystray。这套组合覆盖了 80% 桌面宠物的需求依赖少、代码短、打包容易。只有当你明确需要半透明边缘、毛玻璃背景、复杂动画插帧时才换 PySide6。对比项Tkinter PillowPySide6 / PyQt6透明方案色键透明单色抠除真 alpha 通道支持半透明边缘质量抗锯齿边缘容易脏平滑适合精细素材打包体积15~25MB50MB 起步托盘支持需借助 pystray内置 QSystemTrayIcon上手难度低中高适合场景像素宠物、轻量常驻高精度界面、复杂交互动画2.2 透明无边框窗口的最小代码色键与置顶先做一个最小可用的透明悬浮窗。核心是overrideredirect(True)去掉标题栏和边框再用attributes(-transparentcolor, KEY_COLOR)把某个颜色作为透明色键。这一步会直接决定后续所有素材的处理方式素材里凡是这个颜色的像素都会在屏幕上消失。import tkinter as tk # 选一个画面中基本不会出现的颜色作为透明色键 # 不要用纯黑 #000000很多素材阴影里会带它 KEY_COLOR #010101 root tk.Tk() root.overrideredirect(True) # 去掉系统边框和标题栏 root.attributes(-topmost, True) # 让窗口始终置顶 root.attributes(-transparentcolor, KEY_COLOR) # 把 KEY_COLOR 视为透明 root.configure(bgKEY_COLOR) # 窗口背景填充为色键色 label tk.Label(root, bgKEY_COLOR, bd0, highlightthickness0) label.pack() label.configure(textdesktop-pet) # 这里先放文字后面换成图片 root.mainloop()这段代码里overrideredirect和transparentcolor是配套使用的缺一不可。去掉边框之后窗口没有关闭按钮所以退出要么靠右键菜单要么靠托盘后面会补上。-topmost是置顶参数布尔值。桌面宠物一般需要置顶但要注意它会把所有窗口都压在下面包括全屏播放视频时的播放器。很多人的宠物会“消失”就是因为某个全屏程序把置顶窗口遮掉了解决方法是把topmost改为可切换比如在托盘菜单里加一个“前端显示”的开关。transparentcolor这个参数在 Windows 上行为最稳定Linux 下取决于桌面合成器可能完全失效macOS 上则需要特殊处理。如果你是 Windows 为主直接照抄如果是 macOS 用户建议走 PySide6 的setMask方案别在 Tkinter 上死磕。2.3 逐帧动画播放不要用 sleep用 after 加绝对时间戳窗口起来了下一步是让宠物动起来。桌面宠物的动画本质上就是逐帧切换图片和 GIF 播放没有区别。常见的错误写法是直接用time.sleep卡在循环里这会直接卡死 Tk 的窗口事件循环拖拽、点击全部失效。正确做法是用root.after(ms, callback)轮询再配合绝对时间戳做帧对齐。下面的例子是完整的最小动画窗口import tkinter as tk import time from PIL import Image, ImageTk FRAMES [0.png, 1.png, 2.png, 3.png] # 按顺序放帧图 FRAME_MS 120 # 每帧停留 120ms CHECK_MS 16 # 事件轮询间隔约 60fps 的检查频率 KEY_COLOR #010101 class DesktopPet: def __init__(self): self.root tk.Tk() self.root.overrideredirect(True) self.root.attributes(-topmost, True) self.root.attributes(-transparentcolor, KEY_COLOR) self.root.configure(bgKEY_COLOR) self.label tk.Label(self.root, bgKEY_COLOR, bd0, highlightthickness0) self.label.pack() # 素材必须统一尺寸否则窗口会随着帧变化而抖动 self.images [] for f in FRAMES: frame Image.open(f).convert(RGBA) base Image.new(RGB, frame.size, KEY_COLOR) base.paste(frame, maskframe.split()[3]) self.images.append(ImageTk.PhotoImage(base)) self.idx 0 self.deadline time.time() * 1000 FRAME_MS self.root.after(CHECK_MS, self.tick) def tick(self): now time.time() * 1000 if now self.deadline: self.idx (self.idx 1) % len(self.images) self.label.configure(imageself.images[self.idx]) # 按绝对时间累加而不是按 now FRAME_MS避免误差累积 self.deadline FRAME_MS if now - self.deadline FRAME_MS: # 如果落后已经超过一帧直接跳到最新时间防止积压 self.deadline now FRAME_MS self.root.after(CHECK_MS, self.tick) if __name__ __main__: DesktopPet().root.mainloop()先把帧图存成0.png到3.png同一目录运行就能看到一只会动的宠物。代码里base.paste(frame, maskframe.split()[3])这行很关键它把带透明通道的 PNG 合成到#010101纯色背景上这样 Tkinter 才能用色键把背景抠掉。如果你直接把 RGBA 的 PhotoImage 丢给 label透明区域会变成黑色或残留边缘。FRAME_MS决定动画速度120ms 大约 8fps对桌面宠物来说已经足够顺滑再快会占用更多 CPU。CHECK_MS是轮询间隔16ms 是一个折中值既有派发事件的刷新率又不会让主循环空转。tick里用deadline做帧对齐比“每次调用 after 再加延时”更可靠因为帧处理本身耗时按调用时刻累加延时会让动画整体越跑越慢。3. 让宠物“像活的”动作状态机、拖拽与托盘菜单3.1 为什么需要动作状态机从播放动画到行为控制只会循环播放一组帧宠物看起来像个复读机不像生物。要让用户觉得它“活”需要行为层和播放层分离播放层只负责按当前动作切换帧行为层负责决定当前该做什么动作、什么时候切换。最常见的做法是一个简单的加权状态机。每个动作是一个状态状态之间用概率权重跳转。比如空闲时 60% 概率继续发呆、30% 概率走两步、10% 概率睡觉睡觉时 80% 概率继续睡睡得久一点才自然。直接每帧随机挑动作会显得神经质也不可控。import random # 状态跳转权重表当前状态 - 目标状态 - 选中概率 TRANSITIONS { idle: {idle: 0.6, walk: 0.3, sleep: 0.1}, walk: {idle: 0.5, walk: 0.4, sleep: 0.1}, sleep: {sleep: 0.8, idle: 0.2}, drag: {drag: 1.0}, # 拖拽中锁定动作松手后回 idle } def pick_next(state): opts list(TRANSITIONS[state].keys()) weights list(TRANSITIONS[state].values()) return random.choices(opts, weightsweights)[0]random.choices的权重不需要归一化它会自动按比例抽取。这里的参数要调的是各个状态的持续性。桌面宠物的体感来自“行为节奏”idle 自循环概率太高会呆sleep 的自循环太低会频繁醒通常我会把 sleep 的自持权重调到 0.7~0.8让它一次睡十几秒以上。状态机确定动作之后播放层只要根据动作名去加载对应的帧序列即可。我习惯的文件组织是按前缀命名idle0.png、idle1.png、walk0.png、walk1.png等状态机和播放层通过动作名解耦新增一个动作只需要加一组帧和一个跳转权重的映射。外部事件也可以驱动状态机。被拖拽时进入 drag 状态松手回 idle鼠标悬停时可以加一个“好奇”状态抬个头。事件驱动的状态注入和周期性的随机跳转不冲突只是把状态机的输入来源从“随机”扩展为“随机 事件”。3.2 拖拽移动记录偏移再更新 geometry去掉窗口边框之后用户没法通过系统标题栏拖动宠物所以拖拽必须自己实现。这里最经典的翻车点是直接把鼠标的屏幕坐标当成窗口坐标用结果按下鼠标那一刻窗口会跳到鼠标位置。正确做法是按下时记录鼠标在窗口内部的偏移移动时用屏幕坐标减去这个偏移得到窗口左上角的新坐标。class PetDragMixin: def setup_drag(self): self._offset (0, 0) self._dragging False self.root.bind(ButtonPress-1, self.on_press) self.root.bind(B1-Motion, self.on_motion) self.root.bind(ButtonRelease-1, self.on_release) def on_press(self, event): # event.x / event.y 是鼠标在窗口内的相对坐标 self._offset (event.x, event.y) self._dragging True self.state drag def on_motion(self, event): if not self._dragging: return # event.x_root / event.y_root 是鼠标在屏幕上的绝对坐标 x event.x_root - self._offset[0] y event.y_root - self._offset[1] self.root.geometry(f{x}{y}) def on_release(self, event): self._dragging False self.state idle这里event.x和event.x_root的区别是核心。前者是相对当前 widget 的坐标后者是相对屏幕的坐标。记录偏移用的是相对坐标计算新窗口位置用的是屏幕坐标两边不能混用。geometry(f{x}{y})只传偏移量不传宽高Tk 会保留当前窗口尺寸这是最轻量的移动方式。如果你的帧图尺寸很大拖动时可能会感觉到掉帧那是因为每次geometry调用都会触发一次完整的重算。解决办法是在on_motion里做节流记录上一次移动的时间距离上一次不足 16ms 就忽略这次事件。3.3 右键菜单与托盘常驻退出入口要统一无边框窗口没有系统菜单所以右键菜单和系统托盘必须自己接。右键菜单用 Tk 的Menu托盘用 pystray两者都要指向同一个退出函数。这里的关键教训是退出逻辑必须只有一个入口否则会出现“窗口关了进程还在”的灵异现象。import threading import pystray from PIL import Image import tkinter as tk def quit_pet(iconNone, itemNone): # 先停托盘再退出主循环顺序不能反 if icon is not None: icon.stop() root.quit() root.destroy() root tk.Tk() menu tk.Menu(root, tearoff0) menu.add_command(label退出宠物, commandquit_pet) root.bind(Button-3, lambda e: menu.tk_popup(e.x_root, e.y_root)) tray_icon pystray.Icon( desktop_pet, # 托盘图标的唯一标识 Image.open(icon.png), # 托盘图标建议 32x32 桌面宠物, # 鼠标悬停在托盘图标上的提示 menupystray.Menu( pystray.MenuItem(退出宠物, quit_pet) ), ) threading.Thread(targettray_icon.run, daemonTrue).start() root.mainloop()pystray 的run()是一个阻塞调用它会启动自己的消息循环所以必须放进独立线程否则root.mainloop()永远执行不到。daemonTrue保证 Python 主线程退出时托盘线程不会成为进程残留的元凶。菜单项里的quit_pet和右键菜单里的quit_pet是同一个函数这是统一退出入口的关键。如果右键菜单调root.quit()托盘菜单调icon.stop()两者都会留下一半的清理工作表现就是用户杀不干净进程。另外托盘图标建议在初始化时判断一下系统是否支持有些精简 Windows 环境没有 Shell_TrayWndpystray 启动会直接抛异常这个异常要在线程里 catch 住并打印日志。4. 桌面宠物避坑实录透明残留、拖拽跳动、托盘退不干净等 5 个坎4.1 坑一圆角边缘发白、透明色变成马赛克块现象宠物贴图边缘出现一圈白边圆角处尤其明显甚至整块不规则的半透明像素变成灰白相间的马赛克。原因Tkinter 的transparentcolor是色键透明它只能识别“完全等于该颜色”的像素。而 PNG 素材的 Alpha 通道是 8bit 渐变在透明与不透明交界处存在大量中间值像素这些像素既不是完全不透明也不是完全透明色键机制处理不了它们只能原样画出来。JPEG 压缩产生的颜色污染也会让本应是背景色的像素产生波动出现脏边。解决素材统一使用 PNG并且在加载时把 Alpha 通道合成为色键色背景上的不透明像素就是用Image.new(RGB, size, KEY_COLOR)打底再用frame.split()[3]作为 mask 进行paste。这个操作会把半透明边缘像素过渡成接近色键色的实色让边缘看起来至少是干净的。如果素材本身带高精度抗锯齿效果可以把边缘裁剪成硬边风格用设计上的取舍绕开色键缺陷。4.2 坑二动画越跑越慢半小时后变成 PPT现象宠物刚启动时动画秒切换运行十分钟后明显变慢半小时后像幻灯片重启程序后恢复。原因root.after(FRAME_MS, self.tick)的延时是从调用时刻开始计算的。如果tick函数里帧切换、图片更新耗时 40ms而你设定的是 120ms实际每帧变成 160ms这还不是最要命的。真正的问题是当系统忙时某次after被阻塞了 300ms恢复后计时器依然按 120ms 累加误差就永久累积了。解决用绝对时间戳对齐帧。代码里维护一个deadline每帧切换后deadline FRAME_MS与当前时间比较。如果落后超过一整帧直接deadline now FRAME_MS跳帧避免积压。这也是为什么我在第 2 章把tick写成那样而不是简单的after(FRAME_MS)。4.3 坑三拖拽时位置跳动或窗口闪烁现象鼠标按下宠物时宠物先飞到手边再开始跟随拖动过程中窗口一抖一抖的边缘有残影。原因飞到手边是因为没有记录偏移直接把event.x_root当成了窗口左上角。抖动则是因为B1-Motion事件触发的频率远高于屏幕刷新率每次触发都调用geometryTk 被迫频繁重算窗口位置GPU 合成跟不上就闪。解决按下时用event.x和event.y记录鼠标在窗口内部的偏移移动时用event.x_root - offset_x计算窗口位置。如果还闪在on_motion里加时间戳节流例如记录上一次移动的毫秒时间距离不足 16ms 直接 return。这两个动作一起做拖拽手感基本能达到系统窗口的水平。4.4 坑四托盘点了退出窗口关了进程却在后台常驻现象托盘菜单点“退出宠物”图标消失宠物窗口也关掉了但任务管理器里进程依然存在CPU 偶尔还占一点。原因退出函数只调了icon.stop()没有调root.quit()。pystray 的stop()只是让托盘线程结束Tk 主循环还活着。反过来只调root.quit()不调icon.stop()托盘线程因为没有显式回收会阻塞 Python 解释器退出同样形成残留。两条退出路径各管一半是最常见的场景。解决统一退出入口先icon.stop()再root.quit()最后root.destroy()。右键菜单、托盘菜单都调用同一个函数。另外给pystray.Icon.run()加一个 try/except避免某些 Windows 环境下托盘线程抛出异常导致退出流程中断。4.5 坑五高分屏下宠物尺寸和坐标全乱现象同样的代码在 1080p 正常在 4K 屏上宠物变得特别小或者拖到屏幕边缘定位不准点不到想点的地方。原因Tk 默认不感知进程 DPI 缩放。在系统缩放为 150% 或 200% 时event.x_root返回的坐标和窗口实际显示位置之间产生了比例偏差winfo_screenwidth()拿到的也是未经缩放的分辨率。程序被系统强制虚拟化坐标系就乱了。解决入口处提前设置 DPI 感知必须在创建tk.Tk()之前执行。import ctypes def enable_dpi_awareness(): try: ctypes.windll.shcore.SetProcessDpiAwareness(2) except Exception: try: ctypes.windll.user32.SetProcessDPIAware() except Exception: pass enable_dpi_awareness()SetProcessDpiAwareness(2)是 Per-Monitor DPI Aware窗口坐标按实际像素计算不再缩放。旧版 Windows 没有这个 API所以回退到SetProcessDPIAware()。PySide6 用户不需要这段只需要设置QGuiApplication的高 DPI 策略即可。5. 进阶与验证打包成 exe、开机自启与单实例锁桌面宠物做到能跑能交互只是第一步投入日常使用还需要解决三件事打包、自启、防双开。打包用 PyInstaller命令里的参数每一个都有实际意义。-F打单文件-w禁止控制台窗口否则开机自启时会弹黑框--collect-all pystray是血泪教训pystray 在 Windows 上运行时动态寻找后端打包经常漏文件导致目标机器上托盘消失或直接崩溃。pyinstaller -F -w desktop_pet.py --collect-all pystray --noconfirm打包完验证两件事第一双击 exe 后托盘图标是否正常出现第二拖拽和右键菜单是否都在。透明色键在 PyInstaller 打包后偶尔会失效原因是 tcl 资源没有打进包这种情况给 PyInstaller 加--collect-tcltk基本都能解决。开机自启的常见做法是把 exe 放进启动目录用%APPDATA路径定位。cp dist/desktop_pet.exe $APPDATA/Microsoft/Windows/Start Menu/Programs/Startup/开机自启后立刻面临一个现实问题如果用户又从命令行手动开一次桌面上会出现两只宠物互叠状态机各跑各的。所以加一个单实例锁用临时目录下的锁文件实现。import os import sys import tempfile LOCK os.path.join(tempfile.gettempdir(), desktop_pet.lock) def check_single_instance(): if os.path.exists(LOCK): return False open(LOCK, w).close() return True注意退出时要显式删除锁文件否则程序崩溃后锁会残留用户以后再也打不开宠物。这个坑我在调试时撞上过托盘退出逻辑调顺了单实例锁又因为异常没有清理排查了半天才发现是锁文件没删。我的习惯是给项目加一个 debug 开关打开后把状态切换、拖拽、退出事件全部打进日志文件。桌面宠物这类交互逻辑看起来简单真出了问题光靠看窗口现象很难定位日志是最直接的排错方式。如果你决定照着做从最小透明窗口跑通再到状态机和模块然后补打包这一趟下来你对 Tkinter 的窗口模型会有很完整的认知。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

阿里云代理采购怎么核验:订单、合同与发票该由谁负责

阿里云代理采购怎么核验:订单、合同与发票该由谁负责

代理采购里,下单、签约、开票和服务责任可能由不同主体负责,需要逐项用书面文件对齐,而不是只看对方是否为阿里云合作伙伴。核验的重点不是“是不是代理”,而是“每一笔责任由谁承担”。四条链条能对接清楚,采购过程才…

2026/10/15 14:18:21 阅读更多 →
Spring Data JPA实战:从入门到性能优化

Spring Data JPA实战:从入门到性能优化

1. Spring Data JPA 初探:为什么选择它?第一次接触Spring Data JPA时,我正被传统JDBC繁琐的CRUD操作折磨得够呛。记得当时有个项目需要管理50多张表的增删改查,光是写重复的SQL就占用了70%的开发时间。直到尝试了JPA,才…

2026/10/15 14:17:20 阅读更多 →
Lodash中KeyBy与GroupBy的核心差异与应用场景

Lodash中KeyBy与GroupBy的核心差异与应用场景

1. 理解集合操作的核心差异在数据处理和函数式编程中,对集合进行分组和键控操作是日常开发的高频需求。lodash作为JavaScript生态中最流行的工具库之一,其提供的lo.KeyBy和lo.GroupBy方法看似功能相似,实则存在本质区别。这两个方法都属于集合…

2026/10/15 14:17:20 阅读更多 →

最新新闻

HospitalRun 前端项目演进全解:从 CHANGELOG 读懂 2.0 架构、破坏性变更与工程实践

HospitalRun 前端项目演进全解:从 CHANGELOG 读懂 2.0 架构、破坏性变更与工程实践

前端企业应用 【免费下载链接】hospitalrun-frontend Frontend for HospitalRun 项目地址: https://gitcode.com/gh_mirrors/ho/hospitalrun-frontend 点击查看 免费下载 本文以 HospitalRun 前端仓库(hospitalrun/frontend,当前版本 2.0.0-…

2026/10/15 17:15:25 阅读更多 →
LLC谐振参数计算实例:Mathcad工作表实现与增益曲线绘制

LLC谐振参数计算实例:Mathcad工作表实现与增益曲线绘制

简介:这份资源面向电力电子工程师与开关电源设计学习者,提供基于Mathcad的LLC谐振转换器参数计算实例,帮助解决谐振频率、变压器匝比、谐振电容电感等关键参数的计算与验证问题。压缩包共5个文件,包含3张jpg图片、1个txt文本和1个…

2026/10/15 17:15:25 阅读更多 →
安装包已更新,用户为什么还会下载到旧版本?

安装包已更新,用户为什么还会下载到旧版本?

创作说明:本文由 AI 辅助整理,协议说明参考 MDN。文中的路径和版本号均为假设示例,不代表某个生产站点的配置或测试结果。 假设一个站点始终使用 /download/current.exe,发布时直接替换这个路径对应的文件。服务器目录里已经是新…

2026/10/15 17:15:25 阅读更多 →
树莓派3B驱动0.96寸OLED:SSD1306的I2C初始化、显存与排障

树莓派3B驱动0.96寸OLED:SSD1306的I2C初始化、显存与排障

简介:面向树莓派3B玩家及嵌入式初学者,压缩包内是基于WiringPi库的0.96寸OLED(I2C接口)驱动示例工程,解决了在树莓派上快速点亮并控制OLED屏幕的常见需求。资源共10个文件,以C源码为主,包含oled…

2026/10/15 17:15:25 阅读更多 →
手写前端轻量监控工具rea:用过程数据回放排查线上性能问题

手写前端轻量监控工具rea:用过程数据回放排查线上性能问题

1. 为什么我会自己动手写 rea 这个工具1.1 一次线上事故把我逼到了墙角事情是这样的。半年前我做的一个前端项目在发版后的第三天,线上陆续出现首页白屏、按钮点了没反应、接口偶发超时报错的反馈。奇怪的是,我在本地开发环境里怎么折腾都复现不出来&…

2026/10/15 17:15:25 阅读更多 →
ASP.NET 实现 QQ 在线客服:可配置、权重轮询与移动端适配方案

ASP.NET 实现 QQ 在线客服:可配置、权重轮询与移动端适配方案

简介:这份资源面向具备一定C#与Web开发基础的ASP.NET学习者,围绕“QQ在线客服”这一典型场景,提供一套可参考的实现代码与配套素材,帮助理解如何将第三方开放平台能力嵌入自有网站。压缩包共14个文件,约117KB&#xff…

2026/10/15 17:14:23 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/15 16:18:54 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/15 13:48:15 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 9:49:14 阅读更多 →