Запуск графического интерфейса tkinter с использованием crontab

У меня есть простой графический интерфейс (созданный с помощью tkinter), который я хочу запускать в определенное время дня на Raspberry pi 3. Bellow - это фрагмент кода, который я использовал в crontab. Я вызвал менеджер crontab с помощью sudo crontab -e.

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

На данный момент я могу запустить графический интерфейс, вызвав его напрямую через командную строку Pi. Однако это не работает, когда я пытаюсь сделать это с помощью cron. Я также попытался переключиться на базовый скрипт Python (запись в файл), и это сработало. Есть ли какое-то странное взаимодействие, о котором мне нужно знать?

Моя настройка: raspberry pi 3, python 3, raspi-screen, tkinter (последняя версия, насколько мне известно)

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
0
2 280
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Судо будет работать без tty и отображаться, поэтому ваша команда не будет работать.

Попробуйте установить xvfb и использовать

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

Обновление-1: 22-июн-18

Если вы хотите использовать свой фактический дисплей, вам необходимо убедиться, что вы используете команду ниже

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

А также убедитесь, что cron предназначен для вашего пользователя. DISPLAY по умолчанию - :0.

Когда у вас есть XServer (графический интерфейс), вы не можете просто подключиться к нему без авторизации. При запуске системы создается файл, и это местоположение сохраняется в переменной окружения XAUTHORITY.

Когда вы запускаете cron, у вас есть ограниченные переменные среды. Нет существующих XAUTHORITY или DISPLAY, определенных чтобы иметь возможность подключиться к нужному дисплею. Итак, вам нужно определить каждую переменную среды, которая потребуется вашей программе.

Итак, вы определяете DISPLAY=:0 для выбора дисплея по умолчанию, и вам нужно установить XAUTHORITY=/home/<user>/.Xauthority, чтобы подтвердить, что вы авторизованы для подключения к дисплею.

Позвольте нам продолжить обсуждение в чате.

Tarun Lalwani 22.06.2018 15:25

это сработало для меня, добавив путь к python: / usr / bin / pýthon3 /path_to_file/my_file.py, возможно, поможет кому-то эта информация

LucasRT 14.05.2019 08:31

Raspbian 10 (buster): единственной недостающей частью - в моем случае - было сообщить cron-job с помощью gtk, какой дисплей он должен использовать, вставив DISPLAY=:0. Я использовал bash-скрипт, чтобы запустить python-скрипт с помощью tk; Это также может быть скрипт на 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

Вместо @reboot можно использовать обычные настройки cron, например:

*/5 * * * * (остальная часть строки см. Выше)

каждые 5 минут до запуска.

Привет! Я все еще получаю сообщение об ошибке при использовании вашего метода: _tkinter.TclError: не удалось подключиться к отображению ": 0"

Benoît 11.03.2020 14:20

Обычно я работаю в «безголовой» среде; то есть RPi3 подключен к локальной сети через кабель Ethernet, VNC включен в raspisetup, а удаленный рабочий стол, например, VNC или другой клиент показывает экран RPi на экране ПК. Возможно, ваш графический дисплей подключен к другому, например. : 1 или: 2. Кто-нибудь знает, как определить активный номер дисплея или имя?

peets 12.03.2020 16:08

Другие вопросы по теме