Umlaute in StaticFancyText

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

Hallo:

ich habe das Problem, dass ich einen Text mit Umlauten darstellen möchte, dies lässt aber StaticFancyText nicht zu. Ich habe jetzt nach Möglichkeiten gesucht im Hinblick darauf, dass es xml-konform sein muß - aber leider nichts gefunden:-(
Wie kann ich die Umlaute darstellen lassen??

Gruß Mathi

hier zum ausprobieren:

Code: Alles auswählen

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

import wx
import  wx.lib.fancytext as fa

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

class StaticFancyText(fa.StaticFancyText):
    """StaticFancyText with SetLabel function."""

    def SetLabel(self, label):
        bmp = fa.RenderToBitmap(label,
                wx.Brush(self.GetBackgroundColour(), wx.SOLID))
        self.SetBitmap(bmp)

class ErgebnisPanel(wx.Panel): 
    def __init__(self, parent): 
        wx.Panel.__init__(self, parent,style=wx.TAB_TRAVERSAL | wx.BORDER_RAISED) 

        # Ausgabe
        Ergebnis = StaticFancyText(self, -1, ' Ergebnis: ',pos=(10,10))
        self.Ergebnis1 = StaticFancyText(self, -1, 'test1',pos=(40,40))
        self.Freeze()
        self.Ergebnis1.SetLabel('Tüüüren')
        self.Thaw()
        self.Layout()

class Test(wx.Frame): 
    
    def __init__(self, parent = None,id=-1, title = "testframe", size = wx.Size(200, 200)): 
        wx.Frame.__init__(self, parent,id, title, size = size)

        #MainPanel
        main_panel = wx.Panel(self,-1)         
        vbox = wx.BoxSizer(wx.VERTICAL) 
        main_panel.SetSizer(vbox)

        #Ergebnispanel
        self.ergebnis_panel=ErgebnisPanel(main_panel)
        vbox.Add(self.ergebnis_panel, 1, wx.EXPAND)
        self.Show()
        

def main(): 
    """Main""" 
    app = wx.App() 
    f = Test() 
    f.Center() 
    f.Show() 
    app.MainLoop() 

if __name__ == "__main__": 
    main()
BlackJack

@mathi: Ich würde es mit Umlauten versuchen. Also Unicode und keine Byteketten.
mathi
User
Beiträge: 314
Registriert: Dienstag 27. November 2007, 14:30

mit

Code: Alles auswählen

from __future__ import unicode_literals
und

Code: Alles auswählen

self.Ergebnis1 = StaticFancyText(self, -1, '\u00FC',pos=(40,40)) # ü = U+00FC
kommt folgender Fehler:
self.Ergebnis1 = StaticFancyText(self, -1, '\u00FC',pos=(40,40))
File "C:\Python26\lib\site-packages\wx-2.8-msw-unicode\wx\lib\fancytext.py", line 395, in __init__
bmp = RenderToBitmap(text, background)
File "C:\Python26\lib\site-packages\wx-2.8-msw-unicode\wx\lib\fancytext.py", line 356, in RenderToBitmap
width, height, dy = GetFullExtent(str, dc, enclose)
File "C:\Python26\lib\site-packages\wx-2.8-msw-unicode\wx\lib\fancytext.py", line 346, in GetFullExtent
RenderToRenderer(str, renderer, enclose)
File "C:\Python26\lib\site-packages\wx-2.8-msw-unicode\wx\lib\fancytext.py", line 329, in RenderToRenderer
p.Parse(str, 1)
UnicodeEncodeError: 'ascii' codec can't encode character u'\xfc' in position 32: ordinal not in range(128)
also falsche Codierung, wie kann ich das in der Textzeile ändern, denn
# -*- coding: iso-8859-15 -*-
sollte doch richtig sein....??
ntrunk
User
Beiträge: 83
Registriert: Sonntag 7. September 2008, 23:09
Wohnort: Buchen (Odenwald)

Hi,
# -*- coding: iso-8859-15 -*-
das ist nur die Angabe für den Interpreter, welche Codierung dein Programmtext hat und hat mit deinem fancytext-Problem nichts zu tun.

Fancytext interpretiert diverse tags zur Schriftformatierung und rendert den Text dann auf ein Bitmap. Wenn du die Umlaute als XML-Entities (k.A. ob das auch offiziell so heißt) angibst, funktioniert es:

Code: Alles auswählen

self.Ergebnis1.SetLabel("Käfer")
Ob fancytext alle Unicodezeichen rendern kann, weiß ich nicht, für die Umlaute jedenfalls scheint es zu reichen :)

Gruß
Norbert

edit:
Ich sehe gerade, dass die Forensoftware das & maskiert. Hier nochmals in hoffentlich korrekter Form:
self.Ergebnis1.SetLabel("Käfer")
mathi
User
Beiträge: 314
Registriert: Dienstag 27. November 2007, 14:30

Danke für die Hilfe,
leider schaut das dann noch nicht gut aus:
Bild

kann es sein, dass ich das richtige "coding" jeweils im string angeben muß??

Gruß Mathi


P.S.: auch

Code: Alles auswählen

str1 = u'Käfer'
str1U = str1.encode("UTF-8")
self.Ergebnis1.SetLabel(str1U)
liefert das gleiche Ergebnis....
ntrunk
User
Beiträge: 83
Registriert: Sonntag 7. September 2008, 23:09
Wohnort: Buchen (Odenwald)

mathi hat geschrieben: kann es sein, dass ich das richtige "coding" jeweils im string angeben muß??
*Im* string? Wie soll das gehen? Ein string hat keine Ahnung von seiner evtl. vorhandenen Codierung.
mathi hat geschrieben: P.S.: auch

Code: Alles auswählen

str1 = u'Käfer'
str1U = str1.encode("UTF-8")
self.Ergebnis1.SetLabel(str1U)
liefert das gleiche Ergebnis....
Mach mal

Code: Alles auswählen

wx.SetDefaultPyEncoding("utf-8")
self.Ergebnis1.SetLabel(u"Käfer".encode("utf-8"))
Das führt bei mir zum gewünschten Ergebnis. Es sieht so aus, als ob fancytext nicht mit Unicode umgehen kann...
Dummerweise gibt es wohl kaum Doku zu fancytext im Netz. Eine Suche mit Google liefert lediglich eine rudimentäre Beschreibung, also bleibt da wohl nur noch ausprobieren. :?

Gruß
Norbert
Francesco
User
Beiträge: 824
Registriert: Mittwoch 1. Dezember 2004, 12:35
Wohnort: Upper Austria

Tut zwar nichts zur Sache, aber ich hasse Unicode. Deswegen gibt es nur englische Bezeichnungen bei den Scripts, die ich so mache (und keine Übersetzungen). :)

fancytext ist ohnehin in (wx)python implementiert. Vielleicht findest du (oder ihr) eine patch, den ihr gleich Robin Dunn schicken könnt? ;)
mathi
User
Beiträge: 314
Registriert: Dienstag 27. November 2007, 14:30

Danke an alle,

Code: Alles auswählen

wx.SetDefaultPyEncoding("utf-8")
self.Ergebnis1.SetLabel("Käfer")
liefert schon das richtige Ergebnis, vorausgesetzt man setzt nicht :

Code: Alles auswählen

from __future__ import unicode_literals

Gruß Mathi
laggflor
User
Beiträge: 8
Registriert: Mittwoch 17. September 2008, 21:32

mathi hat geschrieben:

Code: Alles auswählen

wx.SetDefaultPyEncoding("utf-8")
Danke hab ich auch gerade gesucht. Wieso steht das nirgends auf der wxPython Seite?

LG Florian. :D
Antworten