[gelöst] Frame-Icon Problem

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

[gelöst] Frame-Icon Problem

Beitragvon mathi » Mittwoch 4. Februar 2009, 08:00

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

Beitragvon C4S3 » Mittwoch 4. Februar 2009, 08:23

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

Beitragvon BlackJack » Mittwoch 4. Februar 2009, 09:46

@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

Beitragvon C4S3 » Mittwoch 4. Februar 2009, 09:57

@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

Beitragvon BlackJack » Mittwoch 4. Februar 2009, 10:19

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

Beitragvon C4S3 » Mittwoch 4. Februar 2009, 10:26

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

Beitragvon BlackJack » Mittwoch 4. Februar 2009, 10:57

@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

Beitragvon mathi » Mittwoch 4. Februar 2009, 11:08

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

Beitragvon C4S3 » Mittwoch 4. Februar 2009, 11:24

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

Beitragvon mathi » Mittwoch 4. Februar 2009, 12:19

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

Beitragvon mathi » Donnerstag 12. Februar 2009, 06:59

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: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Beitragvon gerold » Donnerstag 12. Februar 2009, 10:01

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

Beitragvon mathi » Freitag 13. Februar 2009, 07:57

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 :-(
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Freitag 13. Februar 2009, 09:57

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 Modvoice
mathi
User
Beiträge: 314
Registriert: Dienstag 27. November 2007, 14:30

Beitragvon mathi » Montag 16. Februar 2009, 08:49

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?

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder