Fehlerpopups von wxPython

Plattformunabhängige GUIs mit wxWidgets.
Antworten
Stolzi
User
Beiträge: 155
Registriert: Mittwoch 18. August 2004, 15:44

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
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

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...
Stolzi
User
Beiträge: 155
Registriert: Mittwoch 18. August 2004, 15:44

Danke gute Idee.
Ist halt ein workaround... Wenn wer eine andere Lösung hat bitte auch noch melden ;-)
Stolzi
User
Beiträge: 155
Registriert: Mittwoch 18. August 2004, 15:44

Ä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
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

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
[code]#!/usr/bin/env python
import this[/code]
Stolzi
User
Beiträge: 155
Registriert: Mittwoch 18. August 2004, 15:44

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
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

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
[code]#!/usr/bin/env python
import this[/code]
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Hmm, mal wieder um sonst gearbeitet :x

Habe gerade da Modul imghdr entdeckt.

Bei Python sind die Batterien eben schon dabei 8)


Gruß

Dookie
[code]#!/usr/bin/env python
import this[/code]
Stolzi
User
Beiträge: 155
Registriert: Mittwoch 18. August 2004, 15:44

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...
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

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
[code]#!/usr/bin/env python
import this[/code]
Christopy
User
Beiträge: 131
Registriert: Montag 15. Dezember 2003, 22:39

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:
Stolzi
User
Beiträge: 155
Registriert: Mittwoch 18. August 2004, 15:44

@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?
Christopy
User
Beiträge: 131
Registriert: Montag 15. Dezember 2003, 22:39

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?
Stolzi
User
Beiträge: 155
Registriert: Mittwoch 18. August 2004, 15:44

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.
2bock
User
Beiträge: 94
Registriert: Freitag 12. September 2003, 07:58
Wohnort: 50.9333300 / 6.3666700

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:
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

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