Seite 1 von 1
Fehlerpopups von wxPython
Verfasst: Samstag 18. September 2004, 15:59
von Stolzi
Hallo,
ich habe keine Möglichkeit die Fehlerpopups von wxPython zu unterbinden.
Wenn ich zB ein Bild per
Code: Alles auswählen
try:
self.bitconst = wx.Image(os.path.join(path,dir[i]),wx.BITMAP_TYPE_ANY)
self.bitconst = self.bitconst.Scale(80,80)
except:
self.bitconst = wx.EmptyImage(80,80)
self.bitconst = wx.BitmapFromImage(self.bitconst)
self.pic[i]=wx.StaticBitmap(self,-1,self.bitconst)
lade, dann macht zwar Python schön was ich will wenn es kein Bild ist durch try-except, aber wxPython gibt immer ein Popupfenster mit dem Hinweis: "No Handler found for this Image Type" aus
Habe nix dazu gefunden wie ich das kontrollieren kann.
Danke
Stolzi
Verfasst: Samstag 18. September 2004, 16:04
von Milan
Hi. Ich hab zwar nach wie vor kein wxpython, aber vielleicht kannst du mit der PIL zuerst prüfen ob es sich um ein Bild handelt und erst dann den Pfad an wxpython übergeben. So würdest du das Verhalten umgehen können...
Verfasst: Samstag 18. September 2004, 16:11
von Stolzi
Danke gute Idee.
Ist halt ein workaround... Wenn wer eine andere Lösung hat bitte auch noch melden
Verfasst: Sonntag 19. September 2004, 15:52
von Stolzi
Äh Milan...
Wollte nun mal bis ich mehr erfahren deinen Workaround nehmen. Wie genau würdest du das machen?
Ich habe das mal so gemacht:
Code: Alles auswählen
try:
Image.open(file)
self.bitconst = wx.Image(file,wx.BITMAP_TYPE_ANY)
except:
......
Funktioniert, aber gibts da viell auch einen Weg ohne das gesamte Bild zu laden? Die ladezeit wird dann verdoppelt wenn ichs so mache.
Danke
Stolzi
Verfasst: Sonntag 19. September 2004, 18:11
von Dookie
Hi Stolzi,
ich bin zwar nicht Milan, aber ich würds so machen, daß ich zuerst teste, ob die Datei überhaupt existiert und die Endung stimmt, wenn ja, eventuell die ersten paar Bytes lesen und schaun ob es wirklich eine Grafikdatei ist.
Gruß
Dookie
Verfasst: Sonntag 19. September 2004, 20:05
von Stolzi
Da ich das Programm vor allem für Linux schreibe kann ich nach der Endung nicht sonderlich gehn... Obs eine Datei ist prüfe ich schon.
Wie das mit den ersten Bytes lesen und pürfen geht verstehe ich nicht ganz. Kannst mir ein kleines Bsp geben?
Danke
Stolzi
Verfasst: Sonntag 19. September 2004, 21:23
von Dookie
in den ersten Bytes der meisten Grafikformate steht eine Kennung.
*.gif ... GIF???
*.png ... ?PNG
*.jpg ... ??????JFIF
Da wo ich Fragezeichen gemacht habe, stehen Bytes die zur Identifikation nicht unbedingt gebraucht werden bzw. das Format noch näher definieren. GIF89a z.B.
Code: Alles auswählen
def is_image(fname):
f = file(fname, "r")
ten_bytes = f.read(10)
f.close()
if ten_bytes[:3] == "GIF":
return "GIF"
elif ten_bytes[1:4] == "PNG":
return "PNG"
elif ten_bytes[6:] == "JFIF":
return "JPEG"
else:
return False
Gruß
Dookie
Verfasst: Sonntag 19. September 2004, 21:42
von Dookie
Hmm, mal wieder um sonst gearbeitet
Habe gerade da Modul
imghdr entdeckt.
Bei Python sind die Batterien eben schon dabei
Gruß
Dookie
Verfasst: Montag 20. September 2004, 08:42
von Stolzi
Danke, aber ich werds wohl doch eher händisch machen müssen, denn ich hab schon ein JPEG gefunden das imghdr nicht erkannte.
Hat folgenden Anfang:
stammt von einer Digi...
Verfasst: Montag 20. September 2004, 13:40
von Dookie
Hi Stolzi,
imghdr lässt sich auch einfach erweitern.
Code: Alles auswählen
import imghdr
def test_exif(bs, f):
if not bs:
f.seek(0)
bs = f.read(10)
if bs[6:10] == "Exif":
return "jpeg"
else:
return None
imghdr.tests.append(test_exif) #jetzt werden auch Jpeg aus einer Digicam erkannt.
Gruß
Dookie
Verfasst: Montag 20. September 2004, 17:33
von Christopy
Um wx.Image benutzen zu können musst Du Imagehandler initialisieren. Am besten einmal am Anfang des Hauptprogramms mit wx.InitAllImageHandlers.
EDIT: bin mir gar nicht mehr sicher, ob das hier überhaupt gefragt war
Verfasst: Montag 20. September 2004, 17:48
von Stolzi
@Dookie
Cool danke. Hab gesehn dasses da was gibt, hab aber nicht ganz gecheckt wies geht und wollte nicht schon wieder lästig fragen. Aber du machst dir ja sogar von selbst die Mühe
Danke nochmal
@Christopy
In welchem Zusammenhang sagst du das?
Verfasst: Montag 20. September 2004, 17:56
von Christopy
Na ja, wenn die ImageHandler initialisiert sind, kommen halt keine Pop-Ups, solange nicht unbekannte Bildtypen verwendet werden. Aber ich denke genau das war eigentlich Deine Frage, wie man unbekannte Bildtypen abfangen kann. Sorry, hab ich zu spät gerafft.
(allerdings sind doch für fast alle gängigen Formate ImageHandler zumindest zum laden vorhanden, oder?)
Hast Du schonmal versucht die wxImage Instanz mit einem leeren Konstruktor zu erstellen und dann den Rückgabewert von LoadImage() abzufragen? Oder kommt dann auch sofort ein Pop-Up?
Verfasst: Freitag 24. September 2004, 08:08
von Stolzi
Ja genau das habe ich gemeint
Nein das habe ich noch nicht versucht, da ich vermute dass es das selbe Ergebniss ergibt. Aber ich werde es mal versuchen.
Alle anderen Wege wie imghdr sind leider nur nicht sehr zielführende Workarounds, da ich mit den Funktionen prüfen sollte obs ein darstellbares Bild ist mit denen ichs dann auch erstelle.
andere Lösung
Verfasst: Mittwoch 13. Oktober 2004, 10:01
von 2bock
Hier eine geschicktere Lösung um die Dateiendung zu erhalten.
Code: Alles auswählen
import os
string= "c:\\test\\test.py"
print os.path.splitext(string)[1]
Weiß, dass es etwas spät kommt, aber......
Greetz from 2bock
Verfasst: Mittwoch 13. Oktober 2004, 17:58
von Milan
Hi 2bock... es geht leider genau nicht um die Dateiendung. Bilddateien können beliebige Namen haben und sind deswegen trotzdem als Bilder zu erkennen, da sie ein bestimmtes Format haben. Genausogut kann einen GIF Datei nur als Stream vorliegen (Ausgabe einer CGI-Seite) und ist trotzdem als solche zu erkennen. Genausogut geht es auch umgekehrt, manche Viren nennen sich als "bild.jpg" und trotzdem steckt eine ".exe" dahinter. Deswegen gibt es hier das Problem.