python:X服务器:0.0上的致命IO错误11(资源暂时不可用)
我正在尝试读取一些图片(之后还打算对它们进行一些操作),在图片被加载到内存的同时,我想显示一个动态的 '.gif' 图片。为此,我需要使用线程。但现在出现了错误:
python: Fatal IO error 11 (Resource temporarily unavailable) on X server :0.0.
有时候还会出现这样的错误:
python: Fatal IO error 0 (Success) on X server :0.0.
(是的,错误信息几乎是交替变化的)我不知道为什么会出现这个错误,也不知道怎么解决。
import wx
from wx import animate
import thread
import os
class AniGif(wx.Dialog):
def __init__(self, parent, id, title):
wx.Dialog.__init__(self, parent, id, title, size=(300, 300))
buttonOk = wx.Button(self, id=3, label="Ok", pos=(75, 50), size=(50, 50))
self.Bind(wx.EVT_BUTTON, self.OnClick, id=3)
def OnClick(self, event) :
clock = "loading.gif"
showclock = wx.animate.GIFAnimationCtrl(self, -1, clock)
showclock.Play()
thread.start_new_thread(grabImages, ( ))
def grabImages():
global dirim
dirim = {}
path = './images/soccer/'
listing = os.listdir(path)
for infile in listing:
if len(infile)>4 and infile[-4:]=='.jpg' :
print path+infile
dirim[infile]=wx.Bitmap(path+infile)
app = wx.App()
dia = AniGif(None, -1, "Ani Gif")
dia.ShowModal()
dia.Destroy()
app.MainLoop()
如果我把这一行
dirim[infile]=wx.Bitmap(path+infile)
换成一行无关紧要的代码:
dirim[infile]=infile
那就没问题了,没错误。
而如果我把这一行
thread.start_new_thread(grabImages, ( ))
换成类似这样的代码:
grabImages()
那也没问题,没错误。唯一的问题是我无法显示动态的 gif 图片了……
我尝试过删除 ~/.gconf/desktop/gnome/peripherals,正如joaquin给的链接中提到的,但没有效果……我还尝试过 'xhost +',这是我在网上找到的,还是没有成功。
请告诉我这段代码发生了什么……并建议一个解决方案。我使用的是 Ubuntu 10.04 操作系统。目录权限是:
drwxr-xr-x images
drwxr-xr-x soccer
Python 版本的详细信息是:
Python 2.6.5 (r265:79063, Apr 16 2010, 13:09:56) [GCC 4.4.3] 在 linux2 上运行2 个回答
你的代码在我这边的Windows 7上运行得很好,我使用的是wxpython 2.8.12.1和Python 2.6.7,运行在Spe版本0.8.4.i上,前提是图片放在脚本所在的目录里(我用了自己的动画gif和一个png)。
我唯一需要改动的就是除了wx之外,还要导入animate(from wx import animate
),然后使用
showclock = animate.GIFAnimationCtrl(self, -1, clock)
而不是
showclock = wx.animate.GIFAnimationCtrl(self, -1, clock)
补充:有很多人遇到和你一样的错误信息,比如这里、这里和这里。最后一个让我觉得这可能和在Linux中使用线程与图形界面框架有关(这里还有相关内容)。你可以在网上搜索一下错误信息,看看能不能找到更多的信息,或者在StackOverflow上提问,标题写上错误信息。哎!已经有一个了!
我不知道这是否和你的问题有关,但你应该在创建wxApp之后,先实例化对话框,然后再调用它的ShowModal方法:
class App(wx.App):
def OnInit(self):
dia = AniGif(None, -1, "Ani Gif")
try:
dia.ShowModal()
finally:
dia.Destroy()
return True
App(0).MainLoop()
== 编辑 ==
我没有看到你在另一个线程中实例化wx.Bitmap。这是不好的。试试这个:
def grabImages():
global dirim
dirim = {}
def addToDict(key, path):
dirim[key] = wx.Bitmap(path)
path = './images/soccer/'
listing = os.listdir(path)
for infile in listing:
if len(infile)>4 and infile[-4:]=='.jpg' :
print path+infile
wx.CallAfter(addToDict, infile, path+infile)