使用 crontab 运行 tkinter GUI
Posted
技术标签:
【中文标题】使用 crontab 运行 tkinter GUI【英文标题】:Running a tkinter GUI using crontab 【发布时间】:2022-01-15 21:12:13 【问题描述】:我有一个简单的 GUI(使用 tkinter 创建),我想在一天中的特定时间在 Raspberry pi 3 上运行。下面是我在 crontab 中使用的代码 sn-p。我使用 sudo crontab -e 调用了 crontab 管理器。
0 18 * * * cd /home/pi/gui && python3 gui.py
目前,我可以通过 Pi 的命令行直接调用它来执行 GUI。但是,当我尝试使用 cron 执行此操作时,它不起作用。我还尝试切换到一个基本的 python 脚本(写入文件)并且有效。是否有我需要注意的特定奇怪交互?
我的设置:raspberry pi 3、python 3、raspi-screen、tkinter(据我所知是最新版本)
【问题讨论】:
【参考方案1】:sudo 将在没有 tty 的情况下运行并显示这就是您的命令不起作用的原因。
尝试安装并使用 xvfb
0 18 * * * cd /home/pi/gui && xvfb-run python3 gui.py
更新 1:22-Jun-18
如果你想使用你的实际显示,那么你需要确保你使用下面的命令
XAUTHORITY=/home/<user>/.Xauthority DISPLAY=:0 python3 gui.py
还要确保 cron 适合您的用户。默认DISPLAY
是:0
。
当您拥有 XServer(GUI 显示)时,您不能在没有授权的情况下直接连接到它。当系统启动时,它会创建一个文件,并且该位置存储在环境变量 XAUTHORITY 中。
运行 cron 时,环境变量有限。没有定义现有的 XAUTHORITY
或 DISPLAY
能够连接到您需要的显示器。因此,您需要定义程序所需的每个环境变量
所以你定义DISPLAY=:0
选择默认显示器,你需要设置XAUTHORITY=/home/<user>/.Xauthority
来证明你有权限连接显示器
【讨论】:
让我们continue this discussion in chat。 这对我添加了 python 的路径很有用:/usr/bin/pýthon3 /path_to_file/my_file.py 也许会帮助某人获得这个信息【参考方案2】:Raspbian 10 (buster):唯一缺少的部分 - 在我的例子中 - 是使用 gtk 通知 cron-job,它必须使用它的显示,通过插入
DISPLAY=:0
。我使用 bash-script 使用 tk 启动 python 脚本;这也可以是一个 python 脚本。
@reboot DISPLAY=:0 /home/pi/path/to/my/script.sh start
对调试有用:
@reboot DISPLAY=:0 /home/pi/path/to/my/script.sh start >> home/pi/Desktop/cron.log
(一行)
使用 cron 作为用户 pi(而不是 root),有必要将 cron.log
文件放在某个 /home/pi/...
文件夹中,以便为日志文件提供写入权限。
在启动应用程序之前,Raspbian 可能需要一些时间来设置所有内容;我用过:
@reboot sleep 10 && DISPLAY=:0 /home/pi/path/to/my/script.sh start
可以使用通常的 cron 设置代替 @reboot,例如:
*/5 * * * *
(其余行见上文)
每 5 分钟开始一次。
【讨论】:
嗨!使用您的方法执行此操作时仍然出现错误:_tkinter.TclError: could't connect to display ":0" 通常我在“无头”环境中工作;即 RPi3 通过以太网电缆连接到 LAN,在 raspisetup 和远程桌面中启用了 VNC,例如使用VNC 或其他客户端在 PC 屏幕上显示 RPi 的屏幕。也许您的图形显示器连接到其他一些例如:1 或:2。有人知道找出活动的显示编号或名称吗?以上是关于使用 crontab 运行 tkinter GUI的主要内容,如果未能解决你的问题,请参考以下文章
使用 Tkinter 制作文件选择器 GUI 以显示输入和输出文件