最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

基于Python開發(fā)電腦定時(shí)關(guān)機(jī)工具

 更新時(shí)間:2025年01月22日 09:09:03   作者:黑客白澤  
這篇文章主要為大家詳細(xì)介紹了如何基于Python開發(fā)一個(gè)電腦定時(shí)關(guān)機(jī)工具,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下

1. 簡(jiǎn)介

這個(gè)程序就像一個(gè)“忠實(shí)的管家”,幫你按時(shí)關(guān)掉電腦,而且全程不需要你多做什么。你只需要設(shè)定好時(shí)間,它就能在指定的時(shí)刻執(zhí)行關(guān)機(jī)任務(wù),絕對(duì)精準(zhǔn),絕對(duì)準(zhǔn)時(shí)。如果你突然改變主意,管家也非常懂事,立刻取消任務(wù),并且讓你確認(rèn)是否真的要放棄關(guān)機(jī)。

功能概述

1.選擇關(guān)機(jī)時(shí)間:

你可以選擇一個(gè)未來的時(shí)間點(diǎn)(絕對(duì)時(shí)間),或者從現(xiàn)在開始延遲一段時(shí)間(相對(duì)時(shí)間),就像預(yù)約鬧鐘一樣,精確到秒!

2.定時(shí)關(guān)機(jī):

設(shè)置好關(guān)機(jī)時(shí)間后,程序會(huì)自動(dòng)計(jì)算倒計(jì)時(shí),不管你去做什么,它都會(huì)提醒你:“再過 XX 小時(shí) XX 分鐘 XX 秒,電腦就會(huì)乖乖關(guān)機(jī)。”

3.隨時(shí)取消:

你改變了主意,突然不想關(guān)機(jī)了?沒問題!隨時(shí)點(diǎn)擊取消,它會(huì)立馬停止關(guān)機(jī)進(jìn)程,不會(huì)讓你后悔。

4.倒計(jì)時(shí)提醒:

在你設(shè)置的時(shí)間到來之前,它會(huì)在界面上顯示倒計(jì)時(shí),讓你時(shí)刻知道剩余的時(shí)間。想象一下,一邊工作一邊看著電腦準(zhǔn)備入睡的樣子。
簡(jiǎn)而言之,這個(gè)工具就像是一個(gè)非常懂事的“關(guān)機(jī)助手”,不會(huì)打擾你,卻能在你需要它的時(shí)候,安靜地完成任務(wù)。

2. 運(yùn)行效果

3. 相關(guān)源碼

import sys
import datetime
import subprocess
from PyQt6.QtWidgets import (QApplication, QMainWindow, QWidget, QVBoxLayout, 
                             QHBoxLayout, QLabel, QPushButton, QRadioButton, 
                             QDateTimeEdit, QTimeEdit, QMessageBox, QGroupBox, 
                             QSpacerItem, QSizePolicy)
from PyQt6.QtCore import Qt, QTimer, QDateTime
from PyQt6.QtGui import QFont, QColor

# 常量定義
BUTTON_EXECUTE_TEXT = '執(zhí)行'
BUTTON_CANCEL_TEXT = '取消'
BUTTON_EXECUTING_TEXT = '執(zhí)行中...'
LABEL_COUNTDOWN_DEFAULT = '未設(shè)置定時(shí)關(guān)機(jī)'
ALERT_FUTURE_TIME = '請(qǐng)選擇一個(gè)未來的時(shí)間!'
ALERT_CONFIRM_CANCEL = '是否要修改定時(shí)關(guān)機(jī)設(shè)置?'


class ShutdownTimer(QMainWindow):
    def __init__(self):
        super().__init__()
        self.shutdown_time = None
        self.timer = QTimer()
        self.timer.timeout.connect(self.update_countdown)
        self.init_ui()

    def init_ui(self):
        """初始化界面元素"""
        self.setWindowTitle('定時(shí)關(guān)機(jī)工具')
        screen = QApplication.primaryScreen().geometry()
        self.setGeometry(screen.width() // 4, screen.height() // 4, 585, 253)  # 修改窗口尺寸為583x614

        # 主布局
        central_widget = QWidget()
        self.setCentralWidget(central_widget)
        layout = QVBoxLayout(central_widget)

        # 倒計(jì)時(shí)顯示區(qū)域
        self.countdown_label = QLabel(LABEL_COUNTDOWN_DEFAULT)
        self.countdown_label.setAlignment(Qt.AlignmentFlag.AlignCenter)
        self.countdown_label.setStyleSheet("""
            QLabel {
                background-color: black;
                color: red;
                padding: 20px;
                border: 2px solid gray;
                border-radius: 10px;
                font-size: 30px;
            }
        """)
        layout.addWidget(self.countdown_label)

        # 時(shí)間設(shè)置區(qū)域
        self.setup_time_settings(layout)

        # 信號(hào)連接
        self.absolute_radio.toggled.connect(self.toggle_time_input)
        self.execute_btn.clicked.connect(self.execute_shutdown)
        self.cancel_btn.clicked.connect(self.cancel_shutdown)

    def setup_time_settings(self, layout):
        """設(shè)置時(shí)間選擇控件和按鈕"""
        settings_widget = QWidget()
        settings_layout = QHBoxLayout(settings_widget)

        # 時(shí)間選擇區(qū)域
        time_widget = QWidget()
        time_layout = QVBoxLayout(time_widget)

        # 單選按鈕
        self.absolute_radio = QRadioButton('絕對(duì)時(shí)間')
        self.relative_radio = QRadioButton('相對(duì)時(shí)間')
        self.absolute_radio.setChecked(True)
        time_layout.addWidget(self.absolute_radio)
        time_layout.addWidget(self.relative_radio)

        # 時(shí)間選擇器
        self.datetime_edit = QDateTimeEdit()
        self.datetime_edit.setDateTime(QDateTime.currentDateTime().addSecs(3600))  # 默認(rèn)一小時(shí)后
        self.time_edit = QTimeEdit()
        self.time_edit.setTime(self.time_edit.time().addSecs(3600))  # 默認(rèn)一個(gè)小時(shí)后

        time_layout.addWidget(self.datetime_edit)
        time_layout.addWidget(self.time_edit)
        self.time_edit.hide()  # 默認(rèn)隱藏相對(duì)時(shí)間

        settings_layout.addWidget(time_widget)

        # 按鈕區(qū)域
        button_widget = QWidget()
        button_layout = QVBoxLayout(button_widget)

        self.execute_btn = QPushButton(BUTTON_EXECUTE_TEXT)
        self.cancel_btn = QPushButton(BUTTON_CANCEL_TEXT)

        button_layout.addWidget(self.execute_btn)
        button_layout.addWidget(self.cancel_btn)

        settings_layout.addWidget(button_widget)
        layout.addWidget(settings_widget)

        # 添加空白間距
        spacer = QSpacerItem(20, 20, QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding)
        layout.addItem(spacer)

    def toggle_time_input(self):
        """切換時(shí)間輸入方式"""
        if self.absolute_radio.isChecked():
            self.datetime_edit.show()
            self.time_edit.hide()
        else:
            self.datetime_edit.hide()
            self.time_edit.show()

    def execute_shutdown(self):
        """執(zhí)行定時(shí)關(guān)機(jī)"""
        shutdown_time = self.calculate_shutdown_time()
        if not shutdown_time:
            return

        # 設(shè)置關(guān)機(jī)命令
        seconds = int((shutdown_time - datetime.datetime.now()).total_seconds())
        subprocess.run(['shutdown', '/s', '/t', str(seconds)])

        # 更新UI
        self.update_button_state(is_executing=True)

        # 啟動(dòng)倒計(jì)時(shí)
        self.shutdown_time = shutdown_time
        self.timer.start(1000)

    def calculate_shutdown_time(self):
        """計(jì)算定時(shí)關(guān)機(jī)時(shí)間"""
        if self.absolute_radio.isChecked():
            shutdown_time = self.datetime_edit.dateTime().toPyDateTime()
            if shutdown_time <= datetime.datetime.now():
                self.show_warning(ALERT_FUTURE_TIME)
                return None
        else:
            current_time = datetime.datetime.now()
            time_delta = datetime.timedelta(
                hours=self.time_edit.time().hour(),
                minutes=self.time_edit.time().minute(),
                seconds=self.time_edit.time().second()
            )
            shutdown_time = current_time + time_delta

        return shutdown_time

    def show_warning(self, message):
        """顯示警告信息"""
        QMessageBox.warning(self, '警告', message)

    def update_button_state(self, is_executing):
        """更新按鈕狀態(tài)"""
        if is_executing:
            self.execute_btn.setEnabled(False)
            self.execute_btn.setText(BUTTON_EXECUTING_TEXT)
            self.execute_btn.setStyleSheet('background-color: #90EE90; color: gray;')
        else:
            self.execute_btn.setEnabled(True)
            self.execute_btn.setText(BUTTON_EXECUTE_TEXT)
            self.execute_btn.setStyleSheet('')

    def cancel_shutdown(self):
        """取消定時(shí)關(guān)機(jī)"""
        reply = QMessageBox.question(self, '確認(rèn)', ALERT_CONFIRM_CANCEL,
                                     QMessageBox.StandardButton.Yes | QMessageBox.StandardButton.No)

        if reply == QMessageBox.StandardButton.Yes:
            # 取消當(dāng)前關(guān)機(jī)命令
            subprocess.run(['shutdown', '/a'])
            self.reset_ui()
        else:
            subprocess.run(['shutdown', '/a'])
            self.close()

    def reset_ui(self):
        """重置UI狀態(tài)"""
        self.shutdown_time = None
        self.timer.stop()
        self.countdown_label.setText(LABEL_COUNTDOWN_DEFAULT)
        self.update_button_state(is_executing=False)

    def update_countdown(self):
        """更新倒計(jì)時(shí)"""
        if self.shutdown_time:
            remaining = self.shutdown_time - datetime.datetime.now()
            if remaining.total_seconds() <= 0:
                self.timer.stop()
                return

            hours = remaining.seconds // 3600
            minutes = (remaining.seconds % 3600) // 60
            seconds = remaining.seconds % 60

            self.countdown_label.setText(
                f'距離關(guān)機(jī)還有 {hours:02d}小時(shí) {minutes:02d}分 {seconds:02d}秒')


if __name__ == '__main__':
    app = QApplication(sys.argv)
    app.setStyle('Fusion')  # 使用 Fusion 風(fēng)格,接近 Windows 10 風(fēng)格
    window = ShutdownTimer()
    window.show()
    sys.exit(app.exec())

到此這篇關(guān)于基于Python開發(fā)電腦定時(shí)關(guān)機(jī)工具的文章就介紹到這了,更多相關(guān)Python電腦定時(shí)關(guān)機(jī)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • python函數(shù)局部變量用法實(shí)例分析

    python函數(shù)局部變量用法實(shí)例分析

    這篇文章主要介紹了python函數(shù)局部變量用法,較為詳細(xì)的分析了Python局部變量的原理與使用技巧,并對(duì)比分析了局部變量與global全局變量的用法區(qū)別,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-08-08
  • Python不同目錄間進(jìn)行模塊調(diào)用的實(shí)現(xiàn)方法

    Python不同目錄間進(jìn)行模塊調(diào)用的實(shí)現(xiàn)方法

    這篇文章主要介紹了Python不同目錄間進(jìn)行模塊調(diào)用的實(shí)現(xiàn)方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2019-01-01
  • 解決ToPILImage時(shí)出現(xiàn)維度報(bào)錯(cuò)問題pic should be 2/3 dimensional. Got 4 dimensions.

    解決ToPILImage時(shí)出現(xiàn)維度報(bào)錯(cuò)問題pic should be 2/3 d

    這篇文章主要介紹了解決ToPILImage時(shí)出現(xiàn)維度報(bào)錯(cuò)問題pic should be 2/3 dimensional. Got 4 dimensions.具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-02-02
  • python sorted()函數(shù)的key參數(shù)使用說明

    python sorted()函數(shù)的key參數(shù)使用說明

    文章介紹了Python中的sort()和sorted()方法的區(qū)別及其用法,sort()是list的方法,不能對(duì)所有可迭代對(duì)象進(jìn)行排序,且在原地對(duì)列表排序,無返回值,sorted()是內(nèi)置函數(shù),可以對(duì)所有可迭代對(duì)象進(jìn)行排序,并返回一個(gè)新的排序后的列表,文章還提供了sorted()的用法示例
    2025-11-11
  • CentOS 6.5中安裝Python 3.6.2的方法步驟

    CentOS 6.5中安裝Python 3.6.2的方法步驟

    centos 6.5默認(rèn)自帶的python版本為2.6,而下面這篇文章主要給大家介紹了關(guān)于在CentOS 6.5中安裝Python 3.6.2的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-12-12
  • 通過python爬蟲mechanize庫爬取本機(jī)ip地址的方法

    通過python爬蟲mechanize庫爬取本機(jī)ip地址的方法

    python中的mechanize算是一個(gè)比較古老的庫了,在python2的時(shí)代中,使用的多一些,在python3以后就很少使用了,現(xiàn)在已經(jīng)是2202年了,可能很多人都沒聽說過mechanize,這不要緊,我們先來簡(jiǎn)單的講解一下,如何使用mechanize,感興趣的朋友一起看看吧
    2022-08-08
  • Python中的異常類型及處理方式示例詳解

    Python中的異常類型及處理方式示例詳解

    今天我們主要來了解一下 Python 中的異常類型以及它們的處理方式。說到異常處理,我們首先要知道什么是異常。其實(shí),異常就是一類事件,當(dāng)它們發(fā)生時(shí),會(huì)影響到程序的正常執(zhí)行,具體內(nèi)容跟隨小編一起看看吧
    2021-08-08
  • python+pyqt實(shí)現(xiàn)12306圖片驗(yàn)證效果

    python+pyqt實(shí)現(xiàn)12306圖片驗(yàn)證效果

    這篇文章主要為大家詳細(xì)介紹了python+pyqt實(shí)現(xiàn)12306圖片驗(yàn)證效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-10-10
  • Python實(shí)現(xiàn)單個(gè)或批量文件移動(dòng)的示例代碼

    Python實(shí)現(xiàn)單個(gè)或批量文件移動(dòng)的示例代碼

    日常辦公和數(shù)據(jù)處理中,我們經(jīng)常需要將文件從一個(gè)目錄移動(dòng)到另一個(gè)指定目錄,本文就來介紹一下Python實(shí)現(xiàn)單個(gè)或批量文件移動(dòng),具有一定的參考價(jià)值,感興趣的可以了解一下
    2025-12-12
  • python 基于opencv去除圖片陰影

    python 基于opencv去除圖片陰影

    這篇文章主要介紹了python 基于opencv去除圖片陰影的方法,幫助大家更好的理解和使用python,感興趣的朋友可以了解下
    2021-01-01

最新評(píng)論

湘西| 沂源县| 铁力市| 南涧| 达州市| 乳源| 齐河县| 栖霞市| 双柏县| 巴青县| 景宁| 鄂伦春自治旗| 桐城市| 龙江县| 沂源县| 浦东新区| 连城县| 清河县| 鄂伦春自治旗| 波密县| 安顺市| 沾益县| 昌乐县| 万州区| 老河口市| 讷河市| 焉耆| 炉霍县| 永嘉县| 尼玛县| 凤台县| 太湖县| 蓬安县| 南康市| 莎车县| 田林县| 屏边| 遂平县| 健康| 桦川县| 上高县|