无头服务器上的 Tkinter 设置

Tkinter setup on headless server

我写了一个带有 Tkinter GUI 的 Python 应用程序,后来添加了一些 CLI 功能以在没有 GUI 的情况下在无头服务器(Ubuntu Server 16.04)上使用它。

为了限制我必须更改的代码,一些 Tkinter 设置仍然完成,即使在 CLI 模式下也是如此

root = tk.Tk()
canvas = tk.Canvas(root, borderwidth=0)
frame = tk.Frame(canvas)
...

现在,如果我按照此处 34584827 的建议使用 -X ssh 连接到服务器,它就可以正常工作。但我希望它 运行 的方式是 NodeJs 聊天机器人(运行在同一台服务器上无人值守)启动应用程序并使用结果。

这给了我错误:

Traceback (most recent call last):
  File "sim.py", line 60, in <module>
    root = tk.Tk()
  File "/usr/lib/python2.7/lib-tk/Tkinter.py", line 1818, in __init__
    self.tk = _tkinter.create(screenName, baseName, className, interactive, wantobjects, useTk, sync, use)
_tkinter.TclError: no display name and no $DISPLAY environment variable

我能做些什么来挽救这种情况吗?我可以在聊天机器人中使用的参数,Tkinter 的配置...?

注意:此应用程序还使用 Matplotlib 生成图表,但 中提出的解决方案负责该部分。

If there anything I can do to salvage this situation?

如果运行 在命令行模式下,您唯一可以做的就是修改代码以不初始化 tkinter。可以加个选项,也可以捕获实例化时抛出的异常Tk

我有一个类似的问题,经过几乎一整天的搜索和测试,这个解决方案 非常适合我。

我们需要在无头服务器上使用虚拟屏幕安装和配置 X window,然后 运行 我们的 python 启动 tkinter 的脚本。这样就不用修改代码了,yeah.