当前位置:   article > 正文

给PyQt5 exe程序设置自启动(Windows)_pyqt5 自启动

pyqt5 自启动

给PyQt5 exe程序或者其他Python文件设置开机自启动(Windows)

1.前言

设置开机自启动其实是开机时用默认软件打开设置自启动的文件,如果是exe文件就相当于打开软件而已

2.安装 pywin32 库

由于是通过注册表的方式设置开机自启动,所以要用到 pywin32库,通过

pip list查询一下,

image-20200802152248708

如果没有安装就通过

pip install pywin32 -i https://pypi.tuna.tsinghua.edu.cn/simple

安装一下。


3.设置自启动

Autorun.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# author:mgboy time:2020/8/2

import win32api
import win32con, winreg, os, sys

"""判断键是否存在"""


def Judge_Key(key_name=None,
              reg_root=win32con.HKEY_CURRENT_USER,  # 根节点
              reg_path=r"SOFTWARE\Microsoft\Windows\CurrentVersion\Run",  # 键的路径
              abspath=None
              ):
    """
	:param key_name: #  要查询的键名
	:param reg_root: # 根节点
		#win32con.HKEY_CURRENT_USER
		#win32con.HKEY_CLASSES_ROOT
		#win32con.HKEY_CURRENT_USER
		#win32con.HKEY_LOCAL_MACHINE
		#win32con.HKEY_USERS
		#win32con.HKEY_CURRENT_CONFIG
	:param reg_path: #  键的路径
	:return:feedback是(0/1/2/3:存在/不存在/权限不足/报错)
	"""
    reg_flags = win32con.WRITE_OWNER | win32con.KEY_WOW64_64KEY | win32con.KEY_ALL_ACCESS
    try:
        key = winreg.OpenKey(reg_root, reg_path, 0, reg_flags)
        location, type = winreg.QueryValueEx(key, key_name)
        print("键存在", "location(数据):", location, "type:", type)
        feedback = 0
        if location != abspath:
            feedback = 1
            print('键存在,但程序位置发生改变')
    except FileNotFoundError as e:
        print("键不存在", e)
        feedback = 1
    except PermissionError as e:
        print("权限不足", e)
        feedback = 2
    except:
        print("Error")
        feedback = 3
    return feedback


"""开机自启动"""


def AutoRun(switch="open",  # 开:open # 关:close
            key_name=None,
            abspath=os.path.abspath(sys.argv[0])):
    # 如果没有自定义路径,就用os.path.abspath(sys.argv[0])获取主程序的路径,如果主程序已经打包成exe格式,就相当于获取exe文件的路径
    judge_key = Judge_Key(reg_root=win32con.HKEY_CURRENT_USER,
                          reg_path=r"Software\Microsoft\Windows\CurrentVersion\Run",  # 键的路径
                          key_name=key_name,
                          abspath=abspath)
    # 注册表项名
    KeyName = r'Software\Microsoft\Windows\CurrentVersion\Run'
    key = win32api.RegOpenKey(win32con.HKEY_CURRENT_USER, KeyName, 0, win32con.KEY_ALL_ACCESS)
    if switch == "open":
        # 异常处理
        try:
            if judge_key == 0:
                print("已经开启了,无需再开启")
            elif judge_key == 1:
                win32api.RegSetValueEx(key, key_name, 0, win32con.REG_SZ, abspath)
                win32api.RegCloseKey(key)
                print('开机自启动添加成功!')
        except:
            print('添加失败')
    elif switch == "close":
        try:
            if judge_key == 0:
                win32api.RegDeleteValue(key, key_name)  # 删除值
                win32api.RegCloseKey(key)
                print('成功删除键!')
            elif judge_key == 1:
                print("键不存在")
            elif judge_key == 2:
                print("权限不足")
            else:
                print("出现错误")
        except:
            print('删除失败')

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88

测试

主程序:TestRun.py


# 引入自启动 py 文件
from Autorun import AutoRun


def check(state=1):
    """开机自启动函数"""
    if state == 1:
        AutoRun(switch='open', key_name='wallzoom')  # 键的名称应该起得特别一些,起码和已经存在的自启动软件名称不一致

    else:
        AutoRun(switch='close', key_name='wallzoom')

if __name__ == "__main__":
    check(state=1)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

state=1开启自启动

image-20200802160518737

查看注册表,可以看到有wallzoom键值了

image-20200802160816949

state=0关闭自启动:

image-20200802160844134

4.PyQt5 应用说明

虽然我测试时没有涉及 PyQt5 程序,但道理是一致的,只有把Autorun.py文件放在主程序文件同目录下,再引用它,把开机自启动绑定一个checkBox按钮或其他信号槽函数就可以很好实现了 PyQt5 程序自启动了。

注意:如果没有打包成 exe 文件,在开机时只会用默认软件打开 py 文件而已

测试时没有涉及 PyQt5 程序,但道理是一致的,只有把Autorun.py文件放在主程序文件同目录下,再引用它,把开机自启动绑定一个checkBox按钮或其他信号槽函数就可以很好实现了 PyQt5 程序自启动了。

注意:如果没有打包成 exe 文件,在开机时只会用默认软件打开 py 文件而已
.
.

.
.

本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/71312
推荐阅读
相关标签
  

闽ICP备14008679号