python:X服务器:0.0上的致命IO错误11(资源暂时不可用)

8 投票
2 回答
11382 浏览
提问于 2025-04-17 07:05

我正在尝试读取一些图片(之后还打算对它们进行一些操作),在图片被加载到内存的同时,我想显示一个动态的 '.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 个回答

3

你的代码在我这边的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上提问,标题写上错误信息。哎!已经有一个了

3

我不知道这是否和你的问题有关,但你应该在创建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)

撰写回答