使用crontab运行tkinter GUI

时间:2018-06-11 15:21:37

标签: python tkinter cron raspberry-pi

我有一个简单的GUI(使用tkinter创建),我希望在Raspberry pi 3上的特定时间运行.Bellow是我在crontab中使用的代码片段。我使用sudo crontab -e调用了crontab管理器。

0 18 * * * cd /home/pi/gui && python3 gui.py

目前,我可以通过Pi的命令行直接调用GUI来执行GUI。但是,当我尝试使用cron执行此操作时,它不起作用。我也试图切换到一个基本的python脚本(写入文件),这是有效的。是否需要注意特定的奇怪交互?

我的设置:raspberry pi 3,python 3,raspi-screen,tkinter(据我所知最新版本)

2 个答案:

答案 0 :(得分:4)

sudo将在没有tty的情况下运行并显示,这就是你命令不起作用的原因。

尝试安装xvfb并使用

0 18 * * * cd /home/pi/gui && xvfb-run python3 gui.py

更新-1:18-Jun-18

如果您想使用实际显示器,则需要确保使用以下命令

XAUTHORITY=/home/<user>/.Xauthority DISPLAY=:0 python3 gui.py

并确保cron适合您的用户。默认DISPLAY:0

当您拥有XServer(GUI显示)时,您无法在未经授权的情况下连接到它。系统启动时,它会创建一个文件,该位置存储在环境变量XAUTHORITY中。

运行cron时,环境变量有限。没有定义XAUTHORITYDISPLAY 能够连接到您需要的显示器。因此,您需要定义程序所需的每个环境变量

因此,您定义DISPLAY=:0以选择默认显示,并且您需要设置XAUTHORITY=/home/<user>/.Xauthority以证明您有权连接到显示器

答案 1 :(得分:0)

Raspbian 10(破坏者):在我看来,唯一缺少的部分是使用gtk通知cron-job,该显示必须使用gtk,方法是插入 DISPLAY=:0。我使用bash脚本使用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分钟启动一次。