用python写一个自动进程守护,带UI

news2024/12/23 9:25:13

功能是指定程序关闭后自动重启,并点击1作为启动
原来的想法是群成员说的某软件打包后,软件进程被杀后,界面白屏。所以写了个计算器重启demo进行进程守护
在这里插入图片描述

import subprocess
import time
import pyautogui
import psutil
#用计算器做演示。
def is_calculator_running():
    # 查找所有正在运行的计算器进程
    for proc in psutil.process_iter(['pid', 'name']):
        # 检查进程名是否为 'Calculator.exe'
        if proc.info['name'] == 'Calculator.exe':
            return True
    return False

def open_calculator():
    # 启动计算器进程
    process = subprocess.Popen('calc.exe')
    return process

def click_button_1():
    # 等待计算器打开并加载
    time.sleep(2)  # 根据需要调整等待时间

    # 模拟点击"1"按钮,这里直接发送"1"键
    # 注意:确保计算器是当前激活的窗口
    pyautogui.press('1')

def main():
    while True:
        if not is_calculator_running():
            print("Calculator is not running. Starting...")
            process = open_calculator()
            click_button_1()
        time.sleep(1)  # 每秒检查一次

if __name__ == '__main__':
    main()

带UI的

,代码没有优化,能用就行
在这里插入图片描述

#!/usr/bin/env python3
#-*- coding:utf-8 -*-
import sys
import time
import threading
import subprocess

import pyautogui
import psutil

import tkinter as tk

#用计算器做演示。
import sys

from tkinter import *
from tkinter.font import Font
from tkinter.ttk import *
#Usage:showinfo/warning/error,askquestion/okcancel/yesno/retrycancel
from tkinter.messagebox import *
#from tkinter import filedialog  #.askopenfilename()
#from tkinter import simpledialog  #.askstring()

class Application_ui(Frame):
    #这个类仅实现界面生成功能,具体事件处理代码在子类Application中。
    def __init__(self, master=None):
        super().__init__(master)
        # To center the window on the screen.
        ws = self.master.winfo_screenwidth()
        hs = self.master.winfo_screenheight()
        x = (ws / 2) - (333 / 2)
        y = (hs / 2) - (271 / 2)
        self.master.geometry('%dx%d+%d+%d' % (333,271,x,y))
        self.master.title('Form1')
        self.createWidgets()

    def createWidgets(self):
        self.top = self.winfo_toplevel()

        self.style = Style()

        self.Command2Var = StringVar(value='强制停止本程序')
        self.style.configure('TCommand2.TButton', font=('宋体',9))
        self.Command2 = Button(self.top, text='强制停止本程序', textvariable=self.Command2Var, command=self.Command2_Cmd, style='TCommand2.TButton')
        self.Command2.setText = lambda x: self.Command2Var.set(x)
        self.Command2.text = lambda : self.Command2Var.get()
        self.Command2.place(relx=0.505, rely=0.472, relwidth=0.363, relheight=0.151)

        self.Command1Var = StringVar(value='启动监控')
        self.style.configure('TCommand1.TButton', font=('宋体',9))
        self.Command1 = Button(self.top, text='启动监控', textvariable=self.Command1Var, command=self.Command1_Cmd, style='TCommand1.TButton')
        self.Command1.setText = lambda x: self.Command1Var.set(x)
        self.Command1.text = lambda : self.Command1Var.get()
        self.Command1.place(relx=0.12, rely=0.472, relwidth=0.267, relheight=0.151)

        self.Text2Var = StringVar(value='calc.exe')
        self.Text2 = Entry(self.top, textvariable=self.Text2Var, font=('宋体',9))
        self.Text2.setText = lambda x: self.Text2Var.set(x)
        self.Text2.text = lambda : self.Text2Var.get()
        self.Text2.place(relx=0.505, rely=0.295, relwidth=0.459, relheight=0.122)

        self.Text1Var = StringVar(value='Calculator.exe')
        self.Text1 = Entry(self.top, textvariable=self.Text1Var, font=('宋体',9))
        self.Text1.setText = lambda x: self.Text1Var.set(x)
        self.Text1.text = lambda : self.Text1Var.get()
        self.Text1.place(relx=0.505, rely=0.089, relwidth=0.459, relheight=0.151)

        self.Label5Var = StringVar(value='比如D:\D1\\ajide.exe')
        self.style.configure('TLabel5.TLabel', anchor='w', font=('宋体',9))
        self.Label5 = Label(self.top, text='比如D:\D1\\ajide.exe', textvariable=self.Label5Var, style='TLabel5.TLabel')
        self.Label5.setText = lambda x: self.Label5Var.set(x)
        self.Label5.text = lambda : self.Label5Var.get()
        self.Label5.place(relx=0.048, rely=0.915, relwidth=0.7, relheight=0.092)

        self.Label4Var = StringVar(value='名字为Calculator.exe,启动程序是启动路径,')
        self.style.configure('TLabel4.TLabel', anchor='w', font=('宋体',9))
        self.Label4 = Label(self.top, text='名字为Calculator.exe,启动程序是启动路径,', textvariable=self.Label4Var, style='TLabel4.TLabel')
        self.Label4.setText = lambda x: self.Label4Var.set(x)
        self.Label4.text = lambda : self.Label4Var.get()
        self.Label4.place(relx=0.048, rely=0.797, relwidth=0.988, relheight=0.092)

        self.Label3Var = StringVar(value='保护对象是在任务管理器的名字,如计算器,')
        self.style.configure('TLabel3.TLabel', anchor='w', font=('宋体',9))
        self.Label3 = Label(self.top, text='保护对象是在任务管理器的名字,如计算器,', textvariable=self.Label3Var, style='TLabel3.TLabel')
        self.Label3.setText = lambda x: self.Label3Var.set(x)
        self.Label3.text = lambda : self.Label3Var.get()
        self.Label3.place(relx=0.048, rely=0.679, relwidth=0.844, relheight=0.151)

        self.Label2Var = StringVar(value='如监控到关闭启动程序')
        self.style.configure('TLabel2.TLabel', anchor='w', font=('宋体',9))
        self.Label2 = Label(self.top, text='如监控到关闭启动程序', textvariable=self.Label2Var, style='TLabel2.TLabel')
        self.Label2.setText = lambda x: self.Label2Var.set(x)
        self.Label2.text = lambda : self.Label2Var.get()
        self.Label2.place(relx=0.048, rely=0.266, relwidth=0.363, relheight=0.122)

        self.Label1Var = StringVar(value='请输入你要保护的对象')
        self.style.configure('TLabel1.TLabel', anchor='w', font=('宋体',9))
        self.Label1 = Label(self.top, text='请输入你要保护的对象', textvariable=self.Label1Var, style='TLabel1.TLabel')
        self.Label1.setText = lambda x: self.Label1Var.set(x)
        self.Label1.text = lambda : self.Label1Var.get()
        self.Label1.place(relx=0.048, rely=0.118, relwidth=0.411, relheight=0.092)





class Application(Application_ui):
    #这个类实现具体的事件处理回调函数。界面生成代码在Application_ui中。
    def __init__(self, master=None):
        super().__init__(master)

    def Command2_Cmd(self, event=None):
        #TODO, Please finish the function here!
        input_value = self.Text2.text() 
        print(input_value)
        
        time.sleep(100)
        

# 执行一些任务...

# 关闭可执行文件
        sys.exit()



        pass

    def Command1_Cmd(self, event=None):
        #TODO, Please finish the function here!
        text1 = self.Text1.text()
        text2 = self.Text2.text()
        def is_calculator_running():
            # 查找所有正在运行的计算器进程
            for proc in psutil.process_iter(['pid', 'name']):
                # 检查进程名是否为 'Calculator.exe'
                if proc.info['name'] == text1:
                    return True
            return False

        def open_calculator():
            # 启动计算器进程
            process = subprocess.Popen(text2)
            return process

        def click_button_1():
            # 等待计算器打开并加载
            time.sleep(2)  # 根据需要调整等待时间

            # 模拟点击"1"按钮,这里直接发送"1"键
            # 注意:确保计算器是当前激活的窗口
            pyautogui.press('1')

        def main1():
            while True:
                if not is_calculator_running():
                    print("Calculator is not running. Starting...")
                    process = open_calculator()
                    click_button_1()
                time.sleep(1)  # 每秒检查一次
        def long_running_task():
    # 模拟一个耗时的任务
         main1()


    # 创建并启动线程
        thread = threading.Thread(target=long_running_task)
        thread.start()
        
        
        
       

        pass



if __name__ == "__main__":
    top = Tk()
    Application(top).mainloop()

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Linux基础(三)】信号

学习分享 1、信号的基本概念2、查看信号列表3、常见信号名称4、signal库函数5、发送信号kill6、kill - signal (无参信号)示例6.1、kill - signal (不可靠信号)示例6.2、kill - signal (可靠信号)示例 7、信号分类7.1、信号运行原理分类7.2、信号是否携带…

官网正在被哪些产品蚕食,定制网站又被哪些建站产品挤占。

2023-12-09 16:22贝格前端工场 官网建设是一个被大多数人看衰的市场,本文来理性分析下,谁在蚕食这个市场,谁又在挤占这个产品生存空间,欢迎大家评论,探讨。 网站正在被以下产品形式取代: 1. 移动应用&…

深入理解并发编程:解锁现代软件性能的关键

在当今快速发展的软件开发世界中,并发编程已经成为一种无法回避的重要议题。它涉及到如何在同一时间内处理多个任务,以此来提升应用程序的性能和响应速度。互联网服务的高并发需求以及多核处理器的普及使得并发编程成为了现代软件工程的一个核心组成部分…

09---蜂鸣器电路设计

视频链接 蜂鸣器硬件电路设计01_哔哩哔哩_bilibili 蜂鸣器电路设计 1、蜂鸣器的定义 蜂鸣器是一种一体化结构的电子讯响器,采用直流电压供电,广泛应用于计算机、打印机、复印机、报警器、电子玩具、汽车电子设备、电话机、定时器等电子产品中作发声器…

异常-Exception

文章目录 异常-Exception常见的运行时异常NullPointerException(空指针异常)ArithmeticException(数学运算异常)ArrayIndexOutOfBoundsException(数组下标越界异常)ClassCastException(类型转换…

CSS补充(下),弹性布局(上)

高级选择器 1.兄弟选择器 2.同时满足 div.bg{background-color: red;}p.bg{background-color: green;}spam.bg{background-color: blue;}注:选择器中间没有空格,有明确标识的选择器写在后面 3.各种伪类的应用 3.1作为第几个子元素 选择器:nth-child…

Windows的自动更新和自带的杀毒软件怎么弄掉!

关闭Windows系统更新 Windows系统更新是为了保持设备的平稳和安全运行,保持操作系统安全、稳定及获取新功能修复已知问题并修补安全漏洞的重要过程。如果您想要临时或永久关闭Windows系统的自动更新,可以采用以下几种方式。不过,请务必意识到,禁用系统更新可能会导致您的系…

Java多线程——如何保证原子性

目录 引出原子性保障原子性CAS 创建线程有几种方式?方式1:继承Thread创建线程方式2:通过Runnable方式3:通过Callable创建线程方式4:通过线程池概述ThreadPoolExecutor API代码实现源码分析工作原理:线程池的…

【C++ STL详解】——string类

目录 前言 一、string类对象的常见构造 二、string类对象的访问及遍历 1.下标【】(底层operator【】函数) ​编辑 2.迭代器 3.范围for 4.at 5.back和front 三、string类对象的容量操作 1.size 和 length 2.capacity 3.empty 4.clear 5.res…

Xilinx 7系列 FPGA硬件知识系列(九)——FPGA的配置

1.3 端口配置 每组配置模式都有一组特定的接口管脚,它们跨越7系列FPGA上的一个或多个I/O BANK。7系列器件支持3.3V、2.5V、1.8V或1.5V的I/O配置,包括: BANK 0 中的JTAG管脚、BANK0中的专用配置管脚 BANK14和BANK15中与特定配置模式相关的管…

2024 批量下载公众号文章内容/阅读数/在看数/点赞数/留言数/粉丝数导出pdf文章备份(带留言):公众号半佛仙人近1500篇历史文章在线查看,找文章方便了

关于公众号文章批量下载,我之前写过很多文章: 视频更新版:批量下载公众号文章内容/话题/图片/封面/音频/视频,导出html,pdf,excel包含阅读数/点赞数/留言数 2021陶博士2006/caoz的梦呓/刘备我祖/六神读金…

包含字母数字及特殊字符 三种组合的正则两种写法

//长度8~16位;包含字母、数字及特殊字符 #$%^&*_-//正则1 写法:let reg_1 /^(?![A-Za-z0-9]$)^(?![A-Za-z#$\%^&*_\-]$)^(?![0-9#$\%^&_*\-]$)([A-Za-z0-9#$\%^&*_\-]{8,16})$///正则2 写法:let reg_2 /^(?![A-Za-z#$%…

在别的地方下载的二次封装Windows镜像怎么安装?GHO镜像详细安装教程

前言 在系统之家或者其他地方下载的镜像文件怎么装到电脑上? 首先要知道系统之家下载的Windows镜像文件基本上都是.iso结尾的,要进入到对应镜像包才能看出系统镜像是什么格式。 如何分辨镜像的格式 选择对应的.iso镜像,点击【鼠标右键】-【装…

力扣大厂热门面试算法题 9-11

9. 回文数,10. 正则表达式匹配,11. 盛最多水的容器,每题做详细思路梳理,配套Python&Java双语代码, 2024.03.08 可通过leetcode所有测试用例。 目录 9. 回文数 解题思路 完整代码 Java Python 10. 正则表达式…

3dmax渲染出来是黑色的怎么办?

灯光问题:渲染场景中的灯光可能全部关闭,包括默认灯光,或者手动添加的灯光没有开启全局光照(GI)。解决方法是检查并开启场景中的灯光,确保全局光照已开启。 摄像机问题:摄像机可能被黑色对象挡…

golang 注释插件

Goanno插件 自动生成golang注释,该插件为 Intellij/Goland 中的 golang 提供自动生成注释 如何使用? control command / (for windows: control alt /)(生成注释)Right click -> Generate -> Goanno(生成注释&#x…

系统架构设计师 2023年 案例分析

一、大数据架构 Lambda架构和Kappa架构 某网作为某电视台在互联网上的大型门户入口,某一年成为某奥运会中国大陆地区的特权转播商,独家全程直播了某奥运会全部的赛事,积累了庞大稳定的用户群,这些用户在使用各类服务过程中产生了大量数据,对这些海量数据进行分析与挖掘,将…

重学SpringBoot3-WebMvcAutoConfiguration类

重学SpringBoot3-WebMvcAutoConfiguration类 是什么什么用生效条件作用 自定义配置的三种方式自定义配置举例1. 自定义 DispatcherServlet 配置2. 静态资源配置3. 自定义MVC配置4. 消息转换器5. 异常处理 是什么 org.springframework.boot.autoconfigure.web.servlet.WebMvcAut…

Linux mmap系统调用

文章目录 前言一、mmap()函数简介二、代码演示2.1 mmap使用场景2.2 私有匿名映射2.3 私有文件映射2.4 共享匿名映射2.5 共享文件映射 参考 前言 NAMEmmap, munmap - map or unmap files or devices into memorySYNOPSIS#include <sys/mman.h>void *mmap(void *addr, siz…

AcWing 505. 火柴排队(每日一题)

目录 题目链接&#xff1a;505. 火柴排队 - AcWing题库 解题思路&#xff1a; 离散化&#xff1a; 归并排序求逆序对&#xff1a; 总代码&#xff1a; 题目链接&#xff1a;505. 火柴排队 - AcWing题库 涵涵有两盒火柴&#xff0c;每盒装有 n 根火柴&#xff0c;每根火柴…