使用 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 时,环境变量有限。没有定义现有的 XAUTHORITYDISPLAY 能够连接到您需要的显示器。因此,您需要定义程序所需的每个环境变量

所以你定义DISPLAY=:0选择默认显示器,你需要设置XAUTHORITY=/home/&lt;user&gt;/.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 &gt;&gt; home/pi/Desktop/cron.log(一行)

使用 cron 作为用户 pi(而不是 root),有必要将 cron.log 文件放在某个 /home/pi/... 文件夹中,以便为日志文件提供写入权限。

在启动应用程序之前,Raspbian 可能需要一些时间来设置所有内容;我用过:

@reboot sleep 10 &amp;&amp; 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的主要内容,如果未能解决你的问题,请参考以下文章

多处理:带 GUI 的父/子(tkinter)

python GUI编程(Tkinter)

使用 Tkinter 制作文件选择器 GUI 以显示输入和输出文件

使用Python3.6的标准GUI库tkinter快速创建GUI应用程序

Python GUI编程(Tkinter)

Python GUI编程(tkinter)