电脑定时关机应用

这是一个Python应用。家里卧室装了新电视,HDMI连接笔记本追剧还是很愉快的。可是经常睡着,自然忘了关机。搜了一大圈,都是用命令行或者bat解决。商店里的应用也不好用,有些还收费。于是萌生了自己写一个定时关机应用的想法。利用Notebook实现“默认模式”和“自定义模式”选项卡,如图所示。最后一张图是素材。

import datetime
import tkinter as tk
from tkinter import ttk
from threading import Thread
import time
import os


class ShutdownApp:
    def __init__(self, root):
        self.time_left = None
        self.root = root
        self.root.title("定时关机应用")
        self.root.resizable(0, 0)
        screenwidth = self.root.winfo_screenwidth()
        screenheight = self.root.winfo_screenheight()
        width = 600
        height = 200
        size_geo = '%dx%d+%d+%d' % (width, height, (screenwidth - width) / 2, (screenheight - height) / 2)
        self.root.geometry(size_geo)
        self.root.iconphoto(False, tk.PhotoImage(file='C:/Users/wokao/Desktop/icon.png'))
        self.root["background"] = "#8DB6CD"

        self.notebook = tk.ttk.Notebook(self.root)
        self.framework1 = tk.Frame()
        self.framework2 = tk.Frame()
        self.notebook.add(self.framework1, text='默认模式')
        self.notebook.add(self.framework2, text='自定义模式')
        self.notebook.pack(padx=10, pady=5, fill=tk.BOTH, expand=True)

        # 选项卡1的界面
        tk.Label(self.framework1, text="选择关机时长:").pack()
        cbox = ttk.Combobox(self.framework1)
        cbox['value'] = ('0.5小时', '1小时', '1.5小时', '2小时')
        cbox.current(1)
        self.selected_value = cbox.get()
        cbox.pack()
        self.start_button = tk.Button(self.framework1, text="开始", command=self.start_timer)
        self.start_button.pack()
        self.cancel_button = tk.Button(self.framework1, text="取消关机", state='disabled', command=self.cancel_timer)
        self.cancel_button.pack()
        self.timer_label = tk.Label(self.framework1, text="", bg="#8DB6CD")
        self.timer_label.pack()

        # 选项卡2的界面
        tk.Label(self.framework2, text="输入关机时长(秒):").pack()
        self.time_entry2 = tk.Entry(self.framework2)
        self.time_left2 = self.time_entry2.get()
        self.time_entry2.pack()
        self.start_button2 = tk.Button(self.framework2, text="开始", command=self.start_timer2)
        self.start_button2.pack()
        self.cancel_button2 = tk.Button(self.framework2, text="取消关机", state='disabled', command=self.cancel_timer2)
        self.cancel_button2.pack()
        self.timer_label2 = tk.Label(self.framework2, text="", bg="#8DB6CD")
        self.timer_label2.pack()

        self.timer_thread = None
        self.running = False

    # 选项卡1的功能实现
    def selected_time(self, selected_value):
        match selected_value:
            case '0.5小时':
                self.time_left = 1800
            case '1小时':
                self.time_left = 3600
            case '1.5小时':
                self.time_left = 5400
            case '2小时':
                self.time_left = 7200

    def start_timer(self):
        try:
            self.selected_time(self.selected_value)
        except ValueError:
            self.timer_label.config(text="请选择关机倒计时时长!")
            return

        self.notebook.tab(1, state='disabled')
        self.running = True
        self.start_button.config(state='disabled')
        self.cancel_button.config(state='normal')
        self.timer_thread = Thread(target=self.run_timer)
        self.timer_thread.start()

    def run_timer(self):
        while self.time_left > 0 and self.running:
            timer = str(datetime.timedelta(seconds=int(self.time_left)))
            self.timer_label.config(text=f"关机倒计时: {timer} ", font=("黑体", 45), fg="white", bg="#8DB6CD")
            time.sleep(1)
            self.time_left -= 1

        self.timer_label.config(text="")
        if self.running:
            os.system("shutdown /s /t 1")  # 在Windows上执行关机命令

    def cancel_timer(self):
        self.running = False
        self.start_button.config(state='normal')
        self.cancel_button.config(state='disabled')
        self.timer_label.config(text="已取消关机")
        self.notebook.tab(1, state='normal')

    # 选项卡2的功能实现
    def start_timer2(self):
        try:
            self.time_left2 = int(self.time_entry2.get())
        except ValueError:
            self.timer_label2.config(text="请输入有效的数字!")
            return

        self.notebook.tab(0, state='disabled')
        self.running = True
        self.start_button2.config(state='disabled')
        self.cancel_button2.config(state='normal')
        self.timer_thread = Thread(target=self.run_timer2)
        self.timer_thread.start()

    def run_timer2(self):
        while self.time_left2 > 0 and self.running:
            self.timer_label2.config(text=f"关机倒计时: {self.time_left2} 秒", font=("黑体", 45),fg="white", bg="#8DB6CD")
            time.sleep(1)
            self.time_left2 -= 1

        self.timer_label2.config(text="")
        if self.running:
            os.system("shutdown /s /t 1")  # 在Windows上执行关机命令

    def cancel_timer2(self):
        self.running = False
        self.start_button2.config(state='normal')
        self.cancel_button2.config(state='disabled')
        self.timer_label2.config(text="已取消关机")
        self.notebook.tab(0, state='normal')


if __name__ == "__main__":
    ui = tk.Tk()
    app = ShutdownApp(ui)
    ui.mainloop()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/319993.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux学习之网络编程3(高并发服务器)

写在前面 Linux网络编程我是看视频学的,Linux网络编程,看完这个视频大概网络编程的基础差不多就掌握了。这个系列是我看这个Linux网络编程视频写的笔记总结。 高并发服务器 问题: 根据上一个笔记,我们可以写出一个简单的服务端…

研0或研一|如何快速入门深度学习?

一、经验建议 1️⃣课程篇 直接上手B站【小土堆PyTorch深度学习快速入门教程】,共计9h50min左右,预计一周就可以学完,比较偏向理论和实践相结合跟李沐学AI B站【动手学深度学习 PyTorch版】刘二大人B站【PyTorch深度学习实践】,…

springboot集成jsp

首先pom中引入依赖包 <!--引入servlet--> <dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId> </dependency> <!--引入jstl标签库--> <dependency><groupId>javax.servle…

echarts 3D地图

vueecharts 3D地图,可自定义地图背景底图。鼠标放上显示弹窗&#xff0c;弹窗自动切换。 <template><div id"gbznt" class"gbznt" ref"gbznt"><img class"mapBg" src"../../../img/propertyTransaction/echart-bg…

二进制与十六进制,二进制与八进制之间的相互转换技巧

目录 1.二进制转换为八进制 2.八进制转换为二进制 3.二进制转换为十六进制 4.十六进制转换为二进制 1.二进制转换为八进制 转换为8进制 第一步&#xff1a;以小数点为分界线&#xff0c;整数部分自右向左&#xff0c;小数部分自左向右每3位取成1位&#xff1a; 整数部分…

码蹄集新手村:绝对值,输入各种类型数,平面、空间三角形面积(坐标)

1.绝对值 虽然用if else判断是否小于0&#xff0c;小于0取相反数也能解决&#xff0c;但可能会出现错误&#xff0c;尽量用fabs()函数 2. 输入各种类型数所需的常见英文字母 字符 %c double %lf float %f 3.平面三角形面积&#xff08;坐标&#xff09; 记住三角形面积公…

人物故事:从留美复旦流浪博士,分享一位杰出C++开发者的故事

近日留美复旦流浪博士的事迹冲上热搜。通过多方渠道消息来源&#xff0c;据说该流浪博士在1985年&#xff0c;15岁还在读高一的他&#xff0c;就已经被复旦大学少年班物理学专业录取。在复旦大学就读期间曾获得李政道奖学金。1988年&#xff0c;19岁时从复旦大学通过第九届CUSP…

【并发】共享模型之管程

共享模型之管程 共享问题 package 并发;public class Test1 {static int a0;public static void main(String[] args) throws InterruptedException {Thread t1new Thread(new Runnable() {Overridepublic void run() {for(int i0;i<5000;i){a;}}});Thread t2new Thread(n…

第 4 章 链表

文章目录 4.1 链表(Linked List)介绍4.2 单链表的应用实例4.3 单链表面试题(新浪、百度、腾讯)4.4 双向链表应用实例4.4.1 双向链表的操作分析和实现4.4.2 课堂作业和思路提示 4.5 单向环形链表应用场景4.6 单向环形链表介绍4.7 Josephu 问题4.8 Josephu 问题的代码实现 4.1 链…

Docker五部曲之四:Docker Compose

文章目录 前言Compose应用程序模型Compose规范顶层属性servicenetworkvolumesconfigssecrets 环境变量.env文件environment属性主机shell中的环境变量 Profiles&#xff08;剖面&#xff09;启动剖面自动启动剖面和依赖项解析 多compose.yml文件共享与扩展构建规范构建属性 部署…

单例模式的八种写法、单例和并发的关系

文章目录 1.单例模式的作用2.单例模式的适用场景3.饿汉式静态常量&#xff08;可用&#xff09;静态代码块&#xff08;可用&#xff09; 4.懒汉式线程不安全&#xff08;不可用&#xff09;同步方法&#xff08;线程安全&#xff0c;但不推荐用&#xff09;同步代码块&#xf…

【我想开发一个小程序,大概需要多少钱?】

小程序开发为什么报价差距很大&#xff1f;主要是因为小程序的实现方法和功能模型不同。 小程序的实现方法&#xff1a; 实现方法主要分为SAAS小程序、定制小程序和第三方平台小程序。不同的实现方法价格都是不一样的&#xff0c;大概的区间如下&#xff1a; SAAS小程序和第三…

Github 2024-01-14 Go开源项目日报 Top10

根据Github Trendings的统计&#xff0c;今日(2024-01-14统计)共有10个项目上榜。根据开发语言中项目的数量&#xff0c;汇总情况如下&#xff1a; 开发语言项目数量Go项目10TypeScript项目1 frp: 一个开源的快速反向代理 创建周期&#xff1a;2946 天开发语言&#xff1a;G…

第 2 章 数据结构和算法概述

文章目录 2.1 数据结构和算法的关系2.2 看几个实际编程中遇到的问题2.2.1 问题一-字符串替换问题2.2.2 一个五子棋程序2.2.3 约瑟夫(Josephu)问题(丢手帕问题)2.2.4 其它常见算法问题: 2.3 线性结构和非线性结构2.3.1 线性结构2.3.2 非线性结构 2.1 数据结构和算法的关系 数据 …

扫雷游戏棋盘的打印,判断输赢,深度分析

少年们&#xff0c;大家好&#xff0c;我是博主那一脸阳光&#xff0c;我来分享扫雷的打印和判断输赢&#xff0c;代码如何编写&#xff0c;如何使用&#xff0c;深度理解扫雷的游戏。 数据结构的分析和理论 我上次介绍棋盘的初始化&#xff0c;但是如果不打印出来&#xff0…

AI 大模型面试指南(含答案)大放送!

▼最近直播超级多&#xff0c;预约保你有收获 今晚直播&#xff1a;《大模型构建企业知识库实践》 AI 大模型技术经过2023年的狂飙&#xff0c;2024年必将迎来应用的落地&#xff0c;对 IT 同学来讲&#xff0c;这里蕴含着大量的技术机会&#xff0c;越来越多的企业开始招聘 AI…

2624. 蜗牛排序

说在前面 &#x1f388;不知道大家对于算法的学习是一个怎样的心态呢&#xff1f;为了面试还是因为兴趣&#xff1f;不管是出于什么原因&#xff0c;算法学习需要持续保持。 题目描述 请你编写一段代码为所有数组实现 snail(rowsCount&#xff0c;colsCount) 方法&#xff0c;…

数据库备份脚本嘎嘎香,被秀到了!

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 哈喽&#xff01;大家好&#xff0c;我是【IT邦德】&#xff0c;江湖人称jeames007&#xff0c;10余年DBA及大数据工作经验 一位上进心十足的【大数据领域博主】&#xff01;&#x1f61c;&am…

mybatisplus(service CRUD 接口)

一、我们在控制器层都是调用Service层&#xff0c;不会直接调用仓储层。现在我给大家介绍一下怎么快速实现Service 的CRUD 定义接口&#xff1a;IProductService 继承IService<实体> package com.saas.plusdemo;import com.baomidou.mybatisplus.extension.service.ISe…

Sentinel限流、熔断

1、限流 单个服务节点限流 sentinel 提供了两种不同的隔离机制&#xff1a;信号量隔离和线程池隔离&#xff0c;它们的主要区别如下&#xff1a; 信号量隔离&#xff08;Semaphore Isolation&#xff09;&#xff1a; 原理&#xff1a;信号量隔离基于计数器&#xff08;或称令…
最新文章