[gelöst] Frame-Icon Problem

Plattformunabhängige GUIs mit wxWidgets.
mathi
User
Beiträge: 314
Registriert: Dienstag 27. November 2007, 14:30

Hallo miteinander,


Das Icon (im Frame oben links) erscheint auf meinem 19'' Monitor (1600x1200), aber auf dem 24'' Monitor mit einer Auflösung von
1920x1200 leider nicht. Woran kann das liegen? Evtl. an der eingestellten Icon-Größe in Vista? Ich dachte das wird automatisch skaliert.

Gruß Mathi

Code: Alles auswählen

# -*- coding: iso-8859-15 -*- 


from wx.lib.embeddedimage import PyEmbeddedImage 
import wx.lib.newevent 

#import wx.html 

wx.SetDefaultPyEncoding("iso-8859-15") 

#--------------------------------------------------------------------------------------- 
icon_stream = PyEmbeddedImage( 
    "iVBORw0KGgoAAAANSUhEUgAAACQAAAAkCAIAAABuYg/PAAAAA3NCSVQICAjb4U/gAAAEGUlE" 
    "QVRIie1WS0srSxCu6emeR2I0JiSKaBa+FSQouAnE4MJf4EIQf4Nu/DWu/AsuxIXg+4EgKi6S" 
    "nWJioiSZPCaJwzzSfRfNzQk65njlcs65cL/FMExX9Vf1dVX1APwnIAjCL3T7Nn4137+C7wTd" 
    "2UcQhHaDnxr/eB8eHl5bW8vlcoIgEEIsy6KUfvRhjImiGIlEtra2np+fAWBpaWl2dlbTNMYY" 
    "ACCECCG2bVNKRVHEGFuWBQCUUowxd8Tz8/Nzc3MrKyulUimTyUSjUcdxXMlkWdY0bXd3N5vN" 
    "MsYWFhbi8XgwGOTBSZJ0fn4ejUYlSUomkwMDA4FAgC/Jsvz6+rq3t4ebzWYkEqnVaoQQVVV1" 
    "Xbdt+7PMxsbGCoUCF+fl5WVgYCCfz1NKGWOKovT29jLGGo1GJBLRNA1j3Gw2GWOEkMHBQQBA" 
    "AKAoCteQEIIQ6iC9JEmcmDGGEEII8e+CIHAZMcaMMUmSJEniq3xJFEUAwAihnZ2diYkJALi5" 
    "uVldXQ2Hw65nLopiPp8fHR19eHgAgPHxcV3Xh4aGGGOU0re3t9PT03g8bhhGsVjEGCcSCUVR" 
    "uP7VahUAMKV0eXlZ13VCSDAYnJ6eFkXxHRljjAfY3d1dLBb5x83NTVVVDcOglHK5jo+P/X6/" 
    "YRhTU1PX19eTk5N8K+749vaGAcAwjEajIctyV1cXADSbTa4ML7P29xYTAFiWZdt2ywYAvF6v" 
    "YRiGYWCMVVVtbdVy/CE6AGCM27N5x+RaNe90hr+7sH2rFjDXVFEUQkh74P+I9YvACKGTk5NA" 
    "IEAIeXx8vLi46OnpeRdvJpPxeDwejwdjvLGxcXBw8E0yxtj09LSqqjx9RVF0XW+3IIRUKpX+" 
    "/n7Lsnp6ejKZzPczo5T6fD7TNAGAUsqPvd2Ct4tpmqZpejyeDnvxzmu1oIsBxvju7s5xHF3X" 
    "n56eeAO2wKdAKpXSNE3TtMPDw8+6HgDu7+8xxoIgFAqFcrnsklk6nXYc5+zsjAd1dHTUqleO" 
    "crkci8XC4XC1Wp2cnHSdnBwzMzN8NRQK1et1F7LLy8vLy8sO4gDA9vZ2JBIBAMbYu1DawRhz" 
    "HIcPFFezTzVph8/nE0Xxi3Xf4XpDnZc56vW6IAgfx9jXaThwIpFYX1/P5XKuiQuCUCqVGGOl" 
    "UknXddM0CSGdd+xE1tfXhzFeXFy0LMs1NITQ/v7++Pi43++/vb3tUI0/1RlTSkdGRqrV6mdk" 
    "siwPDQ3xHojFYh0KhLcNv9VcY8L82uSjCNwGICHE6/X6fD6MsSzL/ORck6jVapIkZbNZv9/v" 
    "qjaybTuVSpmmyWdH+9O2bcdxTNOsVCrJZLJarV5dXYVCoY9MXBKEkKZpyWQynU4Hg0GX3Fsh" 
    "fPZ39if+v/6emL7E+ifK9T9+O/4Ca6olvzq05dsAAAAASUVORK5CYII=" 
) 


#--------------------------------------------------------------------------- 


class MyFirstFrame(wx.Frame): 
    """ 
    Erster Frame 
    """ 
    
    def __init__(self, parent = None, id = -1, title = '*** Tools V2.01 ***'): 
        """ 
        Frame initialisieren und aufbauen 
        """ 

        # Initialisieren 
        wx.Frame.__init__(self, parent, id, title,size=(900,870), style=wx.DEFAULT_DIALOG_STYLE | wx.MINIMIZE_BOX ) 
        # Basispanel 
        panel = wx.Panel(self) 
        panel.SetBackgroundColour(wx.Colour(240,240,240)) 
        #Icon 
        img = wx.ImageFromBitmap(icon_stream.GetBitmap()) 
        img.Rescale(16, 16) 
        bmp2 = wx.BitmapFromImage(img) 
        bmp2.SetMaskColour(wx.BLUE) 
        icon = wx.IconFromBitmap(bmp2) 
        self.SetIcon(icon) 
        # Font- Schriftart der Überschriften 
        font = wx.Font(10, wx.NORMAL, wx.NORMAL, wx.BOLD) 

        
        
        # Frame zentrieren 
        if parent: 
            self.CenterOnParent(parent) 
        else: 
            self.Center() 
        
        # Frame anzeigen 
        self.Show() 
    
#-----------------------------------------------------------------------------------------------------------            
def main(): 
    """ 
    Hauptprozedur 
    """ 
    
    app = wx.App() 
    first_frame = MyFirstFrame() 
    first_frame.Center() 
    first_frame.Show() 
    app.MainLoop() 

if __name__ == "__main__": 
    main()
Zuletzt geändert von mathi am Montag 23. Februar 2009, 15:13, insgesamt 3-mal geändert.
Benutzeravatar
C4S3
User
Beiträge: 292
Registriert: Donnerstag 21. September 2006, 10:07
Wohnort: Oberösterreich

Hallo mathi!

Kannst du mir das noch näher erklären?
Beide Monitore auf der gleichen Maschine (Dualhead)? Oder auf unterschiedlichen Maschinen/Systemen?
Hast du schon versucht, in Zeile 57 das Icon anders zu skalieren? Hier auf WindowsXP SP3 mit Dualhead funktioniert es auch noch mit 32x32 problemlos (das ist jetzt nur ein Schuss ins Blaue).

Erzähl doch mal ein bisschen mehr...

Verwendest du in deiner App auch PyEmbeddedImage() oder eine andere Methode? Vielleicht liegt es ja daran?

Und: wie bekommst du das Buchstabengewusel eigentlich hin? Ich meine welches Programm benutzt du, um aus einem Bild DAS zu generieren (ich finde das nämlich ungemein praktisch)?
Gruß!
BlackJack

@C4S3:

Code: Alles auswählen

In [190]: 'Buchstabengewusel'.encode('base64')
Out[190]: 'QnVjaHN0YWJlbmdld3VzZWw=\n'

In [191]: _.decode('base64')
Out[191]: 'Buchstabengewusel'
Benutzeravatar
C4S3
User
Beiträge: 292
Registriert: Donnerstag 21. September 2006, 10:07
Wohnort: Oberösterreich

@BlackJack: Danke. Darf ich das so verstehen: ich lade ein Bild und habe dann ein Bild-Objekt, an dem ich die Methode ".encode("bas64") aufrufen kann und ich bekomme dann da Buchstabengewusel zurück? Interessant. Wenn meine Vermutung stimmt: welche Art von Bilder kann/muss ich laden. Aus PIL oder wx oder ist es egal?

@mathi: es funktioniert auf Ubuntu Linux 8.10 auch (Bild mit 16x16 und 32x32 Pixel skaliert).
Dein Vista scheint der Grund zu sein...
Gruß!
BlackJack

Du lädst ein Bild, aber das ist kein Bildobjekt, sondern eine Zeichenkette mit dem Inhalt der Datei. `encode()` ist ja eine Methode auf `str`. Wenn man das aus dem Quelltext oben mal dekodiert:

Code: Alles auswählen

In [195]: a.decode('base64')[:10]
Out[195]: '\x89PNG\r\n\x1a\n\x00\x00'
Das ist also einfach der Inhalt einer PNG-Datei. Und da dürfte alles gehen was `wx` auch aus einer Datei laden würde.
Benutzeravatar
C4S3
User
Beiträge: 292
Registriert: Donnerstag 21. September 2006, 10:07
Wohnort: Oberösterreich

BlackJack hat geschrieben:Du lädst ein Bild, aber das ist kein Bildobjekt, sondern eine Zeichenkette mit dem Inhalt der Datei.
O.K. das habe ich, denke ich, verstanden. Aber welchen Mechanismus benutze ich zum laden? Wie kann ich das Bild als Zeichenkette laden? Das entzieht sich meinem Verständnis.
(Entschuldigung, dass dies nun so weit vom Thema weg ist...)
Gruß!
BlackJack

@C4S3: Datei im Binärmodus zum lesen öffnen, Inhalt einlesen, Datei schliessen.

Code: Alles auswählen

In [199]: f = open('test.png', 'rb')

In [200]: a = f.read()

In [201]: f.close()

In [202]: a[:10]
Out[202]: '\x89PNG\r\n\x1a\n\x00\x00'

In [203]: print a.encode('base64')
iVBORw0KGgoAAAANSUhEUgAAAgAAAADmCAYAAACj+j1MAAAkp0lEQVR4nGL89f/r/3cMdxju33nE
MApGwSgYBaNgFIyC4Q+q8zoZAAAAAP//YnnHcIdhxfz1A+2WUTAKRsEoGAWjYBTQEQAAAAD//2Ia
7fmPglEwCkbBKBgFIw8AAAAA//9iQRc4degSA+t/XgZ+fn6GP3/+MDBwfmNQ01bAa8ir528ZHl5/
x/Dj70cGW1cTWrl1FIyCUTAKRsEIBb9+/mL49es3BP/8zfAbif3r12+G379+wdm/fv1m+I3Ehqj/
...
mathi
User
Beiträge: 314
Registriert: Dienstag 27. November 2007, 14:30

C4S3 hat geschrieben:Hallo mathi!

Kannst du mir das noch näher erklären?
Beide Monitore auf der gleichen Maschine (Dualhead)? Oder auf unterschiedlichen Maschinen/Systemen?
selbes Betriebssystem(Vista 64), aber unterschiedliche Rechner(mit fast identischer Hardware)
Hast du schon versucht, in Zeile 57 das Icon anders zu skalieren? Hier auf WindowsXP SP3 mit Dualhead funktioniert es auch noch mit 32x32 problemlos (das ist jetzt nur ein Schuss ins Blaue).
habe ich jetzt probiert, aber leider hat es keine Auswirkung
Erzähl doch mal ein bisschen mehr...

Verwendest du in deiner App auch PyEmbeddedImage() oder eine andere Methode? Vielleicht liegt es ja daran?
?? ich habe doch in Zeile 4 PyEmbeddedImage importiert ??
Und: wie bekommst du das Buchstabengewusel eigentlich hin? Ich meine welches Programm benutzt du, um aus einem Bild DAS zu generieren (ich finde das nämlich ungemein praktisch)?
es gibt ein Tool (py2img) das aus einer jpg Pythoncode macht ...

Ich denke schon, dass es an der Auflösung liegt, leider weiß ich nicht, wie ich es auflösungsunabhängig schaffen kann.
Benutzeravatar
C4S3
User
Beiträge: 292
Registriert: Donnerstag 21. September 2006, 10:07
Wohnort: Oberösterreich

ich habe doch in Zeile 4 PyEmbeddedImage importiert
Ja, aber in der originalen Anwendung machst du es vielleicht anders. Das meinte ich. Vielleicht liegt es daran.

@BlackJack: Vielen Dank für die Erklärung. Die Schleier lichten sich. :P
Gruß!
mathi
User
Beiträge: 314
Registriert: Dienstag 27. November 2007, 14:30

Ja, aber in der originalen Anwendung machst du es vielleicht anders. Das meinte ich. Vielleicht liegt es daran.
nein, der Code spiegelt (gekürzt) meine Anwendung wider.
mathi
User
Beiträge: 314
Registriert: Dienstag 27. November 2007, 14:30

ich möchte nochmal um Hilfe bitten, das Problem besteht noch und ich habe keine Idee für einen Lösungsansatz.....
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Hallo mathi!

Dieses Einbetten der Bilder in den Python-Code ist ein riesen Sche...
Versuche es auf beiden Betriebssystemen mit einem normalen Icon oder PNG, welches du ganz normal als Datei lädst. Funktioniert es dann?

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
mathi
User
Beiträge: 314
Registriert: Dienstag 27. November 2007, 14:30

Hallo,

danke für die Antwort, mit ...

Code: Alles auswählen

self.SetIcon(wx.Icon('ST.ico',wx.BITMAP_TYPE_ICO))
fuktioniert es.

Meine Prämisse ist, dass das Programm in einer .exe läuft, daher sollte das Icon irgendwie mit in den Code, sind ja nur ein paar Zeilen.


ich habe mal den obigen Code etwas vereinfacht:

aus

Code: Alles auswählen

        #Icon 
        img = wx.ImageFromBitmap(icon_stream.GetBitmap()) 
        img.Rescale(16, 16) 
        bmp2 = wx.BitmapFromImage(img) 
        bmp2.SetMaskColour(wx.BLUE) 
        icon = wx.IconFromBitmap(bmp2) 
        self.SetIcon(icon)
mache

Code: Alles auswählen

        img = icon_stream.GetImage()
        self.SetIcon( wx.IconFromBitmap(img.Rescale(32, 32).ConvertToBitmap()))
naja es hat sich ja praktisch nichts geändert, also hats auch nicht geholfen :-(
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

mathi hat geschrieben:Meine Prämisse ist, dass das Programm in einer .exe läuft, daher sollte das Icon irgendwie mit in den Code, sind ja nur ein paar Zeilen.
Das kannst du nachher mit py2exe machen, dazu musst du den Kram nicht in den Quelltext einbinden.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
mathi
User
Beiträge: 314
Registriert: Dienstag 27. November 2007, 14:30

Leonidas hat geschrieben: Das kannst du nachher mit py2exe machen, dazu musst du den Kram nicht in den Quelltext einbinden.
Ich verwende den pyinstaller. Wie ist das einbetten möglich?
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

mathi hat geschrieben:Ich verwende den pyinstaller. Wie ist das einbetten möglich?
Mit der Kommandozeilenoption ``--icon``, wie im Manual beschrieben.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
mathi
User
Beiträge: 314
Registriert: Dienstag 27. November 2007, 14:30

Leonidas hat geschrieben: Mit der Kommandozeilenoption ``--icon``, wie im Manual beschrieben.
Ich kenne die Option, damit habe ich der .exe ein Icon zugeordnet, dass man damit auch das Icon für den Frame nutzen kann war mir neu.... gleich mal ausprobiert und ...es funktioniert nicht

edit: die Option ist allein für das Einbinden eines Icons für die Datei, nicht aber für den Frame möglich. Das merkt man aber erst, wenn man die *.ico im Ordner löscht.
mathi
User
Beiträge: 314
Registriert: Dienstag 27. November 2007, 14:30

Ich bin ja immernoch der Meinung es liegt am Auflösungsverhältnis....oder?
mathi
User
Beiträge: 314
Registriert: Dienstag 27. November 2007, 14:30

Also ich habe das Programm mal auf einem anderen Rechner mit 24" Monitor (aber Win XP) mit der gleichen Auflösung (16:9) laufen lassen, da hat es auch nicht funktioniert.... also liegt es definitiv an der Auflösung und nicht an Vista selbst !!!

Was ich aber nicht verstehe: wenn ich das Icon als Datei einbinde funktioniert es ja trotz der krummen Auflösung...?
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

mathi hat geschrieben:Was ich aber nicht verstehe: wenn ich das Icon als Datei einbinde funktioniert es ja trotz der krummen Auflösung...?
Hallo mathi!

Ein Icon (.ico) ist ein spezielles Dateiformat, welches mehrere Bilder in verschiedenen Größen enthalten kann. Ich kann mir vorstellen, dass beim Öffnen des Icons das passende Bild aus der Icon-Datei genommen wird. Ich kann mir auch vorstellen, dass das Bild beim Öffnen mit ``wx.Icon()`` irgendwie angepasst wird, damit es korrekt angezeigt werden kann. Was genau gemacht wird, ist sicherlich im Quellcode von wxPython ersichtlich. Aber mir fehlt die Motivation, diesen jetzt durchzusehen.

Diese Informationen oder Aufbereitungsschritte gehen natürlich verloren, wenn das Bild als "Image" oder "Bitmap" verarbeitet wird. Das Einfachste ist immer noch, eine Datei mit ``wx.Icon()`` zu öffnen und direkt zu verwenden. Dann muss man sich keine Gedanken mehr machen.

Nimm cx_freeze oder py2exe und liefere die zusätzlichen Dateien mit einem Setupprogramm aus. Das ist einfach und funktioniert (normalerweise). :-) --> http://www.python-forum.de/post-35092.html

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Antworten