在Ubuntu服务器上使用Python Tkinter时的问题
我在使用tkinter这个插件时遇到了问题。 我在本地系统上使用的是Ubuntu 12.10桌面版,并且安装了Python 2.7和3.2。 我在OpenERP中使用tkinter插件,它在我的本地电脑上运行得很好。 但是,当我在服务器(Ubuntu 12.04服务器)上使用相同的代码时,它就不工作了。
它显示了
self.tk = _tkinter.create(screenName, baseName, className, interactive, wantobjects, useTk,sync, use)
TclError: no display name and no $DISPLAY environment variable
我在终端中用Python检查了一下,也显示了错误,这意味着tkinter在某个地方有问题,我不知道具体是什么。 我也检查了tkinter和Python的版本,都是好的。 但是在终端中查找tkinter时,我发现了一些不寻常的地方。 在本地,它显示tkinter插件位于Python 3.2中,但在服务器上却没有显示tkinter。
我也检查了权限,都是正常的。 请问如何让tkinter在Ubuntu 12.04服务器上工作呢?
2 个回答
我刚遇到同样的问题,给还在关注这个问题的人说一下:之前的回答几乎是对的,但顺序很重要:你需要在调用pyplot之前先调用matplotlib.use。
这个方法对我有效:
import matplotlib
# force headless backend, or set 'backend' to 'Agg'
# in your ~/.matplotlib/matplotlibrc
matplotlib.use('Agg')
import matplotlib.pyplot
# force non-interactive mode, or set 'interactive' to False
# in your ~/.matplotlib/matplotlibrc
matplotlib.pyplot.ioff()
如果能提供完整的错误追踪信息和更多的代码片段就好了。这个错误信息的意思是Tkinter找不到你的X图形环境,这很可能是因为你在一个没有图形界面的服务器上运行代码,正如Dominic所提到的。
你可以尝试在服务器上安装X,但如果这台机器真的是用作没有用户界面的服务器,那其实不需要图形界面。
如果你确实需要在执行这段代码时显示图形界面,那么要么就不要在服务器上运行这段代码,要么你需要设置X11转发到客户端机器。不过在OpenERP的上下文中,这样做似乎并不太合理,因为这对所有用户来说都不太适用。
你是不是在用matplotlib生成图形呢?(你的代码片段没有显示这一点)如果是的话,你可以强制它使用无头模式来生成图像,具体方法可以参考这个问题或者这个其他问题。
在调用渲染代码之前,试着执行以下代码:
import matplotlib
import matplotlib.pyplot
# force headless backend, or set 'backend' to 'Agg'
# in your ~/.matplotlib/matplotlibrc
matplotlib.use('Agg')
# force non-interactive mode, or set 'interactive' to False
# in your ~/.matplotlib/matplotlibrc
matplotlib.pyplot.ioff()
另外,以下是一些参考资料: