问题描述
我正在构建我的第一个tkinter应用程序,该应用程序可以完美运行,直到尝试在启动时自动启动它为止。我已经研究了这个主题,并尝试了很多事情,但是没有任何正常工作。
我正在用树莓派克星python 3.7.3运行RPi4,并希望该应用程序在RPI触摸屏上运行而无需用户登录。
我发现this link似乎可以通过调用X openbox之类的窗口管理器或类似的工具从终端启动我的应用程序而无需加载桌面。我确实发现,如果我创建〜/ .xinitrc文件并添加以下行,则可以通过键入startx从命令提示符启动窗口。
exec sudo /usr/bin/python3 /home/$user_name/robot/robot.py
我尝试使用systemd启动程序,但无济于事。肯定会对此有所帮助。
解决方法
好吧,经过一个星期在桌子上殴打我的头,我终于找到了一个完美的解决方案。这将在禁用树莓派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 Display Port,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分享了THIS LINK,这帮助了很多人。 THIS是有关systemd和单位文件详细信息的很好参考。