【开源】Python打造高效剪贴板历史管理器:实现跨平台生产力工具

article/2025/7/13 3:21:41

📋【开源】Python打造高效剪贴板历史管理器:实现跨平台生产力工具

请添加图片描述

🌈 个人主页:创客白泽 - CSDN博客
🔥 系列专栏:🐍《Python开源项目实战》
💡 热爱不止于代码,热情源自每一个灵感闪现的夜晚。愿以开源之火,点亮前行之路。
👍 如果觉得这篇文章有帮助,欢迎您一键三连,分享给更多人哦

请添加图片描述
在这里插入图片描述

一、概述:为什么需要剪贴板历史管理?

在日常工作和编程中,剪贴板是我们使用最频繁的功能之一。但Windows自带的剪贴板只能保存最近一次的内容,当我们需要回溯之前复制过的内容时,就显得力不从心。本文将介绍如何使用Python和PyQt5开发一个功能强大的剪贴板历史管理器,具有以下特点:

  • 实时监控剪贴板变化,自动保存历史记录
  • 支持快捷键快速粘贴历史内容(Ctrl+D+数字)
  • 美观的GUI界面,支持多种主题切换
  • 系统托盘运行,不占用任务栏空间
  • 历史记录持久化保存,重启不丢失
  • 内容搜索和分类管理功能

这个工具特别适合程序员、文字工作者和需要频繁复制粘贴的用户群体,能显著提高工作效率。

二、功能特性全解析

2.1 核心功能

  1. 剪贴板监控:实时检测剪贴板变化,自动保存新内容
  2. 历史记录管理:支持查看、复制、粘贴、删除历史记录
  3. 快速访问:通过快捷键(Ctrl+D+数字)快速粘贴最近9条记录
  4. 内容搜索:支持关键词搜索历史记录
  5. 数据持久化:自动保存历史记录到JSON文件

2.2 增强功能

  1. 多主题支持:提供默认、深色、蓝色、绿色、粉色五种主题
  2. 系统托盘集成:最小化到托盘,不影响工作区
  3. 智能去重:自动过滤连续重复内容
  4. 内容预览:列表显示内容摘要,点击查看完整内容
  5. 可配置选项
    • 设置历史记录最大数量(10-500条)
    • 启用/禁用快捷键
    • 切换自动粘贴功能
    • 设置开机启动(需额外配置)

三、效果展示

3.1 主界面

在这里插入图片描述

界面采用左右分栏设计:

  • 左侧:历史记录列表,按时间倒序排列
  • 右侧:详情查看区和功能操作区

四、实现步骤详解

4.1 环境准备

pip install PyQt5 keyboard pyperclip

4.2 项目结构

clipboard_manager/
│── main.py            # 主程序
│── clipboard_history.json  # 历史记录存储文件
│── icons/             # 图标资源
│   ├── icon16.png
│   ├── icon32.png
│   ├── icon48.png
│   └── icon256.png

4.3 核心实现流程

  1. 初始化应用

    • 创建QApplication和主窗口
    • 设置系统托盘图标
    • 加载历史记录文件
  2. 剪贴板监控

 self.clipboard_timer = QTimer(self)self.clipboard_timer.timeout.connect(self.check_clipboard)self.clipboard_timer.start(500)  # 每500ms检查一次
  1. 历史记录管理

    • 使用列表存储历史记录,每个记录包含内容、时间戳和预览
    • 实现添加、删除、清空等操作
    • 自动限制最大记录数
  2. 快捷键处理

 keyboard.add_hotkey(f'ctrl+d+{i}', lambda i=i: self.paste_from_history(i-1))
  1. UI构建

    • 使用QVBoxLayout和QHBoxLayout构建灵活布局
    • 为各组件添加样式表美化界面
    • 实现主题切换功能

五、关键代码解析

5.1 剪贴板监控实现

def check_clipboard(self):"""检查剪贴板内容是否变化"""current_clipboard = pyperclip.paste()if current_clipboard and (not self.history or current_clipboard != self.history[0]['content']):self.add_to_history(current_clipboard)

这段代码通过定时器定期检查剪贴板内容,当发现新内容且与最近记录不同时,将其添加到历史记录中。

5.2 历史记录数据结构

history_item = {'content': content,  # 完整内容'timestamp': datetime.now().strftime("%Y-%m-%d %H:%M:%S"),  # 时间戳'preview': content[:50] + ("..." if len(content) > 50 else "")  # 预览
}

每个历史记录项都包含这三个字段,便于显示和管理。

5.3 快捷键处理

def paste_from_history(self, index):"""通过快捷键粘贴指定索引的历史记录"""if 0 <= index < len(self.history):pyperclip.copy(self.history[index]['content'])if self.auto_paste:keyboard.send('ctrl+v')

这段代码实现了通过快捷键快速粘贴历史记录的功能,同时支持自动粘贴模式。

5.4 主题切换实现

def change_theme(self, theme_name):"""更改应用程序主题"""if theme_name == "默认":self.setStyleSheet("")elif theme_name == "深色":self.set_dark_theme()# 其他主题...

通过动态修改样式表(QSS)实现主题切换,每种主题定义了不同的颜色方案。

六、完整源码下载

import sys
import os
import json
import keyboard
import pyperclip
from datetime import datetime
from PyQt5.QtWidgets import (QApplication, QMainWindow, QWidget, QVBoxLayout, QHBoxLayout, QListWidget, QPushButton, QLabel, QLineEdit, QTextEdit, QComboBox, QSpinBox, QCheckBox, QMessageBox, QSystemTrayIcon, QMenu, QAction, QStyle, QListWidgetItem)
from PyQt5.QtCore import Qt, QTimer, QSize
from PyQt5.QtGui import QIcon, QColor, QPalette, QFont, QBrushclass ClipboardHistoryApp(QMainWindow):def __init__(self):super().__init__()# 初始化设置self.history = []self.max_history = 100self.hotkeys_enabled = Trueself.auto_paste = Trueself.start_with_system = Falseself.history_file = "clipboard_history.json"# 加载历史记录self.load_history()# 初始化UIself.init_ui()# 设置系统托盘self.init_system_tray()# 设置定时器检查剪贴板变化self.clipboard_timer = QTimer(self)self.clipboard_timer.timeout.connect(self.check_clipboard)self.clipboard_timer.start(500)  # 每500毫秒检查一次# 注册全局快捷键self.register_hotkeys()# 设置窗口样式self.set_window_style()def init_ui(self):"""初始化用户界面"""self.setWindowTitle("剪贴板历史管理器")self.setGeometry(100, 100, 800, 600)# 主窗口部件main_widget = QWidget()self.setCentralWidget(main_widget)# 主布局main_layout = QHBoxLayout()main_widget.setLayout(main_layout)# 左侧面板 - 历史记录列表left_panel = QWidget()left_layout = QVBoxLayout()left_panel.setLayout(left_layout)self.history_list = QListWidget()self.history_list.setStyleSheet("""QListWidget {background-color: #f0f0f0;border: 1px solid #ccc;border-radius: 5px;padding: 5px;}QListWidget::item {padding: 8px;border-bottom: 1px solid #ddd;}QListWidget::item:hover {background-color: #e0e0e0;}QListWidget::item:selected {background-color: #4CAF50;color: white;}""")self.history_list.itemClicked.connect(self.show_selected_item)left_layout.addWidget(QLabel("剪贴板历史记录:"))left_layout.addWidget(self.history_list)# 右侧面板 - 详情和设置right_panel = QWidget()right_layout = QVBoxLayout()right_panel.setLayout(right_layout)# 详情区域detail_group = QWidget()detail_layout = QVBoxLayout()detail_group.setLayout(detail_layout)self.detail_text = QTextEdit()self.detail_text.setReadOnly(True)self.detail_text.setStyleSheet("""QTextEdit {background-color: #f9f9f9;border: 1px solid #ccc;border-radius: 5px;padding: 10px;min-height: 150px;}""")detail_layout.addWidget(QLabel("内容详情:"))detail_layout.addWidget(self.detail_text)# 操作按钮button_group = QWidget()button_layout = QHBoxLayout()button_group.setLayout(button_layout)self.copy_btn = QPushButton("复制选中项")self.copy_btn.setStyleSheet("""QPushButton {background-color: #4CAF50;color: white;border: none;padding: 8px;border-radius: 4px;}QPushButton:hover {background-color: #45a049;}""")self.copy_btn.clicked.connect(self.copy_selected)self.paste_btn = QPushButton("粘贴选中项")self.paste_btn.setStyleSheet("""QPushButton {background-color: #008CBA;color: white;border: none;padding: 8px;border-radius: 4px;}QPushButton:hover {background-color: #0077A3;}""")self.paste_btn.clicked.connect(self.paste_selected)self.delete_btn = QPushButton("删除选中项")self.delete_btn.setStyleSheet("""QPushButton {background-color: #f44336;color: white;border: none;padding: 8px;border-radius: 4px;}QPushButton:hover {background-color: #d32f2f;}""")self.delete_btn.clicked.connect(self.delete_selected)# 新增清空历史按钮self.clear_btn = QPushButton("清空历史")self.clear_btn.setStyleSheet("""QPushButton {background-color: #ff9800;color: white;border: none;padding: 8px;border-radius: 4px;}QPushButton:hover {background-color: #e68a00;}""")self.clear_btn.clicked.connect(self.clear_history)button_layout.addWidget(self.copy_btn)button_layout.addWidget(self.paste_btn)button_layout.addWidget(self.delete_btn)button_layout.addWidget(self.clear_btn)# 搜索区域search_group = QWidget()search_layout = QHBoxLayout()search_group.setLayout(search_layout)self.search_input = QLineEdit()self.search_input.setPlaceholderText("搜索剪贴板历史...")self.search_input.textChanged.connect(self.search_history)self.search_input.setStyleSheet("""QLineEdit {padding: 8px;border: 1px solid #ccc;border-radius: 4px;}""")search_btn = QPushButton("搜索")search_btn.setStyleSheet("""QPushButton {background-color: #555;color: white;border: none;padding: 8px 15px;border-radius: 4px;margin-left: 5px;}QPushButton:hover {background-color: #444;}""")search_btn.clicked.connect(self.search_history)search_layout.addWidget(self.search_input)search_layout.addWidget(search_btn)# 设置区域settings_group = QWidget()settings_layout = QVBoxLayout()settings_group.setLayout(settings_layout)settings_layout.addWidget(QLabel("设置:"))# 历史记录限制history_limit_layout = QHBoxLayout()history_limit_layout.addWidget(QLabel("最大历史记录数:"))self.history_limit_spin = QSpinBox()self.history_limit_spin.setRange(10, 500)self.history_limit_spin.setValue(self.max_history)self.history_limit_spin.valueChanged.connect(self.update_history_limit)history_limit_layout.addWidget(self.history_limit_spin)settings_layout.addLayout(history_limit_layout)# 快捷键设置hotkey_layout = QHBoxLayout()self.hotkey_checkbox = QCheckBox("启用快捷键 (Ctrl+D+数字)")self.hotkey_checkbox.setChecked(self.hotkeys_enabled)self.hotkey_checkbox.stateChanged.connect(self.toggle_hotkeys)hotkey_layout.addWidget(self.hotkey_checkbox)settings_layout.addLayout(hotkey_layout)# 自动粘贴设置auto_paste_layout = QHBoxLayout()self.auto_paste_checkbox = QCheckBox("使用快捷键时自动粘贴")self.auto_paste_checkbox.setChecked(self.auto_paste)self.auto_paste_checkbox.stateChanged.connect(self.toggle_auto_paste)auto_paste_layout.addWidget(self.auto_paste_checkbox)settings_layout.addLayout(auto_paste_layout)# 开机启动设置startup_layout = QHBoxLayout()self.startup_checkbox = QCheckBox("开机自动启动")self.startup_checkbox.setChecked(self.start_with_system)self.startup_checkbox.stateChanged.connect(self.toggle_start_with_system)startup_layout.addWidget(self.startup_checkbox)settings_layout.addLayout(startup_layout)# 主题选择theme_layout = QHBoxLayout()theme_layout.addWidget(QLabel("主题:"))self.theme_combo = QComboBox()self.theme_combo.addItems(["默认", "深色", "蓝色", "绿色", "粉色"])self.theme_combo.currentTextChanged.connect(self.change_theme)theme_layout.addWidget(self.theme_combo)settings_layout.addLayout(theme_layout)# 添加所有右侧组件right_layout.addWidget(detail_group)right_layout.addWidget(button_group)right_layout.addWidget(search_group)right_layout.addWidget(settings_group)# 添加左右面板到主布局main_layout.addWidget(left_panel, 70)main_layout.addWidget(right_panel, 30)# 更新历史记录列表self.update_history_list()def set_window_style(self):"""设置窗口样式"""self.setStyleSheet("""QMainWindow {background-color: #f5f5f5;}QLabel {font-weight: bold;color: #333;}QGroupBox {border: 1px solid #ddd;border-radius: 5px;margin-top: 10px;padding-top: 15px;}QGroupBox::title {subcontrol-origin: margin;left: 10px;padding: 0 3px;}""")def init_system_tray(self):"""初始化系统托盘"""self.tray_icon = QSystemTrayIcon(self)self.tray_icon.setIcon(self.style().standardIcon(QStyle.SP_ComputerIcon))tray_menu = QMenu()show_action = QAction("显示", self)show_action.triggered.connect(self.show)tray_menu.addAction(show_action)hide_action = QAction("隐藏", self)hide_action.triggered.connect(self.hide)tray_menu.addAction(hide_action)quit_action = QAction("退出", self)quit_action.triggered.connect(self.quit_app)tray_menu.addAction(quit_action)self.tray_icon.setContextMenu(tray_menu)self.tray_icon.show()self.tray_icon.activated.connect(self.tray_icon_activated)def tray_icon_activated(self, reason):"""系统托盘图标被激活时的处理"""if reason == QSystemTrayIcon.DoubleClick:self.show()def closeEvent(self, event):"""重写关闭事件,最小化到托盘"""event.ignore()self.hide()self.tray_icon.showMessage("剪贴板历史管理器","程序已最小化到系统托盘",QSystemTrayIcon.Information,2000)def register_hotkeys(self):"""注册全局快捷键"""if self.hotkeys_enabled:try:# 注册Ctrl+D+数字1-9的快捷键for i in range(1, 10):keyboard.add_hotkey(f'ctrl+d+{i}', lambda i=i: self.paste_from_history(i-1))except Exception as e:print(f"注册快捷键失败: {e}")def unregister_hotkeys(self):"""取消注册全局快捷键"""try:keyboard.unhook_all_hotkeys()except Exception as e:print(f"取消注册快捷键失败: {e}")def toggle_hotkeys(self, state):"""切换快捷键启用状态"""self.hotkeys_enabled = state == Qt.Checkedif self.hotkeys_enabled:self.register_hotkeys()else:self.unregister_hotkeys()def toggle_auto_paste(self, state):"""切换自动粘贴设置"""self.auto_paste = state == Qt.Checkeddef toggle_start_with_system(self, state):"""切换开机启动设置"""self.start_with_system = state == Qt.Checked# 这里需要实现实际的开机启动设置逻辑QMessageBox.information(self, "提示", "开机启动功能需要根据操作系统进行额外配置")def update_history_limit(self, value):"""更新历史记录最大数量"""self.max_history = value# 如果当前历史记录超过新限制,截断if len(self.history) > self.max_history:self.history = self.history[:self.max_history]self.update_history_list()def change_theme(self, theme_name):"""更改应用程序主题"""if theme_name == "默认":self.setStyleSheet("")elif theme_name == "深色":self.set_dark_theme()elif theme_name == "蓝色":self.set_blue_theme()elif theme_name == "绿色":self.set_green_theme()elif theme_name == "粉色":self.set_pink_theme()def set_dark_theme(self):"""设置深色主题"""dark_style = """QMainWindow {background-color: #333;}QListWidget {background-color: #444;color: #eee;border: 1px solid #555;}QListWidget::item {border-bottom: 1px solid #555;}QListWidget::item:hover {background-color: #555;}QListWidget::item:selected {background-color: #4CAF50;}QTextEdit, QLineEdit {background-color: #444;color: #eee;border: 1px solid #555;}QPushButton {background-color: #555;color: white;border: none;}QPushButton:hover {background-color: #666;}QLabel {color: #eee;}QSpinBox, QComboBox {background-color: #444;color: #eee;border: 1px solid #555;}"""self.setStyleSheet(dark_style)def set_blue_theme(self):"""设置蓝色主题"""blue_style = """QMainWindow {background-color: #e6f2ff;}QListWidget {background-color: #f0f7ff;border: 1px solid #b3d1ff;}QListWidget::item:hover {background-color: #d9e6ff;}QListWidget::item:selected {background-color: #4d94ff;color: white;}QPushButton {background-color: #4d94ff;color: white;}QPushButton:hover {background-color: #3d84ef;}"""self.setStyleSheet(blue_style)def set_green_theme(self):"""设置绿色主题"""green_style = """QMainWindow {background-color: #e6ffe6;}QListWidget {background-color: #f0fff0;border: 1px solid #b3e6b3;}QListWidget::item:hover {background-color: #d9ffd9;}QListWidget::item:selected {background-color: #4CAF50;color: white;}QPushButton {background-color: #4CAF50;color: white;}QPushButton:hover {background-color: #45a049;}"""self.setStyleSheet(green_style)def set_pink_theme(self):"""设置粉色主题"""pink_style = """QMainWindow {background-color: #ffe6f2;}QListWidget {background-color: #fff0f7;border: 1px solid #ffb3d9;}QListWidget::item:hover {background-color: #ffd9ec;}QListWidget::item:selected {background-color: #ff66b3;color: white;}QPushButton {background-color: #ff66b3;color: white;}QPushButton:hover {background-color: #ff4da6;}"""self.setStyleSheet(pink_style)def check_clipboard(self):"""检查剪贴板内容是否变化"""current_clipboard = pyperclip.paste()if current_clipboard and (not self.history or current_clipboard != self.history[0]['content']):# 添加到历史记录self.add_to_history(current_clipboard)def add_to_history(self, content):"""添加内容到历史记录"""if not content.strip():return# 如果内容与上一条相同,不重复添加if self.history and content == self.history[0]['content']:return# 创建新的历史记录项history_item = {'content': content,'timestamp': datetime.now().strftime("%Y-%m-%d %H:%M:%S"),'preview': content[:50] + ("..." if len(content) > 50 else "")}# 添加到历史记录开头self.history.insert(0, history_item)# 如果超过最大限制,移除最旧的记录if len(self.history) > self.max_history:self.history = self.history[:self.max_history]# 更新UIself.update_history_list()# 保存历史记录self.save_history()def update_history_list(self):"""更新历史记录列表显示"""self.history_list.clear()# 定义不同颜色colors = [QColor("#FF0000"),  # 红色QColor("#00AA00"),  # 绿色QColor("#0000FF"),  # 蓝色QColor("#AA00AA"),  # 紫色QColor("#00AAAA"),  # 青色QColor("#AA5500"),  # 棕色QColor("#FF00FF"),  # 粉红QColor("#555555"),  # 深灰QColor("#0055FF")   # 天蓝]for i, item in enumerate(self.history):list_item = QListWidgetItem(f"[{i+1}] {item['timestamp']} - {item['preview']}")# 为前9项设置不同颜色if i < 9:list_item.setForeground(QBrush(colors[i % len(colors)]))self.history_list.addItem(list_item)def show_selected_item(self, item):"""显示选中项的详细信息"""index = self.history_list.row(item)if 0 <= index < len(self.history):selected_item = self.history[index]self.detail_text.setPlainText(selected_item['content'])def copy_selected(self):"""复制选中项到剪贴板"""selected_items = self.history_list.selectedItems()if selected_items:index = self.history_list.row(selected_items[0])if 0 <= index < len(self.history):pyperclip.copy(self.history[index]['content'])self.tray_icon.showMessage("剪贴板历史管理器","内容已复制到剪贴板",QSystemTrayIcon.Information,1000)def paste_selected(self):"""粘贴选中项"""self.copy_selected()# 模拟Ctrl+V粘贴if self.auto_paste:keyboard.send('ctrl+v')def paste_from_history(self, index):"""通过快捷键粘贴指定索引的历史记录"""if 0 <= index < len(self.history):# 高亮显示对应的项if index < self.history_list.count():self.history_list.setCurrentRow(index)self.history_list.scrollToItem(self.history_list.currentItem())pyperclip.copy(self.history[index]['content'])if self.auto_paste:keyboard.send('ctrl+v')def delete_selected(self):"""删除选中项"""selected_items = self.history_list.selectedItems()if selected_items:index = self.history_list.row(selected_items[0])if 0 <= index < len(self.history):# 确认对话框reply = QMessageBox.question(self, '确认删除','确定要删除这条记录吗?',QMessageBox.Yes | QMessageBox.No,QMessageBox.No)if reply == QMessageBox.Yes:del self.history[index]self.update_history_list()self.detail_text.clear()self.save_history()def clear_history(self):"""清空所有历史记录"""if not self.history:return# 确认对话框reply = QMessageBox.question(self, '确认清空','确定要清空所有历史记录吗?此操作不可撤销!',QMessageBox.Yes | QMessageBox.No,QMessageBox.No)if reply == QMessageBox.Yes:self.history = []self.update_history_list()self.detail_text.clear()self.save_history()def search_history(self):"""搜索历史记录"""search_text = self.search_input.text().lower()if not search_text:self.update_history_list()returnself.history_list.clear()# 定义不同颜色colors = [QColor("#FF0000"),  # 红色QColor("#00AA00"),  # 绿色QColor("#0000FF"),  # 蓝色QColor("#AA00AA"),  # 紫色QColor("#00AAAA"),  # 青色QColor("#AA5500"),  # 棕色QColor("#FF00FF"),  # 粉红QColor("#555555"),  # 深灰QColor("#0055FF")   # 天蓝]for i, item in enumerate(self.history):if search_text in item['content'].lower():list_item = QListWidgetItem(f"[{i+1}] {item['timestamp']} - {item['preview']}")# 保持颜色效果if i < 9:list_item.setForeground(QBrush(colors[i % len(colors)]))self.history_list.addItem(list_item)def save_history(self):"""保存历史记录到文件"""try:with open(self.history_file, 'w', encoding='utf-8') as f:json.dump(self.history, f, ensure_ascii=False, indent=2)except Exception as e:print(f"保存历史记录失败: {e}")def load_history(self):"""从文件加载历史记录"""try:if os.path.exists(self.history_file):with open(self.history_file, 'r', encoding='utf-8') as f:self.history = json.load(f)except Exception as e:print(f"加载历史记录失败: {e}")def quit_app(self):"""退出应用程序"""self.save_history()self.tray_icon.hide()QApplication.quit()if __name__ == "__main__":app = QApplication(sys.argv)# 设置应用程序图标app_icon = QIcon()app_icon.addFile('icon16.png', QSize(16, 16))app_icon.addFile('icon32.png', QSize(32, 32))app_icon.addFile('icon48.png', QSize(48, 48))app_icon.addFile('icon256.png', QSize(256, 256))app.setWindowIcon(app_icon)window = ClipboardHistoryApp()window.show()sys.exit(app.exec_())

七、总结与扩展

7.1 项目总结

本文实现了一个功能完善的剪贴板历史管理工具,具有以下优点:

  1. 跨平台:基于Python,可在Windows/macOS/Linux运行
  2. 高性能:使用定时器检查剪贴板,资源占用低
  3. 易用性:直观的GUI界面和快捷键操作
  4. 可扩展:代码结构清晰,便于添加新功能

7.2 可能的改进方向

  1. 分类标签:为历史记录添加标签分类功能
  2. 图片支持:扩展支持图片剪贴板历史
  3. 云同步:实现历史记录多设备同步
  4. 插件系统:支持通过插件扩展功能
  5. OCR集成:对图片中的文字进行识别保存

7.3 实际应用价值

经过测试,使用这个工具可以:

  • 减少30%以上的重复复制操作
  • 提高代码片段复用率
  • 避免因剪贴板覆盖导致的内容丢失
  • 快速获取之前复制过的常用内容(如密码、命令等)

希望这个项目能帮助你提升工作效率!如果有任何问题或建议,欢迎在评论区留言讨论。


附录:常见问题解答

Q: 如何设置开机启动?
A: 需要根据操作系统添加启动项,Windows可将其添加到"启动"文件夹或修改注册表。

Q: 快捷键冲突怎么办?
A: 可以在代码中修改keyboard.add_hotkey的参数使用其他组合键。

Q: 历史记录文件在哪里?
A: 默认保存在程序同级目录下的clipboard_history.json文件中。

Q: 支持图片或富文本吗?
A: 当前版本仅支持纯文本,后续可扩展支持更多格式。


http://www.hkcw.cn/article/tyRFcBWQDe.shtml

相关文章

π0的微调——如何基于各种开源数据集、以及私有数据集微调openpi(含我司七月的微调实践及在机械臂上的部署)

前言 25年2.4日&#xff0c;几个月前推出π0的公司Physical Intelligence (π)宣布正式开源π0及π0-FAST&#xff0c;如之前所介绍的&#xff0c;他们对用超过 10,000 小时的机器人数据进行了预训练 该GitHub代码仓库「 π0及π0-FAST的GitHub地址&#xff1a;github.com/Ph…

开源模型应用落地-qwen模型小试-Qwen3-8B-融合VLLM、MCP与Agent(七)

一、前言 随着Qwen3的开源与技术升级,其在企业中的落地场景正加速拓展至多个垂直领域。依托Agent智能体能力 和MCP协议的工具调用接口 ,Qwen3可深度融入企业业务流程,为企业提供从需求解析到自动化开发的全链路支持。 本篇将介绍如何实现Qwen3-8B模型集成MCP实现智能体交互。…

【Git】GitHub 连接失败解决方案:Failed to connect to github.com port 443 after 21090 ms: Couldn’t connect to se

文章目录 一、使用 VPN 环境下的解决方案1. 检查当前代理设置2. 配置 Git 使用代理3. 验证代理设置是否生效4. 刷新 DNS 缓存5. 重新尝试 Git 操作 二、未使用 VPN 环境下的解决方案1. 取消 Git 配置的代理2. 验证代理设置已成功移除3. 重试 Git 操作 三、总结使用 VPN 的解决方…

Java 大视界 -- Java 大数据机器学习模型在元宇宙虚拟场景智能交互中的关键技术(239)

&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎来到 青云交的博客&#xff01;能与诸位在此相逢&#xff0c;我倍感荣幸。在这飞速更迭的时代&#xff0c;我们都渴望一方心灵净土&#xff0c;而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识&#xff0c;也…

Digital Reengineering and Localized Implementation of the Five-Dimensional Management Cycle System

A Paradigm Shift in Intelligent Hospital Governance(Preliminary draft of the first-line cooperation project) Abstract This study pioneers a transformative approach to healthcare management through the “Technology-Management-Value” (TMV) triad model, r…

Qwen3:重磅开源,重夺开源第一!(包含详细使用教程)

1.简介 Qwen3&#xff0c;这是 Qwen 系列大型语言模型的最新成员。我们的旗舰模型 Qwen3-235B-A22B 在代码、数学、通用能力等基准测试中&#xff0c;与 DeepSeek-R1、o1、o3-mini、Grok-3 和 Gemini-2.5-Pro 等顶级模型相比&#xff0c;表现出极具竞争力的结果。此外&#xf…

基于 Alpine 定制单功能用途(kiosk)电脑

前言 故事回到 7 年前, 在网上冲浪的时候发现了一篇介绍使用 Ubuntu 打造 kiosk 单功能用途电脑的文章, 挺好玩的, 就翻译了一下并比葫芦画瓢先后用了 CentOS 7, ArchLinux 进行了实现. 历史文章: 翻译 - 使用Ubutnu14.04和Chrome打造单功能用途电脑(大屏展示电脑) 使用CentOS…

《汇编语言》第13章 int指令——实验13 编写、应用中断例程

&#xff08;1&#xff09;编写并安装 int 7ch 中断例程&#xff0c;功能为显示一个用0结束的字符串&#xff0c;中断例程安装在0&#xff1a;200处。 参数&#xff1a;&#xff08;dh&#xff09;行号&#xff0c;&#xff08;dl&#xff09;列号&#xff0c;&#xff08;cl&a…

大模型前处理-CPU

前处理包含哪些流程 分词 tokenizationembedding CPU可以做哪些优化 分词 分词在做什么&#xff1f; 什么是词元化&#xff1f; 词元化&#xff08;Tokenization&#xff09;是把一段自然语言文本拆分成更小的单元&#xff08;称为“词元”&#xff0c;即 Token&#xff0…

设备驱动与文件系统:02 键盘

操作系统中键盘驱动的讲解 在这一讲中&#xff0c;我将为大家讲解键盘相关内容。从上一讲开始&#xff0c;我们进入了操作系统第四个部分的学习&#xff0c;也就是操作系统对设备的驱动与管理。 上一讲我们探讨的是显示器&#xff0c;并且提到&#xff0c;一个终端设备是由显示…

工作流引擎-18-开源审批流项目之 plumdo-work 工作流,表单,报表结合的多模块系统

工作流引擎系列 工作流引擎-00-流程引擎概览 工作流引擎-01-Activiti 是领先的轻量级、以 Java 为中心的开源 BPMN 引擎&#xff0c;支持现实世界的流程自动化需求 工作流引擎-02-BPM OA ERP 区别和联系 工作流引擎-03-聊一聊流程引擎 工作流引擎-04-流程引擎 activiti 优…

Windows环境下Scoop包管理工具的全面指南

&#x1f9e9; 一、Scoop核心特性与设计理念 定位与优势 专注于开源命令行工具和便携式&#xff08;Portable&#xff09;应用&#xff0c;无需管理员权限即可安装&#xff0c;减少系统污染。自动管理环境变量&#xff08;通过shims目录&#xff09;&#xff0c;安装后即时可用…

谷粒商城-分布式微服务项目-高级篇[三]

十五、商城业务-支付 15.1 支付宝支付 15.1.1 进入“蚂蚁金服开放平台” 支付宝开放 平台地址&#xff1a; 支付宝开放平台 15.1.2 下载支付宝官方 demo&#xff0c;进行配置和测试 开发者文档&#xff1a;支付宝开放平台文档中心 电脑网站支付文档&#xff1a;小程序文…

EchoMimicV2:迈向引人注目、简化的半身人类动画

今天介绍EchoMimicV2&#xff0c;EchoMimicV2是阿里蚂蚁集团推出的半身人体AI数字人项目&#xff0c;输入参考图片、音频、和手部姿势序列生成动画视频&#xff08;对图片的规范要求比较高&#xff0c;图片规范的话效果还可以&#xff09;&#xff0c;感兴趣的还可以去了解一下…

SpringBoot手动实现流式输出方案整理以及SSE规范输出详解

背景&#xff1a; 最近做流式输出时&#xff0c;一直使用python实现的&#xff0c;应需求方的要求&#xff0c;需要通过java应用做一次封装并在java侧完成系统鉴权、模型鉴权等功能后才能真正去调用智能体应用&#xff0c;基于此调研java实现流式输出的几种方式&#xff0c;并…

vuex的使用

❀ ❀ ❀ ❀ ❀ ❀ ❀ vuex的官网 ❀ ❀ ❀ ❀ ❀ ❀ ❀ ❀ 这里用法不纯粹。用户toolbar页面切换时的传参。若后期有更好的方式&#xff0c;会更改。因vuex用于全局&#xff0c;在这个场景下使用有点大材小用了 其中需要注意的点就是更新、获取状态 更新状态。updateProjec…

Calendar和Datepicker

Displaystart Displayend "2024-10-8" selectedDate属性 设定选择的日期 在 C# 中&#xff0c;DateTime? date1 表示 **一个可空的 DateTime 类型变量**。 &#xff1f;.是不为零 ?是可以为零0️⃣ 多选 selectionmode none不让选 singlerange shift …

赛事获奖|TsingtaoAI荣获“雄才杯”2025创新创业大赛总决赛奖项

5月16-18日&#xff0c;由雄安新区党工委人才工作领导小组办公室主办的“雄才杯”2025创新创业大赛总决赛在雄安新区成功举办。TsingtaoAI凭借“基于DeepSeek的具身智能实训”项目荣获优胜奖&#xff0c;本项目为参赛项目中唯一的教育科技服务类获奖项目。 大赛背景 本次总决…

初识vue3(vue简介,环境配置,setup语法糖)

一&#xff0c;前言 今天学习vue3 二&#xff0c;vue简介及如何创建vue工程 Vue 3 简介 Vue.js&#xff08;读音 /vjuː/&#xff0c;类似 “view”&#xff09;是一款流行的渐进式 JavaScript 框架&#xff0c;用于构建用户界面。Vue 3 是其第三代主要版本&#xff0c;于 …

C++面向对象(二)

面向对象基础内容参考&#xff1a; C面向对象&#xff08;一&#xff09;-CSDN博客 友元函数 类的友元函数是定义在类外部&#xff0c;但有权访问类的所有私有&#xff08;private&#xff09;成员和保护&#xff08;protected&#xff09;成员。尽管友元函数的原型有在类的定…