0

我正在构建我的第一个 tkinter 应用程序,它运行良好,直到我尝试在启动时自动启动它。我已经研究了这个主题并尝试了很多东西,但没有一个能正常工作。

我正在使用 raspbian buster、python 3.7.3 运行 RPi4,并希望此应用程序在 RPI 触摸屏上运行而无需用户登录。

我发现这个链接看起来我应该能够从终端启动我的应用程序,而无需通过调用 X openbox 之类的窗口管理器或类似的东西来加载桌面。我确实发现,如果我创建一个 ~/.xinitrc 文件并添加以下行,我可以通过键入 startx 从命令提示符启动窗口。

exec sudo /usr/bin/python3 /home/$user_name/robot/robot.py

我曾尝试使用 systemd 启动程序,但无济于事。当然会感谢一些帮助。

4

1 回答 1

0

好吧,在办公桌上敲了一周的头之后,我终于找到了一个完美的解决方案。这会在禁用树莓派 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 和单元文件详细信息的一个很好的参考。

于 2020-10-23T06:32:50.683 回答