RuntimeError: Gtk couldn't be initialized. Use Gtk.init_check() if you want to handle this case

RuntimeError: Gtk couldn't be initialized. Use Gtk.init_check() if you want to handle this case

我在 python 3.8.2 中编写了以下示例脚本:

import gi

gi.require_version("Gtk", "3.0")
from gi.repository import Gtk


class GridWindow(Gtk.Window):
    def __init__(self):
        Gtk.Window.__init__(self, title="Grid Example")

        grid = Gtk.Grid()
        self.add(grid)
        grid.set_row_spacing(2)
        grid.set_column_spacing(4)

        button1 = Gtk.Button(label="Button 1")
        button2 = Gtk.Button(label="Button 2")
        button3 = Gtk.Button(label="Button 3")
        button4 = Gtk.Button(label="Button 4")
        button5 = Gtk.Button(label="Button 5")
        button6 = Gtk.Button(label="Button 6")

        grid.add(button1)
        grid.attach(button2, 1, 0, 2, 1)
        grid.attach_next_to(button3, button1, Gtk.PositionType.BOTTOM, 1, 2)
        grid.attach_next_to(button4, button3, Gtk.PositionType.RIGHT, 2, 1)
        grid.attach(button5, 1, 2, 1, 1)
        grid.attach_next_to(button6, button5, Gtk.PositionType.RIGHT, 1, 1)


win = GridWindow()
win.connect("destroy", Gtk.main_quit)
win.show_all()
Gtk.main()

这只是虚拟示例。 我打算通过 crontab 文件上的 cron 条目 运行 此代码,但是当我这样做时,出现以下错误:

Unable to init server: Could not connect: Connection refused
Traceback (most recent call last):
  File "/home/dggt/Vscode/scratches/PythonExamples/gui_example/gi_config/sample_grid.py", line 31, in <module>
    win = GridWindow()
  File "/home/dggt/Vscode/scratches/PythonExamples/gui_example/gi_config/sample_grid.py", line 9, in __init__
    Gtk.Window.__init__(self, title="Grid Example")
  File "/usr/lib/python3/dist-packages/gi/overrides/Gtk.py", line 520, in __init__
    raise RuntimeError(
RuntimeError: Gtk couldn't be initialized. Use Gtk.init_check() if you want to handle this case.

让这个错误更奇怪的是,当它通过我的 IDE 运行 时它完美地工作,换句话说,带有按钮的 window 显示在屏幕。 这是我的规格:

这是我的 crontab 条目:

这是我的 cron 日志 header:

From dggt@dggt  Mon Jun 29 11:21:01 2020
Return-Path: <dggt@dggt>
X-Original-To: dggt
Delivered-To: dggt@dggt
Received: by dggt (Postfix, from userid 1000)
    id 4F71A87D05; Mon, 29 Jun 2020 11:21:01 -0300 (-03)
From: root@dggt (Cron Daemon)
To: dggt@dggt
Subject: Cron <dggt@dggt> /bin/python3 /home/dggt/Vscode/scratches/PythonExamples/gui_example/gi_config/sample_grid.py
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
X-Cron-Env: <PATH=/home/dggt/.local/bin:/home/dggt/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin>
X-Cron-Env: <SHELL=/bin/sh>
X-Cron-Env: <HOME=/home/dggt>
X-Cron-Env: <LOGNAME=dggt>
Message-Id: <20200629142101.4F71A87D05@dggt>
Date: Mon, 29 Jun 2020 11:21:01 -0300 (-03)

有人知道哪里出了问题吗?我是否错过了一些必须先完成的预定义配置才能 运行 此脚本?

crontab 脚本未在 a full user session 中启动。显示服务器连接不会传播到您的脚本。

这就是您收到此消息的原因:

Unable to init server: Could not connect: Connection refused

然后告诉您 GTK 无法初始化显示连接。

crontab 脚本中未设置 DISPLAY 环境变量。仅设置 HOMELOGNAMESHELL

快速修复 将在您的 cronscript 中添加变量。如@esbassi 链接的 Option 1 中所述。

在您的用户会话中:

echo $DISPLAY
:0.0

在您的 crontab 条目中:

*/1 * * * * export DISPLAY=':0.0'; /bin/python3 /home/dggt/Vscode/scratches/PythonExamples/gui_example/gi_config/sample_grid.py