PyQt:在Windows中实现程序“开机自启”的最佳方法

6 投票
2 回答
3343 浏览
提问于 2025-04-16 18:40

我正在用PyQt开发一个应用程序,这个程序在Windows系统中,如果在设置里选择了相关选项,就应该能在开机时自动启动。

我用PyInstaller把这个软件打包成一个单独的可执行文件;我没有一个正规的“安装程序”。

那么,怎么才能实现这个功能呢?(也就是开机自动启动)

一个可能的解决办法是把一个快捷方式放到启动文件夹里,但我需要从软件内部来完成这个操作:这样做可以吗?还有其他方法吗?

有没有一个通用的路径可以找到启动文件夹?我会遇到权限问题吗?

2 个回答

4

你可以在注册表的这个位置:[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run],添加一个注册表项,给它起个名字,值设置为“你的程序路径”。这样做需要你有本地管理员权限,但这样设置后,所有用户都能使用这个程序。
如果你在[HKEY_CURRENT_USER]下添加同样的项,就不需要管理员权限了,但这样设置只对当前用户有效。这个注册表路径在Windows 2000到Windows 7的版本中都是一样的。

9

试试这个代码(我用py2exe的时候是可以工作的):

import sys
from PyQt4.QtCore import QSettings
from PyQt4.QtGui import (QApplication, QWidget, QCheckBox, QPushButton,
                         QVBoxLayout)

RUN_PATH = "HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Run"

class MainWidget(QWidget):

    def __init__(self,parent=None):
        super(MainWidget, self).__init__(parent)
        self.settings = QSettings(RUN_PATH, QSettings.NativeFormat)
        self.setupUi()       
        # Check if value exists in registry
        self.checkbox.setChecked(self.settings.contains("MainWidget"))

    def setupUi(self):
        self.checkbox = QCheckBox("Boot at Startup", self)
        button = QPushButton("Close", self)
        button.clicked.connect(self.close)
        layout = QVBoxLayout(self)
        layout.addWidget(self.checkbox)
        layout.addWidget(button)

    def closeEvent(self, event):
        if self.checkbox.isChecked():
            self.settings.setValue("MainWidget",sys.argv[0]);
        else:
            self.settings.remove("MainWidget");
        event.accept()

if __name__ == '__main__':
    app = QApplication(sys.argv)
    w = MainWidget()
    w.show()
    app.exec_()

撰写回答