news 2026/8/21 21:24:54

Python桌面通知工具开发:仿环世界风格的非侵入式告警系统

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Python桌面通知工具开发:仿环世界风格的非侵入式告警系统

大家好,我是专注于分享实用开发工具和项目实战的博主。在日常开发或运维工作中,你是否遇到过这样的困扰:服务器监控告警、自动化脚本执行结果、CI/CD构建状态等关键信息,只能通过频繁刷新网页或查看日志文件来获取,不仅效率低下,还容易错过重要通知。如果有一个像游戏《环世界》里那样,信息以简洁、非侵入式的“信件”形式,直接推送到你的桌面角落,那该多方便。

今天,我就来分享一个我模仿《环世界》信件系统风格,用 Python 开发的开源桌面告警小工具。它可以将各种来源的文本信息,以美观的弹窗形式展示在 Windows 桌面右下角,支持自定义样式、停留时间和点击事件,非常适合用于接收系统通知、监控告警、任务完成提醒等场景。本文将手把手带你从零理解其原理、搭建开发环境、编写核心代码,并最终打包成一个可独立运行的.exe程序。

1. 项目背景与核心概念

1.1 什么是“环世界”信件系统?

《环世界》(RimWorld)是一款深受玩家喜爱的模拟经营游戏。其 UI 设计的一大亮点是“信件系统”:当游戏中发生重要事件(如贸易请求、袭击警报、任务完成)时,系统不会用全屏弹窗打断你的操作,而是在屏幕右下角生成一个简洁的通知卡片。这个卡片会短暂停留,然后自动收起,你可以点击查看详情或直接忽略。这种设计既保证了信息的及时送达,又最大限度地减少了对玩家当前操作的干扰。

1.2 桌面告警工具的需求与价值

在软件开发、运维和日常办公中,我们同样需要一种“非打断式”的信息推送方式。传统的解决方案如:

  • 邮件/即时通讯软件:容易被海量消息淹没,重要通知可能被错过。
  • 系统托盘气泡:Windows 原生通知功能较弱,自定义程度低,且容易被系统设置屏蔽。
  • 全屏弹窗/声音警报:过于粗暴,会打断当前工作流。

因此,一个模仿《环世界》风格的桌面告警工具应运而生。它的核心价值在于:

  • 优雅非侵入:信息以卡片形式出现在桌面角落,不抢占焦点。
  • 高度可定制:可以自由定义卡片的标题、内容、颜色、图标、停留时间。
  • 轻量级集成:可以通过简单的脚本调用(如 Python、命令行)发送通知,易于与现有系统(如 Zabbix、Jenkins、自定义脚本)集成。
  • 提升效率:开发者/运维人员无需切换上下文,即可感知系统状态变化。

1.3 技术栈选型

为了实现这个工具,我们选择以下技术栈:

  • 开发语言:Python。语法简洁,生态丰富,非常适合开发此类桌面小工具。
  • GUI 库tkinter。Python 的标准 GUI 库,无需额外安装,兼容性好,足以实现我们需要的简单窗口效果。
  • 打包工具PyInstaller。可以将 Python 脚本及其依赖打包成独立的.exe可执行文件,方便在没有 Python 环境的 Windows 电脑上运行。
  • 交互方式:支持命令行参数调用,便于其他程序集成。

2. 环境准备与版本说明

在开始编码之前,请确保你的开发环境已就绪。

2.1 操作系统

本教程主要针对Windows 10/11系统。工具的核心代码基于tkinter,该库在 Windows 上表现最为稳定。虽然理论上也支持 macOS 和 Linux,但窗口管理和行为可能略有差异,本文不做重点讨论。

2.2 Python 环境

你需要安装 Python 3.6 及以上版本。推荐使用 Python 3.8 或 3.9,它们在兼容性和稳定性上表现良好。

  1. 下载安装:访问 Python 官网 下载对应 Windows 的安装包。安装时务必勾选 “Add Python to PATH” 选项。
  2. 验证安装:打开命令提示符(CMD)或 PowerShell,输入以下命令:
    python --version
    如果显示类似Python 3.9.13的版本信息,说明安装成功。
  3. 安装必要库:我们主要使用标准库,但为了打包,需要安装PyInstaller
    pip install pyinstaller

2.3 代码编辑器

你可以使用任何喜欢的文本编辑器或 IDE,例如:

  • Visual Studio Code (推荐,轻量且插件丰富)
  • PyCharm
  • Sublime Text
  • 甚至系统的记事本

2.4 项目结构规划

我们先创建一个清晰的项目目录,便于管理代码和资源。

desktop-alert-tool/ │ ├── src/ │ ├── alert.py # 告警弹窗核心类 │ ├── config.py # 配置文件或常量定义 │ └── __init__.py │ ├── assets/ # 资源文件夹 │ ├── icons/ # 图标文件 │ └── sounds/ # 提示音文件 (可选) │ ├── main.py # 主程序入口/命令行接口 ├── requirements.txt # 项目依赖列表 ├── build.py # 打包脚本 (可选) └── README.md # 项目说明文档

你可以先在桌面上创建一个名为desktop-alert-tool的文件夹,并按照上述结构创建子文件夹和空文件。

3. 核心原理与tkinter窗口控制

在动手写代码前,理解tkinter如何创建和控制一个“永远置顶”、“无边框”、“位于屏幕角落”的窗口是关键。

3.1 创建一个基本窗口

tkinter的基本单位是Tk对象,代表主窗口。但我们的通知窗口不需要是主窗口,可以使用Toplevel部件。

# 示例:创建一个最简单的窗口 import tkinter as tk root = tk.Tk() root.title(“测试窗口”) root.geometry(“300x150”) # 宽x高 root.mainloop()

运行这段代码会弹出一个标准的、可关闭的窗口。但这离我们的目标还很远。

3.2 实现“环世界”风格的关键属性

我们需要对窗口进行一系列特殊设置:

  1. 无标题栏和边框overrideredirect(True)。这会使窗口失去系统装饰(关闭、最小化按钮),变成一个纯粹的矩形区域。
  2. 窗口置顶attributes(‘-topmost’, True)。确保通知窗口始终显示在其他窗口之上。
  3. 设置窗口位置geometry(‘+X+Y’)。通过计算屏幕的宽度和高度,将窗口定位到右下角。例如,对于 1920x1080 的屏幕,右下角坐标可能是+1620+980(留出边距)。
  4. 背景透明与圆角(可选):可以通过设置窗口背景色,并结合wm_attributes(‘-transparentcolor’, ‘颜色’)实现某种透明效果,但实现完美的圆角需要更复杂的 Canvas 绘图。我们后续会用一个简单方法模拟。

3.3 窗口的动画与生命周期

一个完整的通知生命周期包括:

  • 滑入:窗口从屏幕右侧外部平滑移动到目标位置。
  • 停留:保持显示一段时间(如5秒)。
  • 滑出/淡出:时间到后,窗口平滑移出屏幕或淡出消失。
  • 点击事件:用户点击通知时,可以触发一个动作(如打开链接、执行命令)。

tkinter本身没有内置的复杂动画引擎,但我们可以通过循环小幅调整窗口的geometry来实现简单的移动动画,使用after方法进行延时控制。

4. 完整实战:构建桌面告警工具

接下来,我们将一步步实现这个工具。我们将核心功能封装在AlertWindow类中。

4.1 创建核心告警窗口类 (src/alert.py)

这是项目最核心的文件。

# 文件路径:src/alert.py import tkinter as tk from tkinter import font as tkFont import time class AlertWindow: """ 模仿环世界风格的桌面告警窗口类。 """ def __init__(self, title=“通知”, message=“这是一条通知内容”, duration=5000, bg_color=“#2d2d30”, fg_color=“#ffffff”): """ 初始化告警窗口。 :param title: 通知标题 :param message: 通知正文 :param duration: 显示时长(毫秒) :param bg_color: 窗口背景色 :param fg_color: 文字颜色 """ self.title = title self.message = message self.duration = duration self.bg_color = bg_color self.fg_color = fg_color # 创建顶层窗口 self.window = tk.Toplevel() self.window.overrideredirect(True) # 无边框 self.window.attributes(‘-topmost’, True) # 置顶 # 设置窗口样式 self.window.configure(bg=self.bg_color) # 添加一个细边框来模拟卡片效果,颜色稍亮于背景 border_color = self._adjust_color(self.bg_color, 20) self.window.configure(highlightbackground=border_color, highlightthickness=1) # 计算窗口大小和位置 self._setup_ui() self._set_position() # 绑定点击事件 self.window.bind(‘<Button-1>’, self._on_click) # 左键点击 # 可选:绑定鼠标悬停事件来暂停计时 self.window.bind(‘<Enter>’, self._pause_timer) self.window.bind(‘<Leave>’, self._resume_timer) # 设置自动关闭定时器 self.auto_close_id = self.window.after(self.duration, self._slide_out) # 入场动画 self._slide_in() def _adjust_color(self, hex_color, adjust): """简单调整颜色亮度。""" # 这是一个简化实现,实际项目可使用 colorsys 库 r = int(hex_color[1:3], 16) g = int(hex_color[3:5], 16) b = int(hex_color[5:7], 16) r = min(255, max(0, r + adjust)) g = min(255, max(0, g + adjust)) b = min(255, max(0, b + adjust)) return f’#{r:02x}{g:02x}{b:02x}‘ def _setup_ui(self): """设置窗口内部的UI组件。""" # 使用 Frame 作为内部容器,便于布局 inner_frame = tk.Frame(self.window, bg=self.bg_color) inner_frame.pack(padx=12, pady=12, fill=“both”, expand=True) # 标题 - 使用加粗字体 title_font = tkFont.Font(family=“Segoe UI”, size=10, weight=“bold”) title_label = tk.Label(inner_frame, text=self.title, font=title_font, fg=self.fg_color, bg=self.bg_color, anchor=“w”) title_label.pack(fill=“x”, pady=(0, 5)) # 分隔线 separator = tk.Frame(inner_frame, height=1, bg=self._adjust_color(self.bg_color, -30)) separator.pack(fill=“x”, pady=5) # 消息正文 - 使用普通字体,支持自动换行 msg_font = tkFont.Font(family=“Segoe UI”, size=9) # 计算一个合适的宽度,比如屏幕宽度的1/6 screen_width = self.window.winfo_screenwidth() max_msg_width = int(screen_width / 6) message_label = tk.Label(inner_frame, text=self.message, font=msg_font, fg=self.fg_color, bg=self.bg_color, wraplength=max_msg_width, justify=“left”) message_label.pack(fill=“x”, anchor=“w”) # 更新时间标签(右下角) time_str = time.strftime(“%H:%M:%S”) time_font = tkFont.Font(family=“Segoe UI”, size=8) time_label = tk.Label(inner_frame, text=time_str, font=time_font, fg=self._adjust_color(self.fg_color, -80), bg=self.bg_color) time_label.pack(side=“right”, pady=(5, 0)) # 存储内部组件引用,便于后续操作 self.inner_frame = inner_frame self.title_label = title_label self.message_label = message_label self.time_label = time_label # 更新窗口大小以适应内容 self.window.update_idletasks() self.window_width = self.window.winfo_width() self.window_height = self.window.winfo_height() def _set_position(self): """将窗口定位到屏幕右下角。""" screen_width = self.window.winfo_screenwidth() screen_height = self.window.winfo_screenheight() # 右下角坐标,留出一些边距(如20像素) x = screen_width - self.window_width - 20 y = screen_height - self.window_height - 20 self.window.geometry(f’{self.window_width}x{self.window_height}+{int(x)}+{int(y)}‘) # 初始位置设在屏幕右侧之外,为滑入动画做准备 self.start_x = screen_width self.start_y = y self.window.geometry(f’+{self.start_x}+{int(self.start_y)}‘) def _slide_in(self): """滑入动画:从右侧外滑入到目标位置。""" current_x = self.window.winfo_x() target_x = self.window.winfo_screenwidth() - self.window_width - 20 if current_x > target_x: new_x = current_x - 15 # 每次移动15像素 if new_x < target_x: new_x = target_x self.window.geometry(f’+{new_x}+{self.start_y}‘) # 每10毫秒移动一次,形成动画 self.window.after(10, self._slide_in) # else: 动画结束 def _slide_out(self): """滑出动画:向右滑出屏幕。""" current_x = self.window.winfo_x() screen_width = self.window.winfo_screenwidth() if current_x < screen_width: new_x = current_x + 15 self.window.geometry(f’+{new_x}+{self.start_y}‘) self.window.after(10, self._slide_out) else: self.window.destroy() # 动画结束后销毁窗口 def _on_click(self, event): """点击窗口的事件处理。""" print(f“通知被点击: {self.title}”) # 这里可以扩展为打开URL、执行命令等。 # 例如:import webbrowser; webbrowser.open(“https://www.example.com”) self._cancel_auto_close() self._slide_out() # 点击后立即滑出 def _pause_timer(self, event): """鼠标悬停时暂停自动关闭计时器。""" if self.auto_close_id: self.window.after_cancel(self.auto_close_id) self.auto_close_id = None def _resume_timer(self, event): """鼠标移出时恢复自动关闭计时器。""" if not self.auto_close_id: self.auto_close_id = self.window.after(self.duration, self._slide_out) def _cancel_auto_close(self): """取消自动关闭。""" if self.auto_close_id: self.window.after_cancel(self.auto_close_id) self.auto_close_id = None def show(self): """显示窗口(实际上在 __init__ 中已启动)。""" # 对于单次通知,通常不需要单独调用,因为初始化后动画就开始。 # 这个方法可用于未来可能的复用。 pass

4.2 创建主程序与命令行接口 (main.py)

我们需要一个方便调用的入口,支持通过命令行参数发送通知。

# 文件路径:main.py import sys import tkinter as tk from src.alert import AlertWindow import argparse def send_alert(title, message, duration=5000): """ 发送一条桌面告警。 注意:必须在 tkinter 主循环的线程中调用。 """ # 创建隐藏的主窗口,这是 tkinter 所必需的 root = tk.Tk() root.withdraw() # 隐藏主窗口 # 创建告警窗口 alert = AlertWindow(title=title, message=message, duration=duration) # 启动 tkinter 主事件循环 root.mainloop() def main(): """命令行主函数。""" parser = argparse.ArgumentParser(description=‘环世界风格桌面告警工具’) parser.add_argument(‘-t’, ‘–title’, type=str, default=‘通知’, help=‘告警标题’) parser.add_argument(‘-m’, ‘–message’, type=str, required=True, help=‘告警正文内容’) parser.add_argument(‘-d’, ‘–duration’, type=int, default=5000, help=‘显示时长(毫秒),默认5000’) args = parser.parse_args() # 调用发送函数 send_alert(args.title, args.message, args.duration) if __name__ == ‘__main__‘: main()

4.3 运行与测试

现在,我们可以测试我们的工具了。

  1. 直接运行 Python 脚本: 打开命令行,切换到项目目录,运行:

    python main.py -m “你的第一条告警消息!”

    你应该能看到一个深色背景的通知卡片从屏幕右侧滑入,停留5秒后滑出。点击它,它会立即滑出。

  2. 使用更多参数

    python main.py -t “任务完成” -m “数据库备份已成功执行。” -d 8000

    这将显示一个标题为“任务完成”,内容为“数据库备份已成功执行。”,停留8秒的通知。

4.4 与其他程序集成示例

这个工具的强大之处在于可以被任何能调用命令行或执行 Python 代码的程序调用。

  • 在 Python 脚本中调用

    # 在你的业务脚本中 import subprocess subprocess.run([‘python’, ‘path/to/main.py’, ‘-t’, ‘监控告警’, ‘-m’, ‘CPU 使用率超过 90%!’])
  • 在 Windows 批处理文件 (.bat) 中调用

    @echo off python C:\path\to\your\main.py -t “构建结果” -m “项目构建成功!” pause
  • 在 Jenkins Pipeline 中调用(Post-build Actions): 你可以添加一个执行 Windows 批处理命令的构建后步骤,调用此工具通知构建状态。

5. 打包成独立可执行文件 (.exe)

为了让没有 Python 环境的电脑也能使用,我们需要用 PyInstaller 打包。

5.1 创建打包规范

在项目根目录创建一个build.spec文件(或直接使用命令行参数),但使用 spec 文件更规范。

# 文件路径:build.spec # -*- mode: python ; coding: utf-8 -*- block_cipher = None a = Analysis( [‘main.py’], pathex=[], binaries=[], datas=[], # 如果需要包含图标等资源文件,在这里添加,如 [(‘assets/icons/alert.ico’, ‘assets/icons’)] hiddenimports=[], hookspath=[], hooksconfig={}, runtime_hooks=[], excludes=[], noarchive=False, ) pyz = PYZ(a.pure) exe = EXE( pyz, a.scripts, a.binaries, a.datas, [], name=‘DesktopAlert’, # 生成的 exe 文件名 debug=False, bootloader_ignore_signals=False, strip=False, upx=True, # 使用 UPX 压缩,减小体积 console=False, # 设置为 True 会显示控制台窗口,False 则完全隐藏(更适合后台通知) icon=‘assets/icons/alert.ico’, # 指定 exe 的图标文件 disable_windowed_traceback=False, argv_emulation=False, target_arch=None, codesign_identity=None, entitlements_file=None, )

注意:你需要准备一个.ico格式的图标文件放在assets/icons/目录下。如果不需要图标,可以删除icon那一行。

5.2 执行打包命令

在项目根目录打开命令行,运行:

pyinstaller build.spec

或者,如果你没有 spec 文件,可以使用一行命令:

pyinstaller –onefile –windowed –icon=assets/icons/alert.ico –name DesktopAlert main.py

参数解释:

  • –onefile:打包成单个 exe 文件。
  • –windowed:不显示控制台窗口(对于 GUI 程序)。
  • –icon:指定程序图标。
  • –name:指定输出文件名。

打包完成后,在项目目录下会生成一个dist文件夹,里面就是DesktopAlert.exe文件。你可以将这个文件复制到任何 Windows 电脑上运行。

5.3 使用打包后的 exe

现在,你可以像使用任何命令行工具一样使用它:

DesktopAlert.exe -t “来自EXE的通知” -m “我已经是一个独立的程序了!”

或者,你可以创建一个快捷方式,并设置好参数,双击即可发送特定通知。

6. 常见问题与排查思路

在开发和使用过程中,你可能会遇到以下问题:

问题现象可能原因解决思路
运行python main.py无任何反应,也没有错误。1.tkinter未正确安装(某些精简版 Python)。
2. 脚本路径错误。
1. 在命令行输入python -m tkinter,如果弹出一个简单窗口,则tkinter正常。
2. 确保在包含main.py的目录下执行命令。
通知窗口不置顶,被其他窗口覆盖。attributes(‘-topmost’, True)可能在某些系统或窗口管理器下失效。可以尝试在_slide_in动画结束后再次调用self.window.attributes(‘-topmost’, True)进行强化。
窗口位置计算不准,跑到屏幕外面去了。多显示器环境下,winfo_screenwidth()可能返回的是所有显示器的总宽度。使用winfo_pointerx()winfo_pointery()结合判断当前活动显示器,或者使用第三方库如screeninfo来获取更精确的显示器信息。
打包后的 exe 文件体积很大(几十MB)。PyInstaller 打包了 Python 解释器和所有依赖库。这是正常现象。可以使用UPX压缩(PyInstaller 已集成),或尝试使用–exclude-module排除不必要的库(风险较高)。
点击通知没有反应。1. 事件绑定失败。
2. 点击事件处理函数_on_click中有错误。
1. 检查self.window.bind(‘<Button-1>’, self._on_click)是否执行。
2. 在_on_click函数内添加print语句或日志,查看是否被调用。
多个通知同时出现时重叠在一起。当前逻辑每个通知独立计算位置,都是从同一个坐标开始滑入。需要实现一个通知管理器(NotificationManager),维护一个通知队列,并动态计算每个新通知的位置(基于上一个通知的位置)。

7. 进阶优化与最佳实践

基础功能已经实现,但一个健壮的工具还需要更多考虑。

7.1 实现通知队列与管理器

为了避免多个通知重叠,我们需要一个中央管理器来协调。

# 文件路径:src/manager.py (示例思路) import threading from queue import Queue from .alert import AlertWindow import tkinter as tk class NotificationManager: _instance = None _lock = threading.Lock() def __new__(cls): with cls._lock: if cls._instance is None: cls._instance = super().__new__(cls) cls._instance._init_manager() return cls._instance def _init_manager(self): self.notification_queue = Queue() self.active_notifications = [] # 存储当前活跃的通知窗口引用 self.root = tk.Tk() self.root.withdraw() # 启动一个后台线程处理队列 self.worker_thread = threading.Thread(target=self._process_queue, daemon=True) self.worker_thread.start() def _process_queue(self): """从队列中取出通知并显示。""" while True: title, message, duration = self.notification_queue.get() # 在主线程中创建Tkinter窗口 self.root.after(0, self._show_notification, title, message, duration) self.notification_queue.task_done() def _show_notification(self, title, message, duration): """计算位置并显示一个通知。""" # 计算新通知的Y坐标(基于已存在通知的高度和间距) base_y = self.root.winfo_screenheight() - 20 for notif in self.active_notifications: base_y -= (notif.window_height + 10) # 10像素间距 # 创建窗口,传入计算好的起始Y坐标(需要修改AlertWindow以接受起始位置参数) # alert = AlertWindow(title, message, duration, start_y=base_y) # self.active_notifications.append(alert) # 当通知关闭时,需要将其从 active_notifications 中移除 def send_notification(self, title, message, duration=5000): """公共接口:发送通知。""" self.notification_queue.put((title, message, duration)) # 使用方式 # manager = NotificationManager() # manager.send_notification(“标题”, “内容”)

7.2 增加更多自定义选项

  • 颜色主题:可以预设几套配色方案(如成功-绿色、警告-黄色、错误-红色、信息-蓝色)。
  • 图标:在标题旁添加一个图标(使用tk.PhotoImagePIL库)。
  • 声音提示:使用winsound(仅Windows)或playsound库在通知弹出时播放简短提示音。
  • 持久化与历史:将通知记录到本地文件或数据库,并提供历史查看界面。
  • 网络接收:创建一个简单的 HTTP 服务器,允许通过网络 API 发送通知。

7.3 工程化建议

  • 日志记录:在工具中添加日志功能,记录通知的发送、显示、点击和关闭事件,便于调试。
  • 配置文件:使用 JSON 或 YAML 文件来存储默认的样式、位置、持续时间等配置。
  • 错误处理:对tkinter的主循环调用、文件读写、网络请求等操作进行完善的异常捕获和友好提示。
  • 代码结构:将 UI 逻辑、业务逻辑和配置管理进一步分离,遵循单一职责原则。

7.4 安全注意事项

  • 由于工具可以通过命令行参数执行,如果接收来自不可信源的消息,可能存在注入风险(虽然tkinter环境相对封闭)。在生产环境中集成时,应对传入的titlemessage进行适当的清理或转义,尽管它们通常只用于显示。
  • 如果实现了网络接收功能,务必对 API 进行认证和授权,避免任何人都能向你的桌面发送通知。

这个模仿《环世界》信件系统的桌面告警小工具就完成了。它从一个简单的想法出发,利用 Python 和tkinter实现了核心的桌面通知功能,并且可以通过打包成为独立工具,轻松集成到你的各种工作流中。项目的核心价值在于其“非侵入式”的设计理念和极高的可定制性。

你可以基于这个基础版本,按照第7节的建议进行扩展,打造一个完全符合自己需求的个性化通知中心。无论是监控报警、自动化脚本反馈,还是简单的日程提醒,它都能优雅地完成任务。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/21 21:24:48

3 步免费下载电子课本 PDF:tchMaterial-parser 开源工具完全实用指南

3 步免费下载电子课本 PDF&#xff1a;tchMaterial-parser 开源工具完全实用指南 【免费下载链接】tchMaterial-parser 国家中小学智慧教育平台 电子课本下载工具&#xff0c;帮助您从智慧教育平台中获取电子课本的 PDF 文件网址并进行下载&#xff0c;让您更方便地获取课本内容…

作者头像 李华
网站建设 2026/8/21 21:21:48

1-8-希尔排序-ShellSort

希尔排序 (Shell Sort)&#xff1a;分组插入的增量缩减 摘要&#xff1a;插入排序在小数据和近乎有序场景下表现出色&#xff0c;但面对完全逆序数据时退化为 O(n)——每个元素都要移动到底。希尔排序的核心洞察是&#xff1a;先做大跨度的粗排&#xff0c;再做小跨度的细排。通…

作者头像 李华
网站建设 2026/8/21 21:21:19

【AI】DeepSeek Harness 安装、运行、管理插件

◆ 博主名称&#xff1a; QuZhengRong AI俘虏&#xff0c;样式苦手 ⭐️ LuckReport专栏&#xff1a;LuckReport⭐️ SpringBoot专栏&#xff1a;SpringBoot⭐️ SpringCloud专栏&#xff1a;SpringCloud目录一、安装 nvm 管理 Node 版本二、拉取源码三、安装依赖并启动项目四、…

作者头像 李华
网站建设 2026/8/21 21:18:13

SolidWorks二次开发实战:装配体零件智能替换与配合关系自动重建

1. 先搞清楚“修改顶盖子装配”到底要解决什么实际问题 如果你在用 SolidWorks 做机械设计&#xff0c;尤其是处理包含大量标准件或系列化产品的装配体&#xff0c;大概率遇到过这个场景&#xff1a;一个顶盖零件&#xff0c;因为设计变更、型号切换或供应商替换&#xff0c;需…

作者头像 李华
网站建设 2026/8/21 21:13:58

智能无人消防车:社区景区厂区无人化消防巡检方案

智能无人消防车以L4级无人驾驶底盘、360多传感器感知和车载灭火系统为核心&#xff0c;把社区、景区、厂区的消防巡检从人工2小时一轮升级为724小时自动值守。以1条8公里巡检线路为基准&#xff0c;单车可替代2-3名夜间巡逻人员&#xff0c;并在发现明火、烟雾或高温异常后按预…

作者头像 李华