基于PyQt5的自動化任務管理軟件:高效、智能的任務調度與執行管理

基于PyQt5的自動化任務管理軟件:高效、智能的任務調度與執行管理

相關資源文件已經打包成EXE文件,可雙擊直接運行程序,且文章末尾已附上相關源碼,以供大家學習交流,博主主頁還有更多Python相關程序案例,秉著開源精神的想法,望大家喜歡,點個關注不迷路!!!

在這里插入圖片描述

一、項目概述

本項目通過PyQt5構建圖形界面,使用Python實現了一個自動化任務管理系統。該系統支持添加各種類型的任務,能夠根據用戶設置的時間自動執行任務,如打開程序、關閉程序、關機、重啟、鎖屏等,同時記錄任務執行過程中的日志,幫助用戶實時跟蹤任務的執行狀態。

項目目標

  1. 任務類型:支持打開程序、關閉程序、關機、重啟和鎖屏等任務類型。
  2. 任務調度:能夠按計劃時間定時執行任務,支持計劃時間選擇和倒計時執行。
  3. 日志記錄:每個任務的執行狀態和結果都會被記錄到日志中,方便用戶查看歷史記錄。
  4. UI設計:通過PyQt5實現用戶友好的圖形界面,支持添加、刪除、取消任務,界面美觀,操作簡單。

二、功能使用

1. 添加任務

在任務管理界面中,用戶可以通過選擇任務類型(如打開程序、關閉程序、關機等)并設置目標路徑(程序的路徑),來創建一個新的任務。例如,選擇“打開程序”后,用戶可以通過“瀏覽”按鈕選擇需要啟動的程序路徑,設置好計劃執行時間后,點擊“添加任務”按鈕,系統會根據設定的時間自動執行該任務。

2. 定時任務執行

任務被成功添加后,系統會計算當前時間與任務設定時間之間的差值,然后通過定時器(QTimer)在任務設定的時間點觸發任務執行。例如,如果設置任務在“2023年12月31日 20:00:00”執行,程序會在該時刻自動運行相應的操作,如啟動程序、關機等。

3. 任務管理

在任務列表中,用戶可以查看所有已添加的任務,并根據任務的執行狀態進行管理。系統支持以下操作:

取消任務:用戶可以取消一個待執行的任務,任務一旦被取消,將不會再執行。

刪除任務:用戶可以刪除已經執行過的任務,這樣可以清理歷史記錄。

查看日志:每個任務的執行日志會實時記錄,包括任務的啟動、執行結果、是否成功等信息,用戶可以查看并導出日志,進行長期保存。

4. 日志功能

在任務管理軟件中,日志功能是一個非常重要的部分。所有任務的執行過程都會被記錄到日志中,用戶可以實時查看任務的執行狀態。如果任務執行失敗,錯誤信息會被詳細記錄,并可以導出成文本文件,方便后期審查和分析。

def log_task(self, task, message):timestamp = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")log_entry = f"{timestamp}: {message}"self.logs.append(log_entry)self.update_log_view()

通過log_task函數,任務執行過程中產生的各種信息(如任務開始執行、執行成功或失敗、錯誤信息等)都會記錄在日志中。用戶還可以導出這些日志,以便進一步分析。

5. 自定義界面設計

整個軟件的界面使用了PyQt5框架進行設計。界面元素簡潔、直觀,用戶可以方便地進行任務添加、刪除、查看日志等操作。同時,通過QSS(Qt樣式表)實現了美觀的界面風格,如任務表格的樣式、按鈕的動態變化等,極大提升了用戶體驗。

def get_button_style(self, color):return f"""QPushButton {{background-color: {color};color: white;border: none;border-radius: 4px;padding: 8px;}}QPushButton:hover {{background-color: {self.darken_color(color)};}}QPushButton:pressed {{background-color: {self.darken_color(color, 30)};}}"""

通過get_button_style函數,按鈕在不同狀態下(如懸停、點擊)會顯示不同的顏色,增加了界面的交互性。

三、代碼實現與技術解析

1. PyQt5界面設計

在本項目中,界面設計主要通過PyQt5中的各種布局組件(如QVBoxLayout, QHBoxLayout, QTableWidget等)來實現。QTableWidget用于顯示任務列表,QComboBox用于選擇任務類型,QLineEdit用于輸入目標路徑,QPushButton用于操作按鈕。

2. 定時任務執行

定時任務的實現依賴于QTimer類,系統通過計算當前時間與任務設定時間之間的差值來啟動定時器,一旦定時器到期,就會調用任務執行函數。通過這種方式,可以非常準確地按照用戶設定的時間執行任務。

3. 任務執行與錯誤處理

在執行任務時,系統會根據任務類型調用相應的操作。例如,調用subprocess.Popen來啟動程序,調用os.system來關機或重啟。如果任務執行失敗,系統會捕獲異常并記錄錯誤信息到日志中。

def execute_task(self, task):try:if task_type == '打開程序':subprocess.Popen(target_path)elif task_type == '關閉程序':os.system(f'taskkill /IM {os.path.basename(target_path)} /F /T')elif task_type == '關機':os.system("shutdown /s /t 0")elif task_type == '重啟':os.system("shutdown /r /t 0")elif task_type == '鎖屏':os.system("rundll32.exe user32.dll,LockWorkStation")except Exception as e:status = f"失敗: {str(e)}"log_entry += f" - 錯誤: {status}"else:log_entry += " - 成功"

4. 日志導出

用戶可以將日志導出為文本文件,方便長期保存。通過QFileDialog對話框,用戶可以選擇保存日志的路徑和文件名,系統會將日志內容寫入到指定的文件中。

def export_logs(self):file_path, _ = QFileDialog.getSaveFileName(self, '導出日志', f'任務日志_{timestamp}.txt', 'Text Files (*.txt);;All Files (*)')if file_path:try:with open(file_path, 'w', encoding='utf-8') as f:f.write("=== 任務執行日志 ===\n")f.write(f"導出時間: {datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')}\n\n")for log in self.logs:f.write(log + '\n')QMessageBox.information(self, "成功", f"日志已成功導出到:\n{file_path}")except Exception as e:QMessageBox.critical(self, "錯誤", f"導出日志失敗:\n{str(e)}")

四、效果展示

在這里插入圖片描述

在這里插入圖片描述

五、相關源碼

import sys
import os
import subprocess
import datetime
from PyQt5.QtCore import Qt, QDateTime, QTimer
from PyQt5.QtGui import QIcon, QColor, QBrush
from PyQt5.QtWidgets import (QApplication, QWidget, QVBoxLayout, QHBoxLayout, QPushButton, QComboBox,QLineEdit, QLabel, QTableWidget, QTableWidgetItem, QFileDialog,QDateTimeEdit, QMessageBox, QTextEdit, QHeaderView, QSizePolicy
)class TaskManager(QWidget):def __init__(self):super().__init__()self.setWindowTitle('自動化任務管理軟件')self.setWindowIcon(QIcon('icon.png'))self.setGeometry(100, 100, 1000, 700)self.setup_ui_style()self.tasks = []self.task_timers = {}self.task_id_counter = 0self.logs = []self.init_ui()def setup_ui_style(self):self.setStyleSheet("""QWidget {font-family: 'Microsoft YaHei';font-size: 12px;}QLabel {font-weight: bold;}QTableWidget {alternate-background-color: #f5f5f5;selection-background-color: #e0f7fa;border: 1px solid #e0e0e0;}QHeaderView::section {background-color: #607d8b;color: white;padding: 8px;font-weight: bold;}QLineEdit, QDateTimeEdit, QComboBox {padding: 5px;border: 1px solid #bdbdbd;border-radius: 3px;min-height: 25px;}QTextEdit {background-color: #fafafa;border: 1px solid #e0e0e0;padding: 5px;}""")def init_ui(self):main_layout = QVBoxLayout()main_layout.setContentsMargins(15, 15, 15, 15)main_layout.setSpacing(15)# 任務類型選擇task_type_layout = QHBoxLayout()task_type_layout.setSpacing(10)self.task_type_combo = QComboBox()self.task_type_combo.setMinimumWidth(200)self.task_type_combo.addItems(['打開程序', '關閉程序', '關機', '重啟', '鎖屏'])self.task_type_combo.currentIndexChanged.connect(self.update_target_path_status)task_type_layout.addWidget(QLabel('任務類型:'))task_type_layout.addWidget(self.task_type_combo)main_layout.addLayout(task_type_layout)# 目標路徑輸入self.target_path_input = QLineEdit()self.target_path_input.setPlaceholderText("請輸入程序路徑(如:C:\\Program Files\\App\\app.exe)")self.browse_button = QPushButton("瀏覽")self.browse_button.setFixedWidth(80)self.browse_button.setStyleSheet(self.get_button_style("#2196F3"))self.browse_button.clicked.connect(self.browse_file)target_layout = QHBoxLayout()target_layout.setSpacing(10)target_layout.addWidget(QLabel('目標路徑:'))target_layout.addWidget(self.target_path_input)target_layout.addWidget(self.browse_button)main_layout.addLayout(target_layout)# 執行時間選擇self.execution_time_picker = QDateTimeEdit()self.execution_time_picker.setCalendarPopup(True)self.execution_time_picker.setDisplayFormat("yyyy-MM-dd HH:mm:ss")current_time = QDateTime.currentDateTime()current_time.setSecsSinceEpoch(current_time.toSecsSinceEpoch() - current_time.time().second())self.execution_time_picker.setDateTime(current_time)time_layout = QHBoxLayout()time_layout.addWidget(QLabel('執行時間:'))time_layout.addWidget(self.execution_time_picker)main_layout.addLayout(time_layout)# 操作按鈕button_layout = QHBoxLayout()button_layout.setSpacing(20)self.add_task_button = QPushButton('添加任務')self.add_task_button.setFixedHeight(35)self.add_task_button.setStyleSheet(self.get_button_style("#4CAF50"))self.add_task_button.clicked.connect(self.add_task)self.export_log_button = QPushButton('導出日志')self.export_log_button.setFixedHeight(35)self.export_log_button.setStyleSheet(self.get_button_style("#2196F3"))self.export_log_button.clicked.connect(self.export_logs)button_layout.addWidget(self.add_task_button)button_layout.addWidget(self.export_log_button)main_layout.addLayout(button_layout)# 任務列表self.task_table = QTableWidget(0, 5)self.task_table.setHorizontalHeaderLabels(['任務類型', '目標路徑', '執行時間', '執行狀態', '操作'])self.task_table.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)self.task_table.setColumnWidth(3, 100)self.task_table.setColumnWidth(4, 120)self.task_table.verticalHeader().setDefaultSectionSize(40)self.task_table.setAlternatingRowColors(True)main_layout.addWidget(QLabel('任務列表:'))main_layout.addWidget(self.task_table)# 日志顯示self.log_text_edit = QTextEdit()self.log_text_edit.setReadOnly(True)main_layout.addWidget(QLabel('日志:'))main_layout.addWidget(self.log_text_edit)self.setLayout(main_layout)def get_button_style(self, color):return f"""QPushButton {{background-color: {color};color: white;border: none;border-radius: 4px;padding: 8px;}}QPushButton:hover {{background-color: {self.darken_color(color)};}}QPushButton:pressed {{background-color: {self.darken_color(color, 30)};}}"""def darken_color(self, hex_color, percent=20):"""顏色變暗效果"""hex_color = hex_color.lstrip('#')rgb = tuple(int(hex_color[i:i+2], 16) for i in (0, 2, 4))darkened = tuple(max(0, int(c * (100 - percent) / 100)) for c in rgb)return f"#{darkened[0]:02x}{darkened[1]:02x}{darkened[2]:02x}"def update_target_path_status(self):task_type = self.task_type_combo.currentText()if task_type in ['打開程序', '關閉程序']:self.target_path_input.setEnabled(True)self.browse_button.setEnabled(True)else:self.target_path_input.setEnabled(False)self.browse_button.setEnabled(False)def browse_file(self):file_path, _ = QFileDialog.getOpenFileName(self, '選擇程序', '', 'Executable Files (*.exe);;All Files (*)')if file_path:self.target_path_input.setText(file_path)def add_task(self):task_type = self.task_type_combo.currentText()target_path = self.target_path_input.text()execution_time = self.execution_time_picker.dateTime()execution_time_str = execution_time.toString("yyyy-MM-dd HH:mm:ss")# 檢查執行時間是否已過期if execution_time < QDateTime.currentDateTime():error_msg = f"錯誤:不能添加過期任務(計劃時間:{execution_time_str})"self.show_error(error_msg)self.log_task(None, error_msg)returnif task_type in ['打開程序', '關閉程序'] and not target_path:error_msg = '錯誤:目標路徑不能為空!'self.show_error(error_msg)self.log_task(None, error_msg)returntask_id = self.task_id_counterself.task_id_counter += 1task = {'task_id': task_id,'任務類型': task_type,'目標路徑': target_path,'執行時間': execution_time_str,'執行狀態': '待執行'}delay = QDateTime.currentDateTime().msecsTo(execution_time)if delay <= 0:self.execute_task(task)else:timer = QTimer(self)timer.setSingleShot(True)timer.timeout.connect(lambda: self.execute_task(task))timer.start(delay)self.task_timers[task_id] = timerself.tasks.append(task)self.update_task_table()log_entry = f"已添加任務:{task_type} {target_path if target_path else ''},計劃執行時間:{execution_time_str}"self.log_task(task, log_entry)def execute_task(self, task):task_type = task['任務類型']target_path = task['目標路徑']status = '執行成功'log_entry = f"開始執行任務:{task_type} {target_path if target_path else ''}"try:if task_type == '打開程序':subprocess.Popen(target_path)elif task_type == '關閉程序':os.system(f'taskkill /IM {os.path.basename(target_path)} /F /T')elif task_type == '關機':os.system("shutdown /s /t 0")elif task_type == '重啟':os.system("shutdown /r /t 0")elif task_type == '鎖屏':os.system("rundll32.exe user32.dll,LockWorkStation")except Exception as e:status = f"失敗: {str(e)}"log_entry += f" - 錯誤: {status}"else:log_entry += " - 成功"task['執行狀態'] = '已執行'if task['task_id'] in self.task_timers:del self.task_timers[task['task_id']]self.log_task(task, log_entry)self.update_task_table()def update_task_table(self):self.task_table.setRowCount(0)for row, task in enumerate(self.tasks):self.task_table.insertRow(row)self.task_table.setRowHeight(row, 40)# 任務類型列type_item = QTableWidgetItem(task['任務類型'])self.task_table.setItem(row, 0, type_item)# 目標路徑列path_item = QTableWidgetItem(task['目標路徑'])path_item.setToolTip(task['目標路徑'])self.task_table.setItem(row, 1, path_item)# 執行時間列time_item = QTableWidgetItem(task['執行時間'])self.task_table.setItem(row, 2, time_item)# 執行狀態列status_item = QTableWidgetItem(task['執行狀態'])status_item.setTextAlignment(Qt.AlignCenter)if task['執行狀態'] == '已執行':status_item.setBackground(QBrush(QColor(200, 200, 200)))  # 灰色status_item.setForeground(QBrush(QColor(50, 50, 50)))else:status_item.setBackground(QBrush(QColor(144, 238, 144)))  # 淺綠色status_item.setForeground(QBrush(QColor(0, 100, 0)))self.task_table.setItem(row, 3, status_item)# 操作列button_container = QWidget()button_layout = QHBoxLayout(button_container)button_layout.setContentsMargins(5, 2, 5, 2)button_layout.setSpacing(5)if task['執行狀態'] == '待執行':cancel_button = QPushButton('取消任務')cancel_button.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)cancel_button.setStyleSheet(self.get_button_style("#f44336"))cancel_button.clicked.connect(lambda _, r=row: self.cancel_task(r))button_layout.addWidget(cancel_button)else:delete_button = QPushButton('刪除任務')delete_button.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)delete_button.setStyleSheet(self.get_button_style("#f44336"))delete_button.clicked.connect(lambda _, r=row: self.delete_task(r))button_layout.addWidget(delete_button)self.task_table.setCellWidget(row, 4, button_container)def cancel_task(self, row):if row < 0 or row >= len(self.tasks):returntask_to_cancel = self.tasks[row]# 停止定時器if task_to_cancel['task_id'] in self.task_timers:timer = self.task_timers[task_to_cancel['task_id']]if timer.isActive():timer.stop()del self.task_timers[task_to_cancel['task_id']]# 從任務列表中移除self.tasks.pop(row)# 從表格中移除self.task_table.removeRow(row)# 記錄日志log_entry = f"已取消任務:{task_to_cancel['任務類型']} {task_to_cancel['目標路徑'] if task_to_cancel['目標路徑'] else ''},原計劃執行時間:{task_to_cancel['執行時間']}"self.log_task(task_to_cancel, log_entry)QMessageBox.information(self, "成功", "任務已取消并刪除!")def delete_task(self, row):if row < 0 or row >= len(self.tasks):returntask_to_delete = self.tasks[row]self.tasks.pop(row)self.task_table.removeRow(row)log_entry = f"已刪除任務:{task_to_delete['任務類型']} {task_to_delete['目標路徑'] if task_to_delete['目標路徑'] else ''},原執行時間:{task_to_delete['執行時間']}"self.log_task(task_to_delete, log_entry)QMessageBox.information(self, "成功", "任務已刪除!")def log_task(self, task, message):timestamp = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")log_entry = f"{timestamp}: {message}"self.logs.append(log_entry)self.update_log_view()def update_log_view(self):self.log_text_edit.clear()for log in self.logs:self.log_text_edit.append(log)def export_logs(self):timestamp = datetime.datetime.now().strftime("%Y%m%d%H%M%S")file_path, _ = QFileDialog.getSaveFileName(self, '導出日志', f'任務日志_{timestamp}.txt', 'Text Files (*.txt);;All Files (*)')if file_path:try:with open(file_path, 'w', encoding='utf-8') as f:f.write("=== 任務執行日志 ===\n")f.write(f"導出時間: {datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')}\n\n")for log in self.logs:f.write(log + '\n')QMessageBox.information(self, "成功", f"日志已成功導出到:\n{file_path}")except Exception as e:QMessageBox.critical(self, "錯誤", f"導出日志失敗:\n{str(e)}")def show_error(self, message):msg = QMessageBox(self)msg.setIcon(QMessageBox.Critical)msg.setWindowTitle("錯誤")msg.setText(message)msg.setStyleSheet("""QMessageBox {font-family: 'Microsoft YaHei';}QMessageBox QLabel {font-size: 12px;}""")msg.exec_()if __name__ == '__main__':app = QApplication(sys.argv)app.setStyle('Fusion')task_manager = TaskManager()task_manager.show()sys.exit(app.exec_())

六、總結

通過使用PyQt5和Python,成功實現了一個功能完善的自動化任務管理軟件。該軟件能夠滿足日常使用中對定時任務執行的需求,具備豐富的功能,包括任務添加、定時執行、任務取消、任務刪除和日志導出等。通過對PyQt5的靈活使用和Python的強大支持,使得這一軟件在功能實現、界面交互等方面都做得非常優秀。

未來可以進一步擴展和優化該軟件的功能,例如:

  • 支持更多的任務類型,如自動備份文件、自動清理系統等。
  • 增加任務優先級管理,讓用戶可以根據任務的緊急程度設定執行順序。
  • 加強錯誤處理和系統監控功能,提供更多的反饋信息。

總的來說,這是一個非常適合個人和小型團隊使用的自動化任務管理工具,能夠顯著提高工作效率和系統管理的便捷性。

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

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

相關文章

JavaScript 庫:全面解析與推薦

JavaScript 庫:全面解析與推薦 引言 JavaScript 作為當今最流行的前端開發語言之一,擁有豐富的庫和框架。這些庫和框架極大地簡化了開發工作,提高了開發效率。本文將全面解析 JavaScript 庫,并推薦一些優秀的庫,幫助開發者更好地掌握 JavaScript。 JavaScript 庫概述 …

C#從入門到精通(5)

目錄 第十二章 其他基礎知識 &#xff08;1&#xff09;抽象類和方法 &#xff08;2&#xff09;接口 &#xff08;3&#xff09;集合與索引器 &#xff08;4&#xff09;委托和匿名方法 &#xff08;5&#xff09;事件 &#xff08;6&#xff09;迭代器 &#xff08;7…

【區塊鏈安全 | 第十四篇】類型之值類型(一)

文章目錄 值類型布爾值整數運算符取模運算指數運算 定點數地址&#xff08;Address&#xff09;類型轉換地址成員balance 和 transfersendcall&#xff0c;delegatecall 和 staticcallcode 和 codehash 合約類型&#xff08;Contract Types&#xff09;固定大小字節數組&#x…

Windows 系統下多功能免費 PDF 編輯工具詳解

IceCream PDF Editor是一款極為實用且操作簡便的PDF文件編輯工具&#xff0c;它完美適配Windows操作系統。其用戶界面設計得十分直觀&#xff0c;哪怕是初次接觸的用戶也能快速上手。更為重要的是&#xff0c;該軟件具備豐富多樣的強大功能&#xff0c;能全方位滿足各類PDF編輯…

vue3相比于vue2的提升

性能提升&#xff1a; Vue3的頁面渲染速度更快、性能更好。特別是在處理大量數據和復雜組件時&#xff0c;優勢更加明顯。Vue3引入了編譯時優化&#xff0c;如靜態節點提升&#xff08;hoistStatic&#xff09;、補丁標志&#xff08;patchflag&#xff09;等&#xff0c;這些…

Redis 梳理匯總目錄

Redis 哨兵集群&#xff08;Sentinel&#xff09;與 Cluster 集群對比-CSDN博客 如何快速將大規模數據保存到Redis集群-CSDN博客 Redis的一些高級指令-CSDN博客 Redis 篇-CSDN博客

【奇點時刻】GPT-4o新生圖特性深度洞察報告

以下報告圍繞最新推出的「GPT4o」最新圖像生成技術展開&#xff0c;旨在讓讀者從整體層面快速了解其技術原理、功能亮點&#xff0c;以及與其他常見圖像生成或AI工具的對比分析&#xff0c;同時也會客觀探討該技術在應用過程中可能遇到的挑戰與限制。 1. 技術背景概述 GPT4o新…

【算法day28】解數獨——編寫一個程序,通過填充空格來解決數獨問題

37. 解數獨 編寫一個程序&#xff0c;通過填充空格來解決數獨問題。 數獨的解法需 遵循如下規則&#xff1a; 數字 1-9 在每一行只能出現一次。 數字 1-9 在每一列只能出現一次。 數字 1-9 在每一個以粗實線分隔的 3x3 宮內只能出現一次。&#xff08;請參考示例圖&#xff…

【已解決】Javascript setMonth跨月問題;2025-03-31 setMonth后變成 2025-05-01

文章目錄 bug重現解決方法&#xff1a;用第三方插件來實現&#xff08;不推薦原生代碼來實現&#xff09;。項目中用的有dayjs。若要自己實現&#xff0c;參考 AI給出方案&#xff1a; bug重現 今天&#xff08;2025-04-01&#xff09;遇到的一個問題。原代碼邏輯大概是這樣的…

力扣刷題-熱題100題-第29題(c++、python)

19. 刪除鏈表的倒數第 N 個結點 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/remove-nth-node-from-end-of-list/description/?envTypestudy-plan-v2&envIdtop-100-liked 計算鏈表長度 對于鏈表&#xff0c;難的就是不知道有多少元素&#xff…

【QT】QT的多界面跳轉以及界面之間傳遞參數

QT的多界面跳轉以及界面之間傳遞參數 一、在QT工程中添加新的界面二、多界面跳轉的兩種情況1、A界面跳到B界面&#xff0c;不需要返回2、A界面跳到B界面&#xff0c;需要返回1&#xff09;使用this指針傳遞將當前界面地址傳遞給下一界面2&#xff09;使用parentWidget函數獲取上…

【力扣hot100題】(022)反轉鏈表

非常經典&#xff0c;我寫的比較復雜&#xff0c;一直以來的思路都是這樣&#xff0c;就沒有去找更簡單的解法&#xff1a;&#xff08;做鏈表題習慣加頭結點的前置節點了&#xff0c;去掉也行&#xff09; /*** Definition for singly-linked list.* struct ListNode {* …

劍指Offer(數據結構與算法面試題精講)C++版——day2

劍指Offer(數據結構與算法面試題精講)C++版——day2 題目一:只出現一次的數據題目二:單詞長度的最大乘積題目三:排序數組中的兩個數字之和題目一:只出現一次的數據 一種很簡單的思路是,使用數組存儲出現過的元素,比如如果0出現過,那么arr[0]=1,但是有個問題,題目中沒…

【C++游戲引擎開發】《線性代數》(3):矩陣乘法的SIMD優化與轉置加速

一、矩陣乘法數學原理與性能瓶頸 1.1 數學原理 矩陣乘法定義為:給定兩個矩陣 A ( m n ) \mathrm{A}(mn) A(mn)和 B ( n p ) \mathrm{B}(np) B(np),它們的乘積 C = A B \mathrm{C}=AB C=AB 是一個 m p \mathrm{m}p mp 的矩陣,其中: C i , j = ∑ k = 1…

Vue Transition組件類名+TailwindCSS

#本文教學結合TailwindCSS實現一個Transition動畫的例子# 舉例代碼&#xff1a; <transition enter-active-class"transition-all duration-300 ease-out"enter-from-class"opacity-0 translate-y-[-10px]"enter-to-class"opacity-100 translate-…

技術回顧day2

1.獲取文件列表 流程&#xff1a;前端根據查詢條件封裝查詢信息&#xff0c;后端接收后進行封裝&#xff0c;封裝為FileInfoQuery,根據fileInfoQuery使用mybatis的動態sql來進行查詢。 2.文件分片上傳 每次上傳需要上傳包括(文件名字&#xff0c;文件&#xff0c;md5值&#…

DeepSeek-R1 模型現已在亞馬遜云科技上提供

2025年3月10日更新—DeepSeek-R1現已作為完全托管的無服務器模型在Amazon Bedrock上提供。 2025年2月5日更新—DeepSeek-R1 Distill Llama 和 Qwen模型現已在Amazon Bedrock Marketplace和Amazon SageMaker JumpStart中提供。 在最近的Amazon re:Invent大會上&#xff0c;亞馬…

STP --- 生成樹協議

協議信息 配置 BPDU Protocol identifier&#xff1a;協議標識 Version&#xff1a;協議版本&#xff1a;STP 為 0&#xff0c;RSTP 為 2&#xff0c;MSTP 為 3 type&#xff1a; BPDU 類型 Flag&#xff1a; 標志位 Root ID&#xff1a; 根橋 ID&#xff0c;由兩字節的優…

Ansible playbook-ansible劇本

一.playbook介紹 便于功能的重復使用 本質上就是文本文件&#xff0c;一般都是以.yml結尾的文本文件。 1.遵循YAML語法 1.要求同級別代碼要有相同縮進&#xff0c;建議4個空格。【同級別代碼是同一邏輯的代碼】 在計算機看來空格和Tob鍵是兩個不同的字符。 2.一個鍵對應一…

python的基礎入門

初識Python 什么是Python Python是1門程序設計語言。在開發者眼里&#xff0c;語言可以分為3類&#xff1a; 自然語言&#xff1a;人能聽懂的語言&#xff0c;例如漢語&#xff0c;英語&#xff0c;法語等等。機器語言&#xff1a;機器能聽懂的語言&#xff0c;機器只能聽懂0…