【開源工具】深度解析:基于PyQt6的Windows時間校時同步工具開發全攻略

🕒 【開源工具】深度解析:基于PyQt6的Windows時間校時同步工具開發全攻略

請添加圖片描述

🌈 個人主頁:創客白澤 - CSDN博客
🔥 系列專欄:🐍《Python開源項目實戰》
💡 熱愛不止于代碼,熱情源自每一個靈感閃現的夜晚。愿以開源之火,點亮前行之路。
👍 如果覺得這篇文章有幫助,歡迎您一鍵三連,分享給更多人哦

請添加圖片描述

在這里插入圖片描述

一、概述:時間同步的重要性與工具價值

在現代計算機應用中,準確的時間同步至關重要。無論是金融交易、日志記錄還是分布式系統協同,毫秒級的時間誤差都可能導致嚴重問題。Windows系統雖然內置了時間同步功能,但存在以下痛點:

  1. 同步頻率不可控(默認每周一次)
  2. 服務器選擇有限
  3. 缺乏可視化操作界面
  4. 無法實時查看同步狀態

本文介紹的Windows智能校時工具通過PyQt6實現了以下突破:

  • 多NTP服務器智能選擇
  • 可配置的自動同步周期
  • 直觀的圖形化界面
  • 實時狀態監控
  • 服務器連通性測試

二、功能全景圖

2.1 核心功能矩陣

功能模塊實現方式技術亮點
時間顯示QTimer實時刷新多線程避免UI阻塞
NTP同步ntplib+win32api雙保險機制(NTP+HTTP備用)
自動同步QTimer定時觸發智能間隔配置(1-1440分鐘)
服務器測試多線程并行測試延遲毫秒級統計

2.2 特色功能詳解

  1. 智能降級策略:當NTP協議同步失敗時,自動切換HTTP API備用方案
  2. 跨線程通信:通過PyQt信號槽機制實現線程安全的狀態更新
  3. 系統級集成:調用win32api直接修改系統時間(需管理員權限)

三、效果展示

3.1 主界面布局

在這里插入圖片描述

  • 頂部:大字號時間日期顯示
  • 中部:NTP服務器配置區
  • 底部:操作按鈕與狀態欄

3.2 服務器測試對話框

在這里插入圖片描述

  • 可視化服務器響應延遲
  • 成功/失敗狀態直觀標識

四、實現步驟詳解

4.1 環境準備

pip install pyqt6 ntplib requests pywin32

4.2 核心類結構

在這里插入圖片描述

4.3 關鍵實現步驟

  1. 時間獲取雙保險機制
def do_sync(self):try:# 首選NTP協議response = self.ntp_client.request(ntp_server, version=3, timeout=5)...except ntplib.NTPException:# 備用HTTP方案ntp_time = self.get_time_from_http()
  1. 線程安全的UI更新
class TimeSyncSignals(QObject):update_status = pyqtSignal(str)  # 狀態更新信號sync_complete = pyqtSignal(bool, str, str)  # 完成信號# 子線程通過信號觸發主線程UI更新
self.signals.update_status.emit("正在同步...")

五、代碼深度解析

5.1 NTP時間轉換關鍵代碼

# 獲取NTP響應并轉換時區
response = self.ntp_client.request(server, version=3, timeout=5)
ntp_time = datetime.datetime.fromtimestamp(response.tx_time)  # 本地時間
utc_time = datetime.datetime.utcfromtimestamp(response.tx_time)  # UTC時間# 設置系統時間(必須使用UTC)
win32api.SetSystemTime(utc_time.year, utc_time.month, utc_time.isoweekday() % 7,utc_time.day, utc_time.hour, utc_time.minute,utc_time.second, int(utc_time.microsecond / 1000)
)

5.2 自定義事件處理

class ServerTestEvent(QEvent):def __init__(self, text):super().__init__(QEvent.Type.User)self.text = text# 在子線程中安全更新UI
def add_result(self, text):QApplication.instance().postEvent(self, ServerTestEvent(text))def customEvent(self, event):if isinstance(event, ServerTestEvent):self.result_list.addItem(event.text)

5.3 樣式美化技巧

/* 按鈕漸變效果 */
QPushButton {background: qlineargradient(x1:0, y1:0, x2:1, y2:1,stop:0 #4CAF50, stop:1 #45a049);border-radius: 4px;color: white;
}/* 列表項懸停效果 */
QListWidget::item:hover {background: #e0e0e0;
}

六、源碼下載與使用說明

6.1 完整源碼

import sys
import datetime
import threading
import requests
import ntplib
import win32api
from PyQt6.QtWidgets import (QApplication, QMainWindow, QWidget, QVBoxLayout, QHBoxLayout, QLabel, QComboBox, QPushButton, QSpinBox, QCheckBox, QListWidget, QMessageBox, QGroupBox, QScrollArea, QDialog)
from PyQt6.QtCore import Qt, QTimer, QDateTime, QObject, pyqtSignal, QEvent
from PyQt6.QtGui import QFont, QIconclass TimeSyncSignals(QObject):update_status = pyqtSignal(str)sync_complete = pyqtSignal(bool, str, str)class TimeSyncApp(QMainWindow):def __init__(self):super().__init__()self.setWindowTitle("🕒 Windows 自動校時工具")self.setGeometry(100, 100, 650, 500)# 初始化變量self.sync_in_progress = Falseself.auto_sync_timer = QTimer()self.auto_sync_timer.timeout.connect(self.sync_time)self.signals = TimeSyncSignals()# 連接信號槽self.signals.update_status.connect(self.update_status_bar)self.signals.sync_complete.connect(self.handle_sync_result)# 創建主界面self.init_ui()# 啟動時間更新定時器self.time_update_timer = QTimer()self.time_update_timer.timeout.connect(self.update_current_time)self.time_update_timer.start(1000)# 初始化NTP客戶端self.ntp_client = ntplib.NTPClient()def init_ui(self):# 主窗口布局central_widget = QWidget()self.setCentralWidget(central_widget)main_layout = QVBoxLayout(central_widget)main_layout.setSpacing(15)main_layout.setContentsMargins(20, 20, 20, 20)# 標題title_label = QLabel("🕒 Windows 自動校時工具")title_font = QFont("Segoe UI", 18, QFont.Weight.Bold)title_label.setFont(title_font)title_label.setStyleSheet("color: #4CAF50;")title_label.setAlignment(Qt.AlignmentFlag.AlignCenter)main_layout.addWidget(title_label)# 當前時間顯示time_group = QGroupBox("🕰? 當前系統時間")time_group.setStyleSheet("QGroupBox { font-weight: bold; }")time_layout = QVBoxLayout(time_group)self.current_time_label = QLabel()time_font = QFont("Segoe UI", 24)self.current_time_label.setFont(time_font)self.current_time_label.setStyleSheet("color: #2196F3;")self.current_time_label.setAlignment(Qt.AlignmentFlag.AlignCenter)time_layout.addWidget(self.current_time_label)self.current_date_label = QLabel()date_font = QFont("Segoe UI", 12)self.current_date_label.setFont(date_font)self.current_date_label.setAlignment(Qt.AlignmentFlag.AlignCenter)time_layout.addWidget(self.current_date_label)main_layout.addWidget(time_group)# 同步選項sync_group = QGroupBox("?? 同步選項")sync_group.setStyleSheet("QGroupBox { font-weight: bold; }")sync_layout = QVBoxLayout(sync_group)# NTP服務器選擇ntp_layout = QHBoxLayout()ntp_label = QLabel("NTP 服務器:")ntp_label.setFont(QFont("Segoe UI", 10))self.ntp_combo = QComboBox()self.ntp_combo.addItems(["time.windows.com","time.nist.gov","pool.ntp.org","time.google.com","time.apple.com","ntp.aliyun.com","ntp.tencent.com"])self.ntp_combo.setCurrentIndex(0)self.ntp_combo.setFont(QFont("Segoe UI", 10))ntp_layout.addWidget(ntp_label)ntp_layout.addWidget(self.ntp_combo)sync_layout.addLayout(ntp_layout)# 同步間隔interval_layout = QHBoxLayout()interval_label = QLabel("自動同步間隔 (分鐘):")interval_label.setFont(QFont("Segoe UI", 10))self.interval_spin = QSpinBox()self.interval_spin.setRange(1, 1440)self.interval_spin.setValue(60)self.interval_spin.setFont(QFont("Segoe UI", 10))interval_layout.addWidget(interval_label)interval_layout.addWidget(self.interval_spin)sync_layout.addLayout(interval_layout)# 自動同步開關self.auto_sync_check = QCheckBox("啟用自動同步 🔄")self.auto_sync_check.setFont(QFont("Segoe UI", 10))self.auto_sync_check.stateChanged.connect(self.toggle_auto_sync)sync_layout.addWidget(self.auto_sync_check)main_layout.addWidget(sync_group)# 按鈕區域button_layout = QHBoxLayout()self.sync_button = QPushButton("立即同步時間 ?")self.sync_button.setFont(QFont("Segoe UI", 10, QFont.Weight.Bold))self.sync_button.setStyleSheet("background-color: #4CAF50; color: white;")self.sync_button.clicked.connect(self.sync_time)button_layout.addWidget(self.sync_button)self.server_test_button = QPushButton("測試服務器 🛠?")self.server_test_button.setFont(QFont("Segoe UI", 10))self.server_test_button.clicked.connect(self.show_server_test_dialog)button_layout.addWidget(self.server_test_button)main_layout.addLayout(button_layout)# 狀態欄self.status_bar = self.statusBar()self.status_bar.setFont(QFont("Segoe UI", 9))self.status_bar.showMessage("🟢 就緒")# 初始化當前時間顯示self.update_current_time()def update_current_time(self):now = QDateTime.currentDateTime()self.current_time_label.setText(now.toString("HH:mm:ss"))self.current_date_label.setText(now.toString("yyyy-MM-dd dddd"))def toggle_auto_sync(self, state):if state == Qt.CheckState.Checked.value:minutes = self.interval_spin.value()self.auto_sync_timer.start(minutes * 60000)  # 轉換為毫秒self.status_bar.showMessage(f"🔄 自動同步已啟用,每 {minutes} 分鐘同步一次")else:self.auto_sync_timer.stop()self.status_bar.showMessage("?? 自動同步已禁用")def sync_time(self):if self.sync_in_progress:returnself.sync_in_progress = Trueself.sync_button.setEnabled(False)self.signals.update_status.emit("🔄 正在同步時間...")# 在新線程中執行同步操作sync_thread = threading.Thread(target=self.do_sync, daemon=True)sync_thread.start()def do_sync(self):ntp_server = self.ntp_combo.currentText()try:# 使用NTP協議獲取時間response = self.ntp_client.request(ntp_server, version=3, timeout=5)# 將NTP時間轉換為本地時間ntp_time = datetime.datetime.fromtimestamp(response.tx_time)utc_time = datetime.datetime.utcfromtimestamp(response.tx_time)print(f"從NTP服務器獲取的時間 (UTC): {utc_time}")print(f"轉換為本地時間: {ntp_time}")# 設置系統時間 (需要UTC時間)win32api.SetSystemTime(utc_time.year, utc_time.month, utc_time.isoweekday() % 7,utc_time.day, utc_time.hour, utc_time.minute, utc_time.second, int(utc_time.microsecond / 1000))# 獲取設置后的系統時間new_time = datetime.datetime.now()print(f"設置后的系統時間: {new_time}")# 通過信號發送結果self.signals.sync_complete.emit(True, f"? 時間同步成功! 服務器: {ntp_server}",f"時間已成功同步到 {ntp_server}\nNTP時間 (UTC): {utc_time}\n本地時間: {ntp_time}\n設置后系統時間: {new_time}")except ntplib.NTPException as e:# NTP失敗,嘗試備用方法try:self.signals.update_status.emit("?? NTP同步失敗,嘗試備用方法...")ntp_time = self.get_time_from_http()if ntp_time:utc_time = ntp_time.astimezone(datetime.timezone.utc).replace(tzinfo=None)print(f"從HTTP獲取的時間 (本地): {ntp_time}")print(f"轉換為UTC時間: {utc_time}")win32api.SetSystemTime(utc_time.year, utc_time.month, utc_time.isoweekday() % 7,utc_time.day, utc_time.hour, utc_time.minute, utc_time.second, int(utc_time.microsecond / 1000))new_time = datetime.datetime.now()print(f"設置后的系統時間: {new_time}")self.signals.sync_complete.emit(True,"? 時間同步成功! (備用方法)",f"時間已通過備用方法同步\nHTTP時間: {ntp_time}\nUTC時間: {utc_time}\n設置后系統時間: {new_time}")else:raise Exception("所有同步方法均失敗")except Exception as e:error_msg = f"? 同步失敗: {str(e)}"print(error_msg)self.signals.sync_complete.emit(False,error_msg,f"時間同步失敗:\n{str(e)}")finally:self.sync_in_progress = Falseself.sync_button.setEnabled(True)def get_time_from_http(self):try:# 嘗試使用世界時間APIresponse = requests.get("http://worldtimeapi.org/api/timezone/Etc/UTC", timeout=5)data = response.json()utc_time = datetime.datetime.fromisoformat(data["datetime"])return utc_time.astimezone()  # 轉換為本地時區except:try:# 嘗試使用阿里云APIresponse = requests.get("http://api.m.taobao.com/rest/api3.do?api=mtop.common.getTimestamp", timeout=5)data = response.json()timestamp = int(data["data"]["t"]) / 1000return datetime.datetime.fromtimestamp(timestamp)except:return Nonedef update_status_bar(self, message):self.status_bar.showMessage(message)def handle_sync_result(self, success, status_msg, detail_msg):self.status_bar.showMessage(status_msg)if success:QMessageBox.information(self, "成功", detail_msg)else:QMessageBox.critical(self, "錯誤", detail_msg)def show_server_test_dialog(self):self.test_dialog = ServerTestDialog(self)self.test_dialog.show()class ServerTestDialog(QDialog):def __init__(self, parent=None):super().__init__(parent)self.setWindowTitle("🛠? NTP服務器測試工具")self.setWindowModality(Qt.WindowModality.NonModal)self.setMinimumSize(600, 400)self.ntp_client = ntplib.NTPClient()self.test_in_progress = Falseself.init_ui()def init_ui(self):layout = QVBoxLayout(self)layout.setContentsMargins(15, 15, 15, 15)layout.setSpacing(10)# 標題title_label = QLabel("NTP服務器連通性測試")title_label.setFont(QFont("Segoe UI", 14, QFont.Weight.Bold))title_label.setAlignment(Qt.AlignmentFlag.AlignCenter)layout.addWidget(title_label)# 說明info_label = QLabel("測試各NTP服務器的響應時間和可用性,結果將顯示在下方列表中:")info_label.setFont(QFont("Segoe UI", 10))info_label.setWordWrap(True)layout.addWidget(info_label)# 結果列表self.result_list = QListWidget()self.result_list.setFont(QFont("Consolas", 9))self.result_list.setStyleSheet("""QListWidget {background-color: #f8f8f8;border: 1px solid #ddd;border-radius: 4px;}""")scroll_area = QScrollArea()scroll_area.setWidgetResizable(True)scroll_area.setWidget(self.result_list)layout.addWidget(scroll_area, 1)# 進度標簽self.progress_label = QLabel("準備開始測試...")self.progress_label.setFont(QFont("Segoe UI", 9))self.progress_label.setAlignment(Qt.AlignmentFlag.AlignCenter)layout.addWidget(self.progress_label)# 按鈕區域button_layout = QHBoxLayout()button_layout.setSpacing(15)self.test_button = QPushButton("開始測試")self.test_button.setFont(QFont("Segoe UI", 10))self.test_button.setStyleSheet("""QPushButton {background-color: #4CAF50;color: white;padding: 5px 15px;border: none;border-radius: 4px;}QPushButton:disabled {background-color: #cccccc;}""")self.test_button.clicked.connect(self.start_test)close_button = QPushButton("關閉")close_button.setFont(QFont("Segoe UI", 10))close_button.setStyleSheet("""QPushButton {background-color: #f44336;color: white;padding: 5px 15px;border: none;border-radius: 4px;}""")close_button.clicked.connect(self.close)button_layout.addStretch(1)button_layout.addWidget(self.test_button)button_layout.addWidget(close_button)button_layout.addStretch(1)layout.addLayout(button_layout)def start_test(self):if self.test_in_progress:returnself.test_in_progress = Trueself.test_button.setEnabled(False)self.result_list.clear()self.progress_label.setText("測試進行中...")servers = ["time.windows.com","time.nist.gov","pool.ntp.org","time.google.com","time.apple.com","ntp.aliyun.com","ntp.tencent.com"]print("\n" + "="*50)print("Starting NTP server connectivity test...")print("="*50)test_thread = threading.Thread(target=self.run_server_tests, args=(servers,), daemon=True)test_thread.start()def run_server_tests(self, servers):for server in servers:self.add_result(f"正在測試 {server}...")print(f"\nTesting server: {server}")try:start_time = datetime.datetime.now()response = self.ntp_client.request(server, version=3, timeout=5)end_time = datetime.datetime.now()latency = (end_time - start_time).total_seconds() * 1000  # 毫秒ntp_time = datetime.datetime.fromtimestamp(response.tx_time)result_text = (f"? {server} - 延遲: {latency:.2f}ms - "f"時間: {ntp_time.strftime('%Y-%m-%d %H:%M:%S')}")print(f"Server {server} test successful")print(f"  Latency: {latency:.2f}ms")print(f"  NTP Time: {ntp_time}")self.add_result(result_text)except ntplib.NTPException as e:error_text = f"? {server} - NTP錯誤: {str(e)}"print(f"Server {server} test failed (NTP error): {str(e)}")self.add_result(error_text)except Exception as e:error_text = f"? {server} - 錯誤: {str(e)}"print(f"Server {server} test failed (General error): {str(e)}")self.add_result(error_text)print("\n" + "="*50)print("NTP server testing completed")print("="*50 + "\n")self.test_complete()def add_result(self, text):# 使用QMetaObject.invokeMethod確保線程安全QApplication.instance().postEvent(self, ServerTestEvent(text))def test_complete(self):QApplication.instance().postEvent(self, ServerTestCompleteEvent())def customEvent(self, event):if isinstance(event, ServerTestEvent):self.result_list.addItem(event.text)self.result_list.scrollToBottom()elif isinstance(event, ServerTestCompleteEvent):self.test_in_progress = Falseself.test_button.setEnabled(True)self.progress_label.setText("測試完成")print("All server tests completed")class ServerTestEvent(QEvent):def __init__(self, text):super().__init__(QEvent.Type.User)self.text = textclass ServerTestCompleteEvent(QEvent):def __init__(self):super().__init__(QEvent.Type.User + 1)if __name__ == "__main__":app = QApplication(sys.argv)# 設置應用程序樣式app.setStyle("Fusion")# 設置全局字體font = QFont("Segoe UI", 10)app.setFont(font)window = TimeSyncApp()window.show()sys.exit(app.exec())

6.2 運行要求

  • Windows 7及以上系統
  • Python 3.8+
  • 管理員權限(修改系統時間需要)

6.3 編譯為EXE

pyinstaller --onefile --windowed --icon=time.ico timesync.py

七、總結與拓展方向

7.1 項目亮點

  1. 采用PyQt6現代GUI框架,界面美觀
  2. 雙時間源冗余設計,可靠性高
  3. 完整的異常處理機制
  4. 符合Windows系統規范的時間設置

7.2 優化建議

  1. 增加本地時間服務器配置
  2. 實現時間偏差歷史記錄
  3. 添加UTC/GMT時區切換
  4. 支持Linux/MacOS跨平臺

時間同步看似簡單,實則涉及操作系統底層、網絡協議、多線程編程等多個技術領域。本項目的價值不僅在于實用工具開發,更是PyQt6高級應用的典型案例。建議讀者在此基礎上深入探索Windows系統API和NTP協議的高級用法。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/905151.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/905151.shtml
英文地址,請注明出處:http://en.pswp.cn/news/905151.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

大模型項目:普通藍牙音響接入DeepSeek,解鎖語音交互新玩法

本文附帶視頻講解 【代碼宇宙019】技術方案:藍牙音響接入DeepSeek,解鎖語音交互新玩法_嗶哩嗶哩_bilibili 目錄 效果演示 核心邏輯 技術實現 大模型對話(技術: LangChain4j 接入 DeepSeek) 語音識別(…

qt命名空間演示

#ifndef CIR_H #define CIR_Hnamespace cir {double PI3.141592653;//獲取圓行周長double getLenthOfCircle(double radius){return 2*PI*radius;}//獲取圓形面積double getAreaOfCircle(double radius){return PI*radius*radius;}} #endif // CIR_H#include <iostream> …

使用 Java 反射動態加載和操作類

Java 的反射機制(Reflection)是 Java 語言的一大特色,它允許程序在運行時檢查、加載和操作類、方法、字段等元信息。通過 java.lang.Class 和 java.lang.reflect 包,開發者可以動態加載類、創建實例、調用方法,甚至在運行時構造新類。反射是 Java 靈活性的核心,廣泛應用于…

《 C++ 點滴漫談: 三十七 》左值?右值?完美轉發?C++ 引用的真相超乎你想象!

摘要 本文全面系統地講解了 C 中的引用機制&#xff0c;涵蓋左值引用、右值引用、引用折疊、完美轉發等核心概念&#xff0c;并深入探討其底層實現原理及工程實踐應用。通過詳細的示例與對比&#xff0c;讀者不僅能掌握引用的語法規則和使用技巧&#xff0c;還能理解引用在性能…

【AutoGen深度解析】下一代AI代理編程框架實戰指南

目錄 &#x1f31f; 前言&#x1f3d7;? 技術背景與價值&#x1f6a7; 當前技術痛點&#x1f6e0;? 解決方案概述&#x1f465; 目標讀者說明 &#x1f50d; 一、技術原理剖析&#x1f5bc;? 核心概念圖解&#x1f4a1; 核心作用講解?? 關鍵技術模塊說明&#x1f504; 技術…

Python-AI調用大模型 給出大模型人格案例

Python調用通義千問模擬原神雷電將軍口吻 最近在用AI編輯器寫AI對話 嘗試給AI對話增加人格 以下是使用阿里通義千問大模型模擬《原神》中雷電將軍(雷電影)口吻的代碼案例&#xff0c;包含典型的高傲威嚴、略帶古風的說話風格。 完整后端代碼示例 import dashscope from dash…

csdn博客打賞功能

CSDN_專業開發者社區_已接入DeepSeekR1滿血版 官網: 最右下角 耳機 就是客服 可以轉人工 開啟打賞功能如下: 1.因為博主本人不可以對本人賬號文章進行打賞&#xff0c;因此本人賬號打開文章詳情頁不顯示打賞按鈕。為了驗證賬號設置的打賞功能是否生效所以讓您使用無痕模式模…

【深度學習】目標檢測算法大全

目錄 一、R-CNN 1、R-CNN概述 2、R-CNN 模型總體流程 3、核心模塊詳解 &#xff08;1&#xff09;候選框生成&#xff08;Selective Search&#xff09; &#xff08;2&#xff09;深度特征提取與微調 2.1 特征提取 2.2 網絡微調&#xff08;Fine-tuning&#xff09; …

26考研——中央處理器_指令流水線_指令流水線的基本概念 流水線的基本實現(5)

408答疑 文章目錄 六、指令流水線指令流水線的基本概念流水線的基本實現流水線設計的原則流水線的邏輯結構流水線的時空圖表示 八、參考資料鮑魚科技課件26王道考研書 六、指令流水線 前面介紹的指令都是在單周期處理機中采用串行方法執行的&#xff0c;同一時刻 CPU 中只有一…

配置集群(yarn)

在配置 YARN 集群前&#xff0c;要先完成以下準備工作&#xff1a; 集群環境規劃&#xff1a;明確各節點的角色&#xff0c;如 ResourceManager、NodeManager 等。網絡環境搭建&#xff1a;保證各個節點之間能夠通過網絡互通。時間同步設置&#xff1a;安裝 NTP 服務&#xff0…

vue實現與后臺springboot傳遞數據【傳值/取值 Axios 】

vue實現與后臺springboot傳遞數據【傳值/取值】 提示&#xff1a;幫幫志會陸續更新非常多的IT技術知識&#xff0c;希望分享的內容對您有用。本章分享的是node.js和vue的使用。前后每一小節的內容是存在的有&#xff1a;學習and理解的關聯性。【幫幫志系列文章】&#xff1a;每…

二叉樹路徑總和

一、給你二叉樹的根節點 root 和一個表示目標和的整數 targetSum 。判斷該樹中是否存在根節點到葉子節點的路徑&#xff0c;這條路徑上所有節點值相加等于目標和 targetSum 。如果存在&#xff0c;返回 true &#xff1b;否則&#xff0c;返回 false 。 112. 路徑總和 - 力扣&…

Matlab 模糊控制平行側邊自動泊車

1、內容簡介 Matlab 233-模糊控制平行側邊自動泊車 可以交流、咨詢、答疑 2、內容說明 略 3、仿真分析 略 4、參考論文 略

M0G3507完美移植江科大軟件IIC MPU6050

經過兩天兩夜的查閱文獻資料、整理學習&#xff0c;成功的把江科大的軟件IIC讀寫MPU6050移植到MSPM0G3507&#xff0c;親測有效&#xff01;&#xff01;包的&#xff0c;為了讓大家直觀地感受下&#xff0c;先上圖。記得點個贊哦&#xff01; 學過江科大的STM32的小伙伴是不是…

CI/CD與DevOps流程流程簡述(提供思路)

一 CI/CD流程詳解&#xff1a;代碼集成、測試與發布部署 引言 在軟件開發的世界里&#xff0c;CI/CD&#xff08;持續集成/持續交付&#xff09;就像是一套精密的流水線&#xff0c;確保代碼從開發到上線的整個過程高效、穩定。我作為一名資深的軟件工程師&#xff0c;接下來…

大數據基礎——Ubuntu 安裝

文章目錄 Ubuntu 安裝一、配置電腦二、安裝系統 Ubuntu 安裝 一、配置電腦 1、進入VMware 2、選擇配置類型 3、選擇硬件兼容性版本 4、當前虛擬機的操作系統 選擇“稍后安裝操作系統”&#xff08;修改&#xff09; 5、選擇虛擬機將來需要安裝的系統 選中“Linux”和選擇…

LeetCode百題刷003(449周賽一二題)

遇到的問題都有解決的方案&#xff0c;希望我的博客可以為你提供一些幫助 一、不同字符數量最多為 K 時的最少刪除數 &#xff08;哈希表空間換時間&#xff09; 不同字符數量最多為 K 時的最少刪除數 - 力扣 (LeetCode) 競賽https://leetcode.cn/contest/weekly-contest-449/…

【網安等保】OpenEuler 24.03系統主機安全加固及配置優化實踐指南

[ 知識是人生的燈塔&#xff0c;只有不斷學習&#xff0c;才能照亮前行的道路 ] &#x1f4e2; 大家好&#xff0c;我是 WeiyiGeek&#xff0c;一個正在向全棧工程師(SecDevOps)前進的計算機技術愛好者&#xff0c;歡迎各位道友一起學習交流、一起進步 &#x1f680;&#xff0…

大模型賦能:2D 寫實數字人開啟實時交互新時代

在數字化浪潮席卷全球的當下&#xff0c;人工智能技術不斷突破創新&#xff0c;其中大模型驅動的 2D 寫實數字人正成為實時交互領域的一顆新星&#xff0c;引領著行業變革&#xff0c;為人們帶來前所未有的交互體驗。 一、2D 寫實數字人概述 2D 寫實數字人是通過計算機圖形學…

Dockers部署oscarfonts/geoserver鏡像的Geoserver

Dockers部署oscarfonts/geoserver鏡像的Geoserver 說實話&#xff0c;最后發現要選擇合適的Geoserver鏡像才是關鍵&#xff0c;所以所以所以…&#x1f437; 推薦oscarfonts/geoserver的鏡像&#xff01; 一開始用kartoza/geoserver鏡像一直提示內存不足&#xff0c;不過還好…