Seite 1 von 2

[gelöst] Frame-Icon Problem

Verfasst: Mittwoch 4. Februar 2009, 08:00
von mathi
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()

Verfasst: Mittwoch 4. Februar 2009, 08:23
von C4S3
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)?

Verfasst: Mittwoch 4. Februar 2009, 09:46
von BlackJack
@C4S3:

Code: Alles auswählen

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

In [191]: _.decode('base64')
Out[191]: 'Buchstabengewusel'

Verfasst: Mittwoch 4. Februar 2009, 09:57
von C4S3
@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...

Verfasst: Mittwoch 4. Februar 2009, 10:19
von 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.

Verfasst: Mittwoch 4. Februar 2009, 10:26
von C4S3
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...)

Verfasst: Mittwoch 4. Februar 2009, 10:57
von 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/
...

Verfasst: Mittwoch 4. Februar 2009, 11:08
von mathi
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.

Verfasst: Mittwoch 4. Februar 2009, 11:24
von C4S3
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

Verfasst: Mittwoch 4. Februar 2009, 12:19
von mathi
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.

Verfasst: Donnerstag 12. Februar 2009, 06:59
von mathi
ich möchte nochmal um Hilfe bitten, das Problem besteht noch und ich habe keine Idee für einen Lösungsansatz.....

Verfasst: Donnerstag 12. Februar 2009, 10:01
von gerold
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
:-)

Verfasst: Freitag 13. Februar 2009, 07:57
von mathi
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 :-(

Verfasst: Freitag 13. Februar 2009, 09:57
von Leonidas
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.

Verfasst: Montag 16. Februar 2009, 08:49
von mathi
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?

Verfasst: Montag 16. Februar 2009, 11:45
von Leonidas
mathi hat geschrieben:Ich verwende den pyinstaller. Wie ist das einbetten möglich?
Mit der Kommandozeilenoption ``--icon``, wie im Manual beschrieben.

Verfasst: Montag 16. Februar 2009, 12:23
von mathi
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.

Verfasst: Montag 16. Februar 2009, 13:41
von mathi
Ich bin ja immernoch der Meinung es liegt am Auflösungsverhältnis....oder?

Verfasst: Mittwoch 18. Februar 2009, 13:13
von mathi
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...?

Verfasst: Mittwoch 18. Februar 2009, 14:07
von gerold
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
:-)