当前位置: 首页 > article >正文

【Python 开源】你的 Windows 关机助手——PyQt5 版定时关机工具

🖥️ 你的 Windows 关机助手——PyQt5 版定时关机工具

相关资源文件已经打包成EXE文件,可双击直接运行程序,且文章末尾已附上相关源码,以供大家学习交流,博主主页还有更多Python相关程序案例,秉着开源精神的想法,望大家喜欢,点个关注不迷路!!!

📌 概述

在日常使用电脑的过程中,我们经常会遇到需要定时关机的场景,比如:

  • 夜间下载文件,想让电脑在任务完成后自动关机。
  • 长时间运行的程序,需要在某个时间点关闭系统。
  • 限制电脑使用时间,避免长时间占用资源。

虽然 Windows 自带 shutdown 命令可以定时关机,但操作方式较为繁琐,缺乏可视化界面。因此,本篇文章将带大家实现一个基于 PyQt5 的 Windows 定时关机工具,支持定时或延时关机、重启、注销,并提供系统托盘功能,方便随时管理关机任务。
在这里插入图片描述

🎯 功能介绍

本工具主要具备以下功能:

定时关机 —— 设定具体时间,到点自动关机。

延时关机 —— 设置倒计时,倒计时结束后自动关机。

重启 & 注销 —— 除关机外,还可执行系统重启和注销操作。

取消操作 —— 关机前可随时取消,避免误操作。

系统托盘支持 —— 运行后最小化到系统托盘,不影响日常操作。

人性化提示 —— 关机前弹出提醒,避免突发关机。

🔧 代码实现

📌 1. 安装依赖

在运行代码之前,我们需要先安装 PyQt5 库:

pip install PyQt5 pyqt5-tools

📌 2. 代码编写

以下是完整的代码实现:

import sys
import os
import time
from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QPushButton, QVBoxLayout, QTimeEdit, QSystemTrayIcon, QMenu, QAction
from PyQt5.QtGui import QIcon
from PyQt5.QtCore import QTimer, QTimeclass ShutdownApp(QWidget):def __init__(self):super().__init__()self.initUI()def initUI(self):self.setWindowTitle('Windows 定时关机工具')self.setGeometry(600, 300, 300, 200)self.label = QLabel('请选择关机时间:', self)self.timeEdit = QTimeEdit(self)self.timeEdit.setDisplayFormat("HH:mm")self.startButton = QPushButton('设置关机', self)self.startButton.clicked.connect(self.scheduleShutdown)self.cancelButton = QPushButton('取消关机', self)self.cancelButton.clicked.connect(self.cancelShutdown)layout = QVBoxLayout()layout.addWidget(self.label)layout.addWidget(self.timeEdit)layout.addWidget(self.startButton)layout.addWidget(self.cancelButton)self.setLayout(layout)# 托盘功能self.trayIcon = QSystemTrayIcon(QIcon("icon.png"), self)trayMenu = QMenu()exitAction = QAction("退出", self)exitAction.triggered.connect(self.close)trayMenu.addAction(exitAction)self.trayIcon.setContextMenu(trayMenu)self.trayIcon.show()def scheduleShutdown(self):shutdown_time = self.timeEdit.time()current_time = QTime.currentTime()seconds = current_time.secsTo(shutdown_time)if seconds <= 0:self.label.setText("请选择一个未来的时间!")returnself.label.setText(f"关机已设置,将在 {shutdown_time.toString()} 执行")os.system(f'shutdown -s -t {seconds}')def cancelShutdown(self):os.system('shutdown -a')self.label.setText("关机已取消!")if __name__ == '__main__':app = QApplication(sys.argv)ex = ShutdownApp()ex.show()sys.exit(app.exec_())

📌 功能使用

🛠️ 1. 运行软件

python shutdown_tool.py

⏳ 2. 设置定时关机

  • 选择时间
  • 点击 “设置关机”
  • 程序将计算剩余时间,并执行关机命令

🚫 3. 取消关机

  • 如果想取消定时关机,点击 “取消关机” 按钮

  • 也可以手动在命令行执行:

    shutdown -a
    

🔽 4. 系统托盘

  • 运行后可最小化到托盘
  • 右键点击托盘图标可 退出应用

📊 技术要点解析

1️⃣ 关机命令

Windows 提供 shutdown 命令来执行关机任务:

  • 定时关机

    shutdown -s -t 秒数
    
  • 取消关机

    shutdown -a
    

2️⃣ 计算关机时间

我们使用 QTime 计算当前时间到设定时间的 秒数,避免时间计算错误:

seconds = current_time.secsTo(shutdown_time)

3️⃣ 托盘图标支持

使用 QSystemTrayIcon 实现最小化到托盘:

self.trayIcon = QSystemTrayIcon(QIcon("icon.png"), self)

这样即使窗口关闭,应用仍能在后台运行。

运行效果

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

相关源码

import os
import sys
import time
import configparser
import win32api
import win32con
from datetime import datetime, timedelta
from PyQt5.QtWidgets import (QApplication, QMainWindow, QWidget, QVBoxLayout, QHBoxLayout, QGroupBox, QRadioButton, QDateTimeEdit, QLabel, QPushButton, QCheckBox, QSystemTrayIcon, QMenu, QMessageBox, QSpacerItem, QSizePolicy, QFrame)
from PyQt5.QtCore import Qt, QTimer, QDateTime, QTime, QSize, QSharedMemory
from PyQt5.QtGui import QIcon, QFont, QPalette, QColordef resource_path(relative_path):""" 获取资源的绝对路径,适用于开发环境和PyInstaller单文件模式 """if hasattr(sys, '_MEIPASS'):# PyInstaller创建的临时文件夹return os.path.join(sys._MEIPASS, relative_path)return os.path.join(os.path.abspath('.'), relative_path)class ShutdownApp(QMainWindow):def __init__(self):super().__init__()self.task_running = Falseself.config_file = os.path.join(os.getenv('APPDATA'), 'shutdown_config.ini')self.first_show = True  # 用于跟踪是否是第一次显示self.setup_ui_style()self.init_ui()self.load_config()# 系统托盘self.tray_icon = QSystemTrayIcon(self)self.tray_icon.setIcon(QIcon(resource_path("icon.ico")))self.tray_icon.setToolTip("定时关机")self.tray_icon.activated.connect(self.tray_icon_activated)# 托盘菜单self.tray_menu = QMenu()self.show_action = self.tray_menu.addAction("显示")self.exit_action = self.tray_menu.addAction("退出")self.show_action.triggered.connect(self.show_normal)self.exit_action.triggered.connect(self.confirm_exit)self.tray_icon.setContextMenu(self.tray_menu)self.tray_icon.show()  # 确保托盘图标显示# 显示当前时间self.timer = QTimer(self)self.timer.timeout.connect(self.update_current_time)self.timer.start(1000)# 剩余时间计时器self.countdown_timer = QTimer(self)self.countdown_timer.timeout.connect(self.update_remaining_time)def setup_ui_style(self):"""设置全局UI样式"""self.setStyleSheet("""QMainWindow {background-color: #f5f5f5;}QGroupBox {border: 1px solid #ccc;border-radius: 4px;margin-top: 10px;padding-top: 15px;font-weight: bold;color: #333;}QGroupBox::title {subcontrol-origin: margin;left: 10px;padding: 0 3px;}QRadioButton, QCheckBox {color: #444;}QPushButton {background-color: #4CAF50;color: white;border: none;padding: 8px 16px;border-radius: 4px;min-width: 80px;}QPushButton:hover {background-color: #45a049;}QPushButton:disabled {background-color: #cccccc;}QPushButton#cancel_btn {background-color: #f44336;}QPushButton#cancel_btn:hover {background-color: #d32f2f;}QDateTimeEdit {padding: 5px;border: 1px solid #ddd;border-radius: 4px;}QLabel#current_time_label {font-size: 16px;color: #333;padding: 5px;background-color: #e9f5e9;border-radius: 4px;}QLabel#remaining_time_label {font-size: 16px;color: #d32f2f;font-weight: bold;padding: 5px;background-color: #f9e9e9;border-radius: 4px;}""")def init_ui(self):self.setWindowTitle("定时关机")self.setWindowIcon(QIcon(resource_path("icon.ico")))self.resize(300, 440)# 主窗口布局main_widget = QWidget()self.setCentralWidget(main_widget)layout = QVBoxLayout(main_widget)layout.setContentsMargins(12, 12, 12, 12)layout.setSpacing(10)# 当前时间显示self.current_time_label = QLabel()self.current_time_label.setAlignment(Qt.AlignCenter)self.current_time_label.setObjectName("current_time_label")layout.addWidget(self.current_time_label)# 添加分隔线line = QFrame()line.setFrameShape(QFrame.HLine)line.setFrameShadow(QFrame.Sunken)layout.addWidget(line)# 定时/延时选择time_type_group = QGroupBox("时间类型")time_type_layout = QHBoxLayout()time_type_layout.setContentsMargins(10, 15, 10, 10)self.fixed_time_radio = QRadioButton("定时关机")self.delay_time_radio = QRadioButton("延时关机")self.fixed_time_radio.setChecked(True)time_type_layout.addWidget(self.fixed_time_radio)time_type_layout.addWidget(self.delay_time_radio)time_type_group.setLayout(time_type_layout)layout.addWidget(time_type_group)# 定时时间选择self.fixed_datetime = QDateTimeEdit()self.fixed_datetime.setDisplayFormat("yyyy-MM-dd HH:mm:ss")self.fixed_datetime.setDateTime(QDateTime.currentDateTime())self.fixed_datetime.setCalendarPopup(True)layout.addWidget(self.fixed_datetime)# 延时时间选择self.delay_datetime = QDateTimeEdit()self.delay_datetime.setDisplayFormat("HH:mm:ss")self.delay_datetime.setTime(QTime(0, 0, 0))self.delay_datetime.setVisible(False)layout.addWidget(self.delay_datetime)# 连接信号self.fixed_time_radio.toggled.connect(self.on_time_type_changed)# 操作类型action_group = QGroupBox("操作类型")action_layout = QHBoxLayout()action_layout.setContentsMargins(10, 15, 10, 10)self.shutdown_radio = QRadioButton("关机")self.restart_radio = QRadioButton("重启")self.logoff_radio = QRadioButton("注销")self.shutdown_radio.setChecked(True)action_layout.addWidget(self.shutdown_radio)action_layout.addWidget(self.restart_radio)action_layout.addWidget(self.logoff_radio)action_group.setLayout(action_layout)layout.addWidget(action_group)# 选项options_group = QGroupBox("选项")options_layout = QVBoxLayout()options_layout.setContentsMargins(10, 15, 10, 10)self.auto_start_check = QCheckBox("随系统启动")self.loop_exec_check = QCheckBox("循环执行")options_layout.addWidget(self.auto_start_check)options_layout.addWidget(self.loop_exec_check)options_group.setLayout(options_layout)layout.addWidget(options_group)# 剩余时间显示self.remaining_time_label = QLabel()self.remaining_time_label.setAlignment(Qt.AlignCenter)self.remaining_time_label.setObjectName("remaining_time_label")layout.addWidget(self.remaining_time_label)# 按钮布局button_layout = QHBoxLayout()button_layout.setContentsMargins(0, 10, 0, 0)button_layout.setSpacing(15)self.save_btn = QPushButton("保存设置")self.cancel_btn = QPushButton("取消")self.cancel_btn.setObjectName("cancel_btn")self.cancel_btn.setEnabled(False)self.save_btn.clicked.connect(self.save_config)self.cancel_btn.clicked.connect(self.cancel_task)button_layout.addWidget(self.save_btn)button_layout.addWidget(self.cancel_btn)layout.addLayout(button_layout)# 添加弹簧使布局更紧凑layout.addSpacerItem(QSpacerItem(20, 10, QSizePolicy.Minimum, QSizePolicy.Expanding))def on_time_type_changed(self, checked):self.fixed_datetime.setVisible(checked)self.delay_datetime.setVisible(not checked)def update_current_time(self):current_time = datetime.now().strftime("%Y年%m月%d日 %H:%M:%S")self.current_time_label.setText(f"当前时间: {current_time}")def save_config(self):config = configparser.ConfigParser()config['task'] = {'time_type': 'fixed' if self.fixed_time_radio.isChecked() else 'delay','time': self.fixed_datetime.dateTime().toString("HHmmss") if self.fixed_time_radio.isChecked() else self.delay_datetime.time().toString("HHmmss"),'execute_type': 'shutdown' if self.shutdown_radio.isChecked() else 'restart' if self.restart_radio.isChecked() else 'logoff','auto_start': '1' if self.auto_start_check.isChecked() else '0','task_circ': '1' if self.loop_exec_check.isChecked() else '0'}with open(self.config_file, 'w') as f:config.write(f)self.set_auto_start(self.auto_start_check.isChecked())self.cancel_btn.setEnabled(True)  # 保存后启用取消按钮self.start_task()def load_config(self):if not os.path.exists(self.config_file):returnconfig = configparser.ConfigParser()config.read(self.config_file)if 'task' in config:task_config = config['task']# 时间类型if task_config.get('time_type', 'fixed') == 'fixed':self.fixed_time_radio.setChecked(True)time_str = task_config.get('time', '000000')qtime = QTime.fromString(time_str, "HHmmss")current_date = QDateTime.currentDateTime()self.fixed_datetime.setDateTime(QDateTime(current_date.date(), qtime))else:self.delay_time_radio.setChecked(True)time_str = task_config.get('time', '000000')qtime = QTime.fromString(time_str, "HHmmss")self.delay_datetime.setTime(qtime)# 操作类型execute_type = task_config.get('execute_type', 'shutdown')if execute_type == 'shutdown':self.shutdown_radio.setChecked(True)elif execute_type == 'restart':self.restart_radio.setChecked(True)else:self.logoff_radio.setChecked(True)# 选项self.auto_start_check.setChecked(task_config.get('auto_start', '0') == '1')self.loop_exec_check.setChecked(task_config.get('task_circ', '0') == '1')if self.loop_exec_check.isChecked():self.cancel_btn.setEnabled(True)self.start_task()def set_auto_start(self, enable):key = win32con.HKEY_CURRENT_USERsub_key = r"Software\Microsoft\Windows\CurrentVersion\Run"try:reg_key = win32api.RegOpenKey(key, sub_key, 0, win32con.KEY_ALL_ACCESS)if enable:win32api.RegSetValueEx(reg_key, "定时关机", 0, win32con.REG_SZ, sys.executable)else:try:win32api.RegDeleteValue(reg_key, "定时关机")except:passwin32api.RegCloseKey(reg_key)except Exception as e:QMessageBox.warning(self, "警告", f"设置自启动失败: {str(e)}")def start_task(self):if self.task_running:returnself.task_running = Trueself.toggle_components(True)if self.fixed_time_radio.isChecked():target_time = self.fixed_datetime.dateTime().toPyDateTime()now = datetime.now()if target_time < now:target_time += timedelta(days=1)self.target_time = target_timeelse:delay = self.delay_datetime.time()self.target_time = datetime.now() + timedelta(hours=delay.hour(),minutes=delay.minute(),seconds=delay.second())self.countdown_timer.start(1000)self.update_remaining_time()def update_remaining_time(self):now = datetime.now()remaining = self.target_time - nowif remaining.total_seconds() <= 0:self.execute_action()if self.loop_exec_check.isChecked():self.start_task()else:self.cancel_task()returnhours, remainder = divmod(int(remaining.total_seconds()), 3600)minutes, seconds = divmod(remainder, 60)remaining_str = f"{hours}小时{minutes}{seconds}秒"self.remaining_time_label.setText(f"剩余时间: {remaining_str}")# 更新托盘提示self.tray_icon.setToolTip(f"定时关机\n剩余时间: {remaining_str}")def execute_action(self):if self.shutdown_radio.isChecked():os.system("shutdown -s -t 0")elif self.restart_radio.isChecked():os.system("shutdown -r -t 0")else:os.system("shutdown -l")def cancel_task(self):"""取消定时任务"""if not self.task_running:QMessageBox.warning(self, "警告", "没有正在运行的任务")returnreply = QMessageBox.question(self, "确认", "确定要取消定时任务吗?", QMessageBox.Yes | QMessageBox.No)if reply == QMessageBox.Yes:self.task_running = Falseself.countdown_timer.stop()self.remaining_time_label.setText("")self.tray_icon.setToolTip("定时关机")self.toggle_components(False)self.cancel_btn.setEnabled(False)# 显示取消成功的提示QMessageBox.information(self, "提示", "定时任务已取消", QMessageBox.Ok)def toggle_components(self, disabled):self.fixed_time_radio.setDisabled(disabled)self.delay_time_radio.setDisabled(disabled)self.fixed_datetime.setDisabled(disabled)self.delay_datetime.setDisabled(disabled)self.shutdown_radio.setDisabled(disabled)self.restart_radio.setDisabled(disabled)self.logoff_radio.setDisabled(disabled)self.auto_start_check.setDisabled(disabled)self.loop_exec_check.setDisabled(disabled)self.save_btn.setDisabled(disabled)def tray_icon_activated(self, reason):if reason == QSystemTrayIcon.DoubleClick:self.show_normal()def show_normal(self):self.show()self.setWindowState(self.windowState() & ~Qt.WindowMinimized)self.activateWindow()self.raise_()def closeEvent(self, event):"""重写关闭事件,改为最小化到托盘"""if self.isVisible():self.hide()self.tray_icon.show()  # 确保托盘图标显示if not self.first_show:  # 第一次启动时不显示消息self.tray_icon.showMessage("定时关机", "程序已最小化到托盘", QSystemTrayIcon.Information, 2000)self.first_show = Falseevent.ignore()else:# 真正退出程序self.tray_icon.hide()event.accept()def confirm_exit(self):reply = QMessageBox.question(self, '确认', '是否退出?', QMessageBox.Yes | QMessageBox.No, QMessageBox.No)if reply == QMessageBox.Yes:self.tray_icon.hide()QApplication.quit()def main():# 防止重复运行shared = QSharedMemory("定时关机")if not shared.create(512, QSharedMemory.ReadWrite):QMessageBox.warning(None, "警告", "程序已经在运行!")sys.exit(0)# 设置高DPI支持QApplication.setAttribute(Qt.AA_EnableHighDpiScaling)app = QApplication(sys.argv)window = ShutdownApp()# 如果配置了随系统启动且循环执行,则不显示窗口config_file = os.path.join(os.getenv('APPDATA'), 'shutdown_config.ini')if os.path.exists(config_file):config = configparser.ConfigParser()config.read(config_file)if 'task' in config and config['task'].get('auto_start', '0') == '1':if config['task'].get('task_circ', '0') == '1':window.showMinimized()else:window.show()else:window.show()else:window.show()sys.exit(app.exec_())if __name__ == '__main__':main()

🎉 总结与优化方向

🔹 优点

界面简洁,操作方便

系统托盘支持,后台静默运行

支持定时 & 倒计时模式,满足不同需求

🔹 可优化方向

🚀 支持多任务管理(同时设置多个定时任务)

🚀 增加日志记录(记录每次关机任务)

🚀 增加任务进度条(倒计时可视化显示)

如果你对这个工具感兴趣,可以尝试优化它,让它变得更加智能!💡

你会如何改进这个工具?欢迎在评论区交流你的想法! 🚀

📥 资源下载

  • 源码以及exe文件直接下载 ZIP:🔗 点此下载

🚀 赶快下载体验吧,如果觉得有帮助,欢迎 Star 支持!

相关文章:

【Python 开源】你的 Windows 关机助手——PyQt5 版定时关机工具

&#x1f5a5;️ 你的 Windows 关机助手——PyQt5 版定时关机工具 相关资源文件已经打包成EXE文件&#xff0c;可双击直接运行程序&#xff0c;且文章末尾已附上相关源码&#xff0c;以供大家学习交流&#xff0c;博主主页还有更多Python相关程序案例&#xff0c;秉着开源精神的…...

STM32 HAL库 ADC+TIM+DMA 3路 1S采样一次电压

一、引言 在很多嵌入式系统应用中&#xff0c;需要对多路模拟信号进行周期性采样&#xff0c;例如在工业控制、环境监测等领域。STM32F407 是一款高性能的微控制器&#xff0c;其丰富的外设资源可以方便地实现这样的功能。通过结合 ADC&#xff08;模拟 - 数字转换器&#xff…...

汉诺塔问题——用贪心算法解决

目录 一&#xff1a;起源 二&#xff1a;问题描述 三&#xff1a;规律 三&#xff1a;解决方案 递归算法 四&#xff1a;代码实现 复杂度分析 一&#xff1a;起源 汉诺塔&#xff08;Tower of Hanoi&#xff09;问题起源于一个印度的古老传说。在世界中心贝拿勒斯&#…...

【Python爬虫】简单介绍

目录 一、基本概念 1.1 什么是爬虫 1.2 Python为什么适合爬虫 1.3 Python爬虫应用领域 &#xff08;1&#xff09;数据采集与分析 市场调研 学术研究 &#xff08;2&#xff09;内容聚合与推荐 新闻聚合 视频内容聚合 &#xff08;3&#xff09;金融领域 股票数据获…...

使用MCP服务通过自然语言操作数据库(vscode+cline版本)

使用MCP服务操纵数据库(vscodecline版本) 本文主要介绍&#xff0c;在vscode中使用cline插件调用deepseek模型&#xff0c;通过MCP服务器 使用自然语言去操作指定数据库。本文使用的是以己经创建号的珠海航展数据库。 理解MCP服务&#xff1a; MCP&#xff08;Model Context…...

Vue 3 + TypeScript 实现一个多语言国际化组件(支持语言切换与内容加载)

文章目录 一、项目背景与功能概览二、项目技术架构与依赖安装2.1 技术栈2.2 安装依赖 三、国际化组件实现3.1 创建 i18n 实例3.2 配置 i18n 到 Vue 应用3.3 在组件中使用国际化内容3.4 支持语言切换 四、支持类型安全4.1 添加类型支持4.2 自动加载语言文件 一、项目背景与功能概…...

PhalApi 2.x:让PHP接口开发从“简单”到“极简”的开源框架

—— 专为高效开发而生&#xff0c;助你轻松构建高可用API接口 一、为什么选择PhalApi 2.x&#xff1f; 1.轻量高效&#xff0c;性能卓越 PhalApi 2.x 是一款专为接口开发设计的轻量级PHP框架&#xff0c;其核心代码精简但功能强大。根据开发者实测&#xff0c;在2核2G服务器…...

库magnet使用指南

Magnet 多线程控制库使用指南 目录 库功能概述环境配置核心类与接口基础使用示例代码生成工具高级功能与改进建议完整示例代码常见问题解答 https://blink.csdn.net/details/1872803?spm1001.2014.3001.5501 1. 库功能概述 Magnet 库提供以下核心功能&#xff1a; 多线程…...

Oracle数据库数据编程SQL<9.3 数据库逻辑备份和迁移Data Pump (EXPDP/IMPDP) 导出、导入补充>

Oracle Data Pump 是 Oracle 10g 引入的高效数据迁移工具,相比传统的 EXP/IMP 工具,它提供了更强大的功能和显著的性能提升。以下是对 EXPDP 和 IMPDP 工具的全面讲解。 目录 一、高级功能扩展 1. 数据过滤与转换 2. 加密与安全 二、性能调优进阶 1. 并行处理优化 2. …...

Java 企业级应用:SOA 与微服务的对比与选择

企业级应用开发中&#xff0c;架构设计是决定系统可扩展性、可维护性和性能的关键因素。SOA&#xff08;面向服务的架构&#xff09;和微服务架构是两种主流的架构模式&#xff0c;它们各自有着独特的和设计理念适用场景。本文将深入探讨 SOA 和微服务架构的对比&#xff0c;并…...

Linux LED驱动(设备树)

Linux LED驱动&#xff08;设备树&#xff09; 之前的LED驱动直接在驱动文件中定义有关寄存器物理地址&#xff0c;然后使用io_remap函数进行内存映射&#xff0c;得到对应的虚拟地址&#xff0c;最后操作寄存器对应的虚拟地址完成对GPIO的初始化。 但也可以先在设备树文件中创…...

Zookeeper的典型应用场景?

大家好&#xff0c;我是锋哥。今天分享关于【Zookeeper的典型应用场景?】面试题。希望对大家有帮助&#xff1b; Zookeeper的典型应用场景? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 ZooKeeper 是一个开源的分布式协调服务&#xff0c;主要用于管理和协调大…...

数据分析不只是跑个SQL!

数据分析不只是跑个SQL&#xff01; 数据分析五大闭环&#xff0c;你做到哪一步了&#xff1f;闭环一&#xff1a;认识现状闭环二&#xff1a;原因分析闭环三&#xff1a;优化表现闭环四&#xff1a;预测走势闭环五&#xff1a;主动解读数据 数据思维&#xff1a;WHY-WHAT-HOW模…...

面试篇 - GPT-3(Generative Pre-trained Transformer 3)模型

GPT-3&#xff08;Generative Pre-trained Transformer 3&#xff09;模型 模型结构 与GPT-2一样&#xff0c;但是应用了Sparse attention&#xff1a; Dense attention&#xff1a;每个token之间两两计算attention&#xff0c;复杂度为O(n2)。 Sparse attention&#xff1a;…...

Dify智能体平台源码二次开发笔记(4) - 多租户的SAAS版实现

前言 Dify 的多租户功能是其商业版的标准功能&#xff0c;我们应当尊重其盈利模式。只有保持良性的商业运作&#xff0c;Dify 才能持续发展&#xff0c;并为用户提供更优质的功能。因此&#xff0c;此功能仅限学习使用。 我们的需求是&#xff1a;实现类似 SaaS 版的账号隔离&a…...

C# 13新特性 - .NET 9

转载&#xff1a; C# 13 中的新增功能 | Microsoft Learn C# 13 包括以下新增功能。 可以使用最新的 Visual Studio 2022 版本或 .NET 9 SDK 尝试这些功能&#xff1a;Introduced in Visual Studio 2022 Version 17.12 and newer when using C# 13 C# 13 中的新增功能 | Micr…...

【Code】《代码整洁之道》笔记-Chapter9-单元测试

第9章 单元测试 过去十年以来&#xff0c;编程专业领域进步很大。1997年时&#xff0c;没人听说过测试驱动开发。对于我们之中的大多数人来说&#xff0c;单元测试是那种用来确保程序“可运行”的用过即扔的短代码。我们辛勤地编写类和方法&#xff0c;再弄出一些特殊代码来测…...

java -jar 如何持久化运行

在 Linux 中,直接通过 java -jar 启动服务后关闭 SSH 客户端(如 Xshell)会导致服务终止,因为进程默认与当前终端会话绑定。以下是几种解决方案,确保服务在后台持久运行: (1)使用nohup命令,让进程忽略挂断信号,并在后台运行。 ps -ef | grep xxx.jar 或者 ps -ef …...

layui中transfer两个table展示不同的数据列

在项目的任务开发中需要达到transfer右侧table需要有下拉框可选择状态&#xff0c;左侧table不变 使用的layui版本为2.4.5&#xff0c;该版本没有对transfer可自定义数据列的配置&#xff0c;所以改动transfer.js中的源码 以下为transfer.js部分源码 也是transfer.js去render的…...

如何通过Radius认证服务器实现虚拟云桌面安全登录认证:安当ASP身份认证系统解决方案

引言&#xff1a;虚拟化时代的安全挑战 随着云计算和远程办公的普及&#xff0c;虚拟云桌面&#xff08;如VMware Horizon、Citrix&#xff09;已成为企业数字化办公的核心基础设施。然而&#xff0c;传统的用户名密码认证方式暴露了诸多安全隐患&#xff1a;弱密码易被暴力破…...

如何用DeepSeek大模型提升MySQL DBA工作效率?实战案例解析

如何用DeepSeek大模型提升MySQL DBA工作效率&#xff1f;实战案例解析 MySQL DBA&#xff08;数据库管理员&#xff09;的工作涉及数据库监控、SQL优化、故障排查、备份恢复等复杂任务&#xff0c;传统方式依赖手动操作和经验判断&#xff0c;效率较低。而DeepSeek大模型可以结…...

【机器学习】机器学习笔记

1 机器学习定义 计算机程序从经验E中学习&#xff0c;解决某一任务T&#xff0c;进行某一性能P&#xff0c;通过P测定在T上的表现因经验E而提高。 eg&#xff1a;跳棋程序 E&#xff1a; 程序自身下的上万盘棋局 T&#xff1a; 下跳棋 P&#xff1a; 与新对手下跳棋时赢的概率…...

CFD中的动量方程非守恒形式详解

在计算流体力学&#xff08;CFD&#xff09;中&#xff0c;动量方程可以写成守恒形式和非守恒形式&#xff0c;两者在数学上等价&#xff0c;但推导方式和应用场景不同。以下是对非守恒形式的详细解释&#xff1a; 1. 动量方程的守恒形式 首先回顾守恒形式的动量方程&#xff…...

如何在本地修改 Git 项目的远程仓库地址

✅ 场景说明 你当前的 Git 项目地址是&#xff1a; http://192.168.0.16/xxx.git你希望把它改成&#xff1a; http://192.168.0.22:8099/xxx.git&#x1f9e9; 操作步骤 步骤 ①&#xff1a;进入项目所在目录 你已经在正确路径下了&#xff1a; cd C:\Develop\xxx确认这个…...

clickhouse中的窗口函数

窗口函数 边界核心参数 窗口边界通过 ROWS、RANGE 或 GROUPS 模式定义,语法为: ROWS BETWEEN AND 基于 ​物理行位置 定义窗口,与排序键的实际值无关,适用于精确控制窗口行数 – 或 RANGE BETWEEN AND 基于 ​排序键的数值范围 定义窗口,适用于时间序列或连续数值的场景(…...

如何从项目目标到成功标准:构建可量化、可落地的项目评估体系

引言 在项目管理领域&#xff0c;"项目成功"的定义往往比表面看起来更复杂。根据PMI的行业报告&#xff0c;67%的项目失败源于目标与成功标准的不匹配。当项目团队仅关注"按时交付"或"预算达标"时&#xff0c;常会忽视真正的价值创造。本文将通…...

fbx/obj/glb/gltf/b3dm等通用格式批量转换成osgb

fbx/obj/glb/gltf/b3dm等通用格式批量转换成osgb fbx/obj/glb/gltf/b3dm等通用格式批量转换成osgb...

STM32 BOOT设置,bootloader,死锁使用方法

目录 BOOT0 BOOT1的配置含义 bootloader使用方法 芯片死锁解决方法开发调试过程中&#xff0c;由于某种原因导致内部Flash锁死&#xff0c;无法连接SWD以及JTAG调试&#xff0c;无法读到设备&#xff0c;可以通过修改BOOT模式重新刷写代码。修改为BOOT01&#xff0c;BOOT10…...

vue2 设置ant-table和el-table隔行变色

vue2 设置ant-table和el-table隔行变色 ant-table /* 奇数行 */ ::v-deep .ant-table-tbody > tr:nth-child(odd) {background-color: transparent; } /* 偶数行 */ ::v-deep .ant-table-tbody > tr:nth-child(even) {background-color: rgba(15, 166, 255, 0.26); }el…...

【Redis】string类型

目录 1、介绍2、底层实现【1】SDS【2】int编码【3】embstr编码【4】raw编码【5】embstr和raw的区别 3、常用指令【1】字符串基本操作&#xff1a;【2】批量操作【3】计数器【4】过期时间【5】不存在就插入 4、使用场景 1、介绍 string是redis中最简单的键值对形式&#xff0c;…...