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

Freitag 14. März 2008, 18:26

(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

Freitag 14. März 2008, 19:16

Hallo,

wie definierst du self.pixbuf?

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

Freitag 14. März 2008, 20:09

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

Samstag 15. März 2008, 02:43

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
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Samstag 15. März 2008, 09:14

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 Modvoice
Samhayne
User
Beiträge: 19
Registriert: Montag 25. Februar 2008, 19:18

Sonntag 16. März 2008, 03:03

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

Sonntag 16. März 2008, 08:45

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

Sonntag 16. März 2008, 11:05

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
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Sonntag 16. März 2008, 11:08

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

Sonntag 16. März 2008, 11:26

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
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Sonntag 16. März 2008, 11:42

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 Modvoice
Samhayne
User
Beiträge: 19
Registriert: Montag 25. Februar 2008, 19:18

Sonntag 16. März 2008, 11:48

oooops.... überlesen.

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

Sonntag 16. März 2008, 11:50

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
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Sonntag 16. März 2008, 12:10

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 Modvoice
Samhayne
User
Beiträge: 19
Registriert: Montag 25. Februar 2008, 19:18

Sonntag 16. März 2008, 13:24

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.
Antworten