好吧,在办公桌上敲了一周的头之后,我终于找到了一个完美的解决方案。这会在禁用树莓派 GUI 的命令提示符登录之前加载 GUI 应用程序,并且当应用程序因任何原因关闭时,它会返回到注销的命令提示符。
我想澄清一下,我已禁用默认 pi 用户并为此项目创建了另一个用户帐户。我已将整个 python/tkinter 项目放在“/home/$user_name/robot”文件夹中,并为这个新用户提供了与 pi 用户相同的权限。
仅启用引导到命令行
sudo raspi-config
Select => Boot Options / Desktop-CLI / Console
设置系统 initrc 以加载应用程序
sudo nano /etc/X11/xinit/xinitrc
注释掉现有行并添加以下内容(更改脚本的路径)
/usr/bin/python3 /home/$user_name/robot/robot.py
创建一个 systemd 单元文件来启动 X 窗口并运行应用程序
#Change the name.service to whatever you want it to be
sudo nano /lib/systemd/system/robot.service
在新文件中添加以下行(:0.0 是 RPi 显示端口,Xauthority 指向您希望在其下运行应用程序的用户配置文件)
[Unit]
Description=Start Robot
After=graphical.target
[Service]
Environment=DISPLAY=:0.0
Environment=XAUTHORITY=/home/$user_name/.Xauthority
ExecStart=startx
KillMode=process
TimeoutSec=infinity
[Install]
WantedBy=graphical.target
重新加载单元文件并启用新单元
sudo systemctl daemon-reload
sudo systemctl enable robot.service
可以通过以下命令查看新服务的状态
sudo systemctl status robot.service
现在重新启动系统,在显示命令提示符之前应该会显示带有 tkinter gui 的 python 应用程序。如果应用程序因任何原因退出,应显示命令提示登录。
感谢@acw1668 分享这个链接,它帮助了很多。这是 systemd 和单元文件详细信息的一个很好的参考。