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 :x

Habe gerade da Modul imghdr entdeckt.

Bei Python sind die Batterien eben schon dabei 8)


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:

Code: Alles auswählen

ÿØÿá1AExif  II*      	   ?       ?   
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 :roll: :wink:

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 :wink:

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.