ValueError: image should be a GdkPixbuf or empty

Programmierung für GNOME und GTK+, GUI-Erstellung mit Glade.
Samhayne
User
Beiträge: 19
Registriert: Montag 25. Februar 2008, 19:18

(edit: Für Neuankömmlinge hier :) ... am besten direkt zum 8. Posting weiterspringen ... "Verfasst am: So März 16, 2008 11:05")

Huhu!

Ich versteh's einfach nicht...

Lade ich ein GTKImage über ein File ein, ist alles okay.

Code: Alles auswählen

 
self.mainGUI.PopImageGTK.set_from_file('.\\Maps\\PopMap2.bmp')
self.mainGUI.popImage = RueImage.rueImage(self.mainGUI.PopImageGTK)  
Will ich das GTKImage jedoch über eine Pixmap laden, wirft er mir später 'nen ValueError:

Code: Alles auswählen

self.mainGUI.PopImageGTK.set_from_pixmap(self.pixmap, None)
self.mainGUI.popImage = RueImage.rueImage(self.mainGUI.PopImageGTK)  

Besagter ValueError:
Traceback (most recent call last):
File "C:\Python Projects\RueLaSchraat\Eclipse Workspace\test\src\root\nested\editImage_GUI.py", line 101, in confirm_changes
self.mainGUI.popImage = RueImage.rueImage(self.mainGUI.PopImageGTK)
File "C:\Python Projects\RueLaSchraat\Eclipse Workspace\test\src\root\nested\RueImage.py", line 15, in __init__
test_pixpuff = GTKimg.get_pixbuf()
ValueError: image should be a GdkPixbuf or empty

Hier noch der zugehörige Teil aus der rueImage Klasse:

Code: Alles auswählen

class rueImage:
    def __init__ (self, GTKimg):
        
        #convert GTK to PIL
        self.im = PIL.Image
        test_pixpuff = gtk.IMAGE_PIXBUF
        test_pixpuff = GTKimg.get_pixbuf() #VALUEERROR!!!!
...
Zuletzt geändert von Samhayne am Sonntag 16. März 2008, 11:12, insgesamt 2-mal geändert.
fred.reichbier
User
Beiträge: 155
Registriert: Freitag 29. Dezember 2006, 18:27

Hallo,

wie definierst du self.pixbuf?

Gruß Fred
Samhayne
User
Beiträge: 19
Registriert: Montag 25. Februar 2008, 19:18

Hey Fred. :D

self.pixbuf?
Versteh nicht ganz, was Du meinst.

Meinst Du test_pixpuff?
Mehr als die zwei Zeilen gibt es nicht...
Samhayne
User
Beiträge: 19
Registriert: Montag 25. Februar 2008, 19:18

Ahh...

Vermutlich meintest Du self.pixmap...

Hier... die letzten 3 Zeilen.

Code: Alles auswählen

...
        self.mDrawingarea = gtk.DrawingArea
        self.mDrawingarea = self.editPop.get_widget("drawingarea1")
        self.style = self.mDrawingarea.get_style()
        self.gc = self.style.fg_gc[gtk.STATE_NORMAL]
        
        self.PopImageGTK = gtk.Image
        self.PopImageGTK = PopImageGTK
        self.picHeight = self.PopImageGTK.get_pixbuf().get_height()
        self.picWidth = self.PopImageGTK.get_pixbuf().get_width()
        
        self.pixmap = gtk.Pixmap
        self.pixmap = gtk.gdk.Pixmap(self.mDrawingarea.window, self.picWidth, self.picHeight)
        self.pixmap.draw_pixbuf(self.gc, self.PopImageGTK.get_pixbuf(), 0,0,0,0)     
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Fehlen da nicht zufällig die ``()``, oder magst du da tatsächlich die Referenzen auf die Klassen speichern?
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Samhayne
User
Beiträge: 19
Registriert: Montag 25. Februar 2008, 19:18

Mhh.... jeiiiiin. :P

Ihr wisst das sicher besser... zwar gehören sie eigentlich rein (reine Schlamperei)... ich setz sie "so" aber eh nur als "Trick" für die Code Completion. Wird ja später wieder überschrieben (?).

Ändert jedenfalls (leider) nichts am Ergebnis...

Auch...

Code: Alles auswählen

class editImage_GUI:
    def __init__ (self, PopImageGTK, mainGUI):

        ...

        self.PopImageGTK = gtk.Image()
        self.PopImageGTK = PopImageGTK
        self.picHeight = self.PopImageGTK.get_pixbuf().get_height()
        self.picWidth = self.PopImageGTK.get_pixbuf().get_width()
        
        #self.pixmap = gtk.gdk.Pixmap
        self.pixmap = gtk.gdk.Pixmap(self.mDrawingarea.window, self.picWidth, self.picHeight)
        self.pixmap.draw_pixbuf(self.gc, self.PopImageGTK.get_pixbuf(), 0,0,0,0)      
        ...
        

...wirft denselben ValueError.

Wirklich keiner 'ne Ahnung warum es so 'nen Unterschied macht, ob ich "set_from_file" oder "set_from_pixmap" benutze?

Dann muss ich mir morgen 'ne komplett andere Lösung suchen. :(
BlackJack

Reduziere Deinen Code doch mal auf ein minimales, lauffähiges Beispiel dass das Problem zeigt.
Samhayne
User
Beiträge: 19
Registriert: Montag 25. Februar 2008, 19:18

Uffz. Okay... *umschreib*

1)
Einfach Bild aus Datei laden und aus ihm den Pixelbuffer lesen geht:

Code: Alles auswählen

        self.mainGUI.PopImageGTK = gtk.Image()     
        self.mainGUI.PopImageGTK.set_from_file('.\\Maps\\PopMap2.bmp')   






        ...


       




        pixelbuf = gtk.gdk.Pixbuf
        pixelbuf = self.mainGUI.PopImageGTK.get_pixbuf()
2)
Will das Bild bzw. dessen pixmap ja aber bearbeiten.
Doch nach Umwandlung "GTKImage->pixmap->GTKImage" darf ich den Pixelbuffer nicht mehr auslesen.

Code: Alles auswählen

        self.mainGUI.PopImageGTK = gtk.Image()
        self.mainGUI.PopImageGTK.set_from_file('.\\Maps\\PopMap2.bmp')

        self.picHeight = self.PopImageGTK.get_pixbuf().get_height()
        self.picWidth = self.PopImageGTK.get_pixbuf().get_width()

        self.mDrawingarea = gtk.DrawingArea()
        self.mDrawingarea = self.editPop.get_widget("drawingarea1")
        self.style = self.mDrawingarea.get_style()
        self.gc = self.style.fg_gc[gtk.STATE_NORMAL]

        self.pixmap = gtk.gdk.Pixmap(self.mDrawingarea.window, self.picWidth, self.picHeight)  
        self.pixmap.draw_pixbuf(self.gc, self.PopImageGTK.get_pixbuf(), 0,0,0,0)      # Konvertierung: GTKImage -> pixmap
       
        self.mainGUI.PopImageGTK.set_from_pixmap(self.pixmap, None) # Konvertierung: pixmap -> GTKImage
        
        pixelbuf = gtk.gdk.Pixbuf
        pixelbuf = self.mainGUI.PopImageGTK.get_pixbuf() # ValueError!!!


Error:
Traceback (most recent call last):
File "C:\Python Projects\RueLaSchraat\Eclipse Workspace\test\src\root\nested\main_GUI.py", line 117, in editPop
editGUI = editImage_GUI.editImage_GUI(self.PopImageGTK, self)
File "C:\Python Projects\RueLaSchraat\Eclipse Workspace\test\src\root\nested\editImage_GUI.py", line 71, in __init__
pixelbuf = self.mainGUI.PopImageGTK.get_pixbuf()
ValueError: image should be a GdkPixbuf or empty
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Das ist immer noch kein lauffähiges Minimalbeispiel, das man einfach ausführen kann.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Samhayne
User
Beiträge: 19
Registriert: Montag 25. Februar 2008, 19:18

Vermutlich meinst u.a. das Drawable... (von lauffähig sagte BlackJack ja nix :) )

Okay... in der Pixmap Initialisierung kann man es einfach None setzen... dann wirft er zwar 'ne Warnung, aber der Code läuft durch... bis zur Problemzeile.

Code: Alles auswählen

        self.PopImageGTK = gtk.Image()
        self.PopImageGTK.set_from_file('.\\Maps\\PopMap2.bmp')

        self.picHeight = self.PopImageGTK.get_pixbuf().get_height()
        self.picWidth = self.PopImageGTK.get_pixbuf().get_width()
   
        self.pixmap = gtk.gdk.Pixmap(None, self.picWidth, self.picHeight, 16)
        self.pixmap.draw_pixbuf(None, self.PopImageGTK.get_pixbuf(), 0,0,0,0)      # Konvertierung: GTKImage -> pixmap 
                  
        self.PopImageGTK.set_from_pixmap(self.pixmap, None)      # Konvertierung: pixmap -> GTKImage 
        
        pixelbuf = gtk.gdk.Pixbuf
        pixelbuf = self.PopImageGTK.get_pixbuf() #ValueError!! 
Traceback (most recent call last):
File "C:\Python Projects\RueLaSchraat\Eclipse Workspace\test\src\root\nested\main_GUI.py", line 117, in editPop
editGUI = editImage_GUI.editImage_GUI(self.PopImageGTK, self)
File "C:\Python Projects\RueLaSchraat\Eclipse Workspace\test\src\root\nested\editImage_GUI.py", line 71, in __init__
pixelbuf = self.PopImageGTK.get_pixbuf() #ValueError!!
ValueError: image should be a GdkPixbuf or empty

Kommentiert man Zeile 10 (also die Rückumwandlung) einfach weg, läuft's durch...
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Samhayne hat geschrieben:Vermutlich meinst u.a. das Drawable... (von lauffähig sagte BlackJack ja nix :) )
Nicht?
BlackJack hat geschrieben:Reduziere Deinen Code doch mal auf ein minimales, lauffähiges Beispiel dass das Problem zeigt.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Samhayne
User
Beiträge: 19
Registriert: Montag 25. Februar 2008, 19:18

oooops.... überlesen.

However... Ich hoff es ist jetzt lauffähig genug. :(
Benutzeravatar
Trundle
User
Beiträge: 591
Registriert: Dienstag 3. Juli 2007, 16:45

Ich könnte mir vorstellen, dass das einfach gar nicht geht. Die Dokumentation sagt zu der `get_pixbuf`-Methode:
The get_pixbuf() method gets the gtk.gdk.Pixbuf being displayed by the gtk.Image. The return value may be None if no image data is set. If the storage type of the image is not either gtk.IMAGE_EMPTY or gtk.IMAGE_PIXBUF the ValueError exception will be raised.
Ein `set_from_pixmap` dürfte den Storage-Type jedoch auf `gtk.IMAGE_PIXMAP` setzen. `get_pixbuf`wirft also einen ValueError, was völlig korrektes Verhalten ist.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Samhayne hat geschrieben:However... Ich hoff es ist jetzt lauffähig genug. :(
Lauffähig heißt, dass sich das jemand in eine Datei kopieren kann und es läuft. Das ist bei deinem nicht mal annähernd der Fall. Wenn du kein Beispiel machen willst, warum erwartest du dann Hilfe?
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Samhayne
User
Beiträge: 19
Registriert: Montag 25. Februar 2008, 19:18

Dank Dir Trundle!
Endlich mal ein Wink. :D

Bin bisher davon ausgegangen, daß GTKImage einfach EIN Datentyp ist und es nicht noch verschiedene Storagetypen gibt. Deswegen konnt' ich mit dem ValueError nichts anfangen.

Ich forsch mal weiter in Richtung Konvertierung GtkImage<->pixmap ... :)


@Leonidas:
hab für Dich noch'n "import gtk" drübergeschrieben und das ganze in 'ne Klasse gepackt.

Code: Alles auswählen

import gtk

class tolle_klasse:
	def __init__(self):
		self.PopImageGTK = gtk.Image() 
		self.PopImageGTK.set_from_file('Sw.bmp') 

		self.picHeight = self.PopImageGTK.get_pixbuf().get_height() 
		self.picWidth = self.PopImageGTK.get_pixbuf().get_width() 
    
		self.pixmap = gtk.gdk.Pixmap(None, self.picWidth, self.picHeight, 16) 
		self.pixmap.draw_pixbuf(None, self.PopImageGTK.get_pixbuf(), 0,0,0,0)      # Konvertierung: GTKImage -> pixmap 
                  
		self.PopImageGTK.set_from_pixmap(self.pixmap, None)      # Konvertierung: pixmap -> GTKImage 
        
		pixelbuf = gtk.gdk.Pixbuf 
		pixelbuf = self.PopImageGTK.get_pixbuf() #ValueError!! 

if __name__ == '__main__':
	tolle_klasse()
Für Deine persönliche Frustration kann ich nix.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Samhayne hat geschrieben:Für Deine persönliche Frustration kann ich nix.
Bitte ausführen.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Samhayne
User
Beiträge: 19
Registriert: Montag 25. Februar 2008, 19:18

Dein Ton war unpassend.
Es gab keinen Grund mich anzupissen.

Ein "schreib's bitte so, daß man's einfach über 'ne Textdatei ausführen kann - dann tu ich mir leichter nachzukucken" wär auch 'ne Möglichkeit gewesen. :wink:

Ursprünglich bin ich davon ausgegangen, daß Profis das eh mit einem Blick sehen ... ich selbst hab ja erst vor ein paar Tagen mit Python / GTK angefangen und bin noch ziemlich am kämpfen.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Samhayne hat geschrieben:Dein Ton war unpassend.
Es gab keinen Grund mich anzupissen.
Hab ich nicht. BlackJack hat um ein lauffähiges Beispiel gebeten. Hast du mehrmals nicht geschafft zu liefern. Was würdest du dir da denken?
Samhayne hat geschrieben:Ein "schreib's bitte so, daß man's einfach über 'ne Textdatei ausführen kann - dann tu ich mir leichter nachzukucken" wär auch 'ne Möglichkeit gewesen. :wink:
Richtig. Ich bin davon ausgegangen, dass "lauffähiges Beispiel" dies impliziert. Du bist ja selbst darauf gekommen, dass es so einfacher ist sich das anzusehen.

Gut, davon abgesehen habe ich hier gerade kein GTK+ verfügbar, ich werds mir dann später auf meinem GNOME-Desktop ansehen.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Samhayne
User
Beiträge: 19
Registriert: Montag 25. Februar 2008, 19:18

Leonidas hat geschrieben:
Samhayne hat geschrieben:Dein Ton war unpassend.
Es gab keinen Grund mich anzupissen.
Hab ich nicht. BlackJack hat um ein lauffähiges Beispiel gebeten. Hast du mehrmals nicht geschafft zu liefern. Was würdest du dir da denken?
... daß der Kerl nicht ganz verstanden hat, was ich will.
Lauffähig war der Code ja letztlich. Man musste ihn nur in irgendeine Klasse reinkopieren. (oder halt schnell die ".self"s löschen... hatte ich nicht drangedacht. Mea Culpa.)

Das...
Leonidas hat geschrieben:Wenn du kein Beispiel machen willst, warum erwartest du dann Hilfe?
...war deswegen einfach unangebracht. Hatte mich ja bemüht, das Ding zu entwirren, nachdem ich das Problem unterschätzt hatte.
Bin ja erst davon ausgegangen, daß die 4 Zeilen aus dem ersten Posting reichen müssten.
Danach kamen aber Fragen nach mehr Code.
Gut, davon abgesehen habe ich hier gerade kein GTK+ verfügbar, ich werds mir dann später auf meinem GNOME-Desktop ansehen.
cool. thx.
fred.reichbier
User
Beiträge: 155
Registriert: Freitag 29. Dezember 2006, 18:27

Hallo,

bei mir kommen da diese Warnungen von GTK:
fred@gnom:~/dev$ python test.py
test.py:12: GtkWarning: /build/buildd/gtk+2.0-2.12.0/gdk/gdkpixbuf-drawable.c:1247: Source drawable has no colormap; either pass in a colormap, or set the colormap on the drawable with gdk_drawable_set_colormap()
self.pixmap.draw_pixbuf(None, self.PopImageGTK.get_pixbuf(), 0,0,0,0) # Konvertierung: GTKImage -> pixmap
test.py:12: GtkWarning: The gdk_draw_*_image require the drawable argument to
have a specified colormap. All windows have a colormap,
however, pixmaps only have colormap by default if they
were created with a non-NULL window argument. Otherwise
a colormap must be set on them with gdk_drawable_set_colormap

self.pixmap.draw_pixbuf(None, self.PopImageGTK.get_pixbuf(), 0,0,0,0) # Konvertierung: GTKImage -> pixmap
Traceback (most recent call last):
File "test.py", line 20, in <module>
tolle_klasse()
File "test.py", line 17, in __init__
pixelbuf = self.PopImageGTK.get_pixbuf() #ValueError!!
ValueError: image should be a GdkPixbuf or empty
Ich hab mal das für dich interessante eingefettet.

Gruß Fred
Antworten