Unicode Error bei wx.StaticText

Plattformunabhängige GUIs mit wxWidgets.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

sea-live hat geschrieben:aber das mit den Texten nur STATIC ist nicht schön
Hallo sea-live!

Das muss ich jetzt nicht verstehen, oder? Das Beispiel mit ``wx.StaticText`` ist ja von dir gekommen.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
sea-live
User
Beiträge: 440
Registriert: Montag 18. Februar 2008, 12:24
Wohnort: RP

gerold hat geschrieben:
sea-live hat geschrieben:aber das mit den Texten nur STATIC ist nicht schön
Hallo sea-live!

Das muss ich jetzt nicht verstehen, oder? Das Beispiel mit ``wx.StaticText`` ist ja von dir gekommen.

mfg
Gerold
:-)
Mir ging es rein darumm das es doch sinnvoll wäre in Python wenigstens
mal Fett andere Schriftart oder Grösser zu Schreiben in einem Frame Dialog oder der gleichen

einfach so wie in Tkinter oder wx.richText
warumm ist da nur Plain Text möglich gibt es dafür einen Plausiblen grund

Hintergrund mein Hauptprogramm ist nun in Tkinter wegen TEXT
das Unterprogramm in Frame und das wiederum ruft PyQ auf wegen stylings im calender

ist das bei den profies auch so das Module aus den verschiedenen Skriptsprachen kombiniert werden?
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

sea-live hat geschrieben:ist das bei den profies auch so das Module aus den verschiedenen Skriptsprachen kombiniert werden?
Es ist üblich, das man in einer Sprache auch Dinge verwendet die in anderen Sprachen geschrieben sind. Oder was meinst du eigentlich?
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

sea-live hat geschrieben:warumm ist da nur Plain Text möglich
Hallo sea-live!

Bitte schau dir doch noch mal die ganze wxPython-Demo an. Dort wird ja nicht unbedingt mit Formatierungen gezeizt. Und der Grund, weshalb der gesamte Text in einem wx.StaticText nur eine Schriftart haben kann, liegt schlicht und ergreifend darin zu suchen, dass dieses Ding genau dafür geschrieben wurde.

Wenn du Formatierungen willst, dann setze "wx.lib.fancytext" oder noch einfacher, "wx.lib.fancytext.StaticFancyText" ein. Suche einfach immer in der wxPython-Demo ob du dort etwas findest, was dem entspricht, was du haben möchtest.

mfg
Gerold
:-)

PS: "wxPython in Action" ;-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
sea-live
User
Beiträge: 440
Registriert: Montag 18. Februar 2008, 12:24
Wohnort: RP

DANKE DAS WARS

***wx.lib.fancytext***

was ich in den letzten Tagen gesucht hatte.!

Mercy Gerold
snakeseven
User
Beiträge: 408
Registriert: Freitag 7. Oktober 2005, 14:37
Wohnort: Berlin
Kontaktdaten:

Hallo nochmal,

auch wenn mir sea-live ein anderes Problem in mein Thema gemogelt hat :wink: , möchte ich doch nochmal auf mein Kodierungsproblem zurückkommen. Inzwischen funktioniert das, was bis gestern noch funktionierte, nicht mehr!? Warum weiß ich nicht :roll:

Hier der Programm-Code, welcher zu folgender Fehlermeldung führt:

Code: Alles auswählen

n = n.encode(systemencoding)
  File "C:\Programme\Python25\lib\encodings\cp1252.py", line 12, in encode
    return codecs.charmap_encode(input,errors,encoding_table)
UnicodeEncodeError: 'charmap' codec can't encode character u'\x84' in position 1: character maps to <undefined>

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: UTF-8 -*-

import os
import urllib2
import locale

workspace = os.getcwd()
systemencoding =  locale.getdefaultlocale()[1]

country_names = []
country_ids = []


def get_countrynames():
    url = 'http://topartists.myspace.com/index.cfm?fuseaction=music.topBands'
    
    connected = False
    try:
        u = urllib2.urlopen(url)
    except urllib2.URLError:
        pass
    else:
        try:
            source =  u.read()
            connected = True
        except:
            pass
        else:
            try:
                charset = get_charset(source)
            except:
                charset = ''
            if charset != '':
                try:
                    source = unicode(source, charset)   
                except:
                    pass
    
                    
    if connected:
        pos1 = source.find('</option><option value="AF">')
        if pos1 > 0: 
            pos2 = source.find('</select></td>',pos1)
            wholestring = source[pos1:pos2]
            wholestring = wholestring.replace('</option><option value=','%')
            wholestring = wholestring.replace('selected>','')
            wholestring = wholestring.replace('</option>','')
            ws = wholestring.split('%')

            savefile = []
            for n in ws:
                country_names.append(n[5:])
                country_ids.append(n[1:3])
                savefile.append(n[5:]+'%'+n[1:3])
            del country_names[0]
            del country_ids[0]
            del savefile[0]
            
            sf = ''
            for n in savefile:
                sf += n+'\n'
                
            d= open(workspace + "/countries.txt", "w")
            d.write(sf.encode(systemencoding))
            d.close()

            
            
def get_charset(code):
    pos1 = code.find('<meta')
    pos2 = code.find('charset=', pos1) + 8
    pos3 = code.find('"', pos2)
    charset = code[pos2:pos3]
        
    if charset not in ['utf-8','UTF-8','iso-8859-15','ISO-8859-15','iso-8859-1','ISO-8859-1']:
        charset = 'utf-8'
        
    return charset
    
    
get_countrynames()
Ich dachte, ich hätte alles so gemacht, wie mir empfohlen. Was reingeht in Unicode wandeln, was rausgeht in den Code, den das System zum Speichern verwendet.

Grüße,
Seven
Benutzeravatar
mkesper
User
Beiträge: 919
Registriert: Montag 20. November 2006, 15:48
Wohnort: formerly known as mkallas
Kontaktdaten:

snakeseven hat geschrieben:

Code: Alles auswählen

n = n.encode(systemencoding)
  File "C:\Programme\Python25\lib\encodings\cp1252.py", line 12, in encode
    return codecs.charmap_encode(input,errors,encoding_table)
UnicodeEncodeError: 'charmap' codec can't encode character u'\x84' in position 1: character maps to <undefined>
Ich dachte, ich hätte alles so gemacht, wie mir empfohlen. Was reingeht in Unicode wandeln, was rausgeht in den Code, den das System zum Speichern verwendet.
Nein, empfohlen ist, alles auch in Unicode zu speichern. Sonst fällst du mit eben diesem Fehler auf die Schnauze, falls ein Code nicht nach cp1252 umgewandelt werden kann.
Kurz: Alte Daten können in verschiedenen Formaten reinkommen, damit muß man leben und diese nach Unicode umwandeln. Vom Programm erzeugte Daten nur in Unicode (bzw. eben UTF-8, eine Art gepackte Darstellung von Unicode) abspeichern.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

mkallas hat geschrieben:Nein, empfohlen ist, alles auch in Unicode zu speichern.
Du kannst Unicode nicht einfach so speichern. Dazu musst du es so oder so enkodieren. Etwa in UTF-8. Aber: UTF-8 ist nicht Unicode - dieses Mißverständnis ist eben eines der Probleme mit Unicode.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
mkesper
User
Beiträge: 919
Registriert: Montag 20. November 2006, 15:48
Wohnort: formerly known as mkallas
Kontaktdaten:

Leonidas hat geschrieben:UTF-8 ist nicht Unicode - dieses Mißverständnis ist eben eines der Probleme mit Unicode.
So habe ich es auch nicht gesagt.
Wikipedia hat geschrieben:UTF-8 (Abk. für 8-bit Unicode Transformation Format) ist die am weitesten verbreitete Kodierung für Unicode-Zeichen.
snakeseven
User
Beiträge: 408
Registriert: Freitag 7. Oktober 2005, 14:37
Wohnort: Berlin
Kontaktdaten:

Hallo,

ich habe das Problem ja nicht nur beim Speichern (obwohl es an anderer Stelle, wo die geladenen Seiten UTF-8 sind, nicht auftritt, sogar Skandinavische Sonderzeichen werden da richtig gespeichert), sondern auch beim Darstellen in einer Listbox. Obwohl Unicode, kann wxPython einige Zeichen offenbar nicht richtig darstellen (ich habe die Unicode-Version installiert). Auch dieses Problem taucht nicht bei den Seiten auf, die UTF-8 sind. Erst seit MySpace mich auf ihren Deutschen Server umleitet, wo ISO-8859-15 verwendet wird, habe ich diesen Ärger.

Und in Unicode abspeichern geht auch nicht:

Code: Alles auswählen

d.write(sf)                          #.encode(systemencoding))
UnicodeEncodeError: 'ascii' codec can't encode characters in position 15-16: ordinal not in range(128)

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: UTF-8 -*-

import wx
import os
import urllib2
import locale

workspace = os.getcwd()
systemencoding =  locale.getdefaultlocale()[1]

country_names = []
country_ids = []


def get_countrynames():
    url = 'http://topartists.myspace.com/index.cfm?fuseaction=music.topBands'
    
    connected = False
    try:
        u = urllib2.urlopen(url)
    except urllib2.URLError:
        pass
    else:
        try:
            source =  u.read()
            connected = True
        except:
            pass
        else:
            try:
                charset = get_charset(source)
            except:
                charset = ''
            if charset != '':
                try:
                    source = unicode(source, charset)   
                    print type(source)
                except:
                    pass
    
                    
    if connected:
        pos1 = source.find('</option><option value="AF">')
        if pos1 > 0: 
            pos2 = source.find('</select></td>',pos1)
            wholestring = source[pos1:pos2]
            wholestring = wholestring.replace('</option><option value=','%')
            wholestring = wholestring.replace('selected>','')
            wholestring = wholestring.replace('</option>','')
            ws = wholestring.split('%')

            savefile = []
            for n in ws:
                country_names.append(n[5:])
                country_ids.append(n[1:3])
                savefile.append(n[5:]+'%'+n[1:3])
            del country_names[0]
            del country_ids[0]
            del savefile[0]
            
            #sf = ''
            #for n in savefile:
                #sf += n+'\n'
                
            #d= open(workspace + "/countries.txt", "w")
            #d.write(sf.encode(systemencoding))
            #d.close()
            
            Ausgabe()

            
            
def get_charset(code):
    pos1 = code.find('<meta')
    pos2 = code.find('charset=', pos1) + 8
    pos3 = code.find('"', pos2)
    charset = code[pos2:pos3]
        
    if charset not in ['utf-8','UTF-8','iso-8859-15','ISO-8859-15','iso-8859-1','ISO-8859-1']:
        charset = 'utf-8'
        
    return charset
    
    
    
class Ausgabe(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, None, -1, '', size=(250, 325))
        panel = wx.Panel(self, -1)
        self.lbcountry = wx.ListBox(panel, -1, (19, 19), (204, 173), country_names, wx.LB_MULTIPLE)
        
        self.Show()
        self.Center()



class MyApp(wx.App):
    def OnInit(self):
        get_countrynames()
        return True
   
   
app = MyApp(0)
app.MainLoop()
Update:
Unicode muss zum Speichern in utf-8 oder Latin-1 encodiert werden. (Python Cookbook S.51), da hat Leonidas Recht.
Das geht auch ohne Probleme. Lade ich das File dann aber zur Kontrolle wieder in SciTE und stelle SciTE auf utf-8, werden auch hier Umlaute und Sonderzeichen falsch dargestellt. Also ist der gespeicherte Text nicht utf-8 ?

Grüße,
Seven
snakeseven
User
Beiträge: 408
Registriert: Freitag 7. Oktober 2005, 14:37
Wohnort: Berlin
Kontaktdaten:

Problem gelöst:

Obwohl im Quelltext der Seiten ISO-8859-15 angegeben ist

Code: Alles auswählen

<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-15" />
, scheinen die Seiten nicht ISO-8859-15, sondern utf-8 zu sein.
Wenn ich beim Umwandeln in Unicode utf-8 einstelle, dann ist jedenfalls alles so, wie es sein soll.

Danke euch beiden für eure Mühe !

Grüße,
Seven
Antworten