2011-11-25 16 views
6

Sto cercando di leggere alcune immagini (e in seguito si intende eseguire qualche attività su di esse) e mentre le immagini vengono lette in memoria. Voglio visualizzare un'immagine '.gif' animata. A tale scopo ho dovuto usare Threads. Ora si sta dando errore:python: errore IO irreversibile 11 (risorsa temporaneamente non disponibile) sul server X: 0.0

python: Fatal IO error 11 (Resource temporarily unavailable) on X server :0.0. 

E alcune volte dà l'errore:

python: Fatal IO error 0 (Success) on X server :0.0. 

(Sì Messaggio di errore cambia quasi alternativamente) Non ho idea del perché questo errore si è verificato e come rimuovere esso.

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() 

se sostituisco questa linea

dirim[infile]=wx.Bitmap(path+infile) 

con una linea fittizia:

dirim[infile]=infile 

è un lavoro bene, nessun errore.

E se sostituisco questa linea

thread.start_new_thread(grabImages, ()) 

con un qualcosa di simile a:

grabImages() 

è un lavoro bene, nessun errore. Solo Problema Non riesco a visualizzare le GIF animate ..

Ho provato a rimuovere ~/.gconf/desktop/gnome/periferiche come indicato nello link dato da joaquin. Non funziona .. e ho anche provato 'xhost +'. Ho trovato da qualche parte sulla rete. Ancora nessun successo.

Si prega di dire cosa sta succedendo in questo codice .. e suggerire una soluzione Sto usando Ubuntu 10.04 OS. e la directory permessi sono:

drwxr-xr-x images 
drwxr-xr-x soccer 
dettaglio di

Python verion sono: Python 2.6.5 (R265: 79063 16 Apr 2010 13:09:56) [GCC 4.4.3] sul linux2

+0

Questo avviene qualche anno dopo, ma vorrei aggiungere che ho avuto lo stesso errore (ma con PySide) e, per me, è stato legato alla [questa domanda] (http : //stackoverflow.com/questions/8649233/threading-it-is-not-safe-to-use-pixmaps-outside-the-gui-thread). Quindi in pratica non puoi chiamare le funzioni di disegno al di fuori del thread principale, ed è per questo che ha funzionato quando hai sostituito Bitmap con qualcos'altro. – iled

risposta

2

Il tuo codice funziona perfettamente per me in win7 con wxpython 2.8.12.1 e python 2.6.7 in esecuzione su Spe versione 0.8.4.i quando le immagini si trovano nella directory degli script (ho usato la mia gif animata e un png).

L'unico cambiamento di cui avevo bisogno era quello di importare animate (from wx import animate) oltre al WX e utilizzare

showclock = animate.GIFAnimationCtrl(self, -1, clock) 

invece di

showclock = wx.animate.GIFAnimationCtrl(self, -1, clock) 

Edit: Ci sono diversi casi di persone che hanno la stessi messaggi di errore come il tuo come here e here e here. Quest'ultimo mi fa pensare che potrebbe essere correlato con l'uso di thread con un framework gui in linux (see also here something related).Dovresti cercare su google la stringa di errore per vedere se puoi ottenere ulteriori informazioni o porre una domanda specifica su SO con la stringa dell'errore come argomento. Uf! c'è already one!

+0

Le autorizzazioni di directory sono: immagini drwxr-xr-x drwxr-xr-x soccer Non è una directory o un server protetti. importazioni sono: importazione wx, wx.animate importazione filo import os Sto usando Ubuntu 10.04 – anshul410

+0

secondo il vostro suggerimento Ho modificato il codice: Dà: NameError: nome globale 'animato' non è definito – anshul410

+0

da wx import animate – joaquin

2

Non so se è legato al tuo problema, ma si dovrebbe istanziare la finestra e chiamare lo ShowModal dopo la creazione del wxApp:

class App(wx.App): 
    def OnInit(self): 
     dia = AniGif(None, -1, "Ani Gif") 
     try: 
      dia.ShowModal() 
     finally: 
      dia.Destroy() 
     return True 

App(0).MainLoop() 

== modifica ==

non l'ho fatto ci vediamo istanziato un wx.Bitmap da un altro thread. Questo non va bene. Prova a modificare:

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) 
+0

Ancora gli stessi due errori: Errore irreversibile IO 0 Errore irreversibile IO 11 – anshul410

+0

@ anshul410 Anche con 'CallAfter'? Questo ha risolto un problema simile per me. –

Problemi correlati