Seite 1 von 1

Seltsames Umlaut Problem

Verfasst: Donnerstag 28. Oktober 2004, 18:35
von mitsuhiko
Hallo Leute.
Ich habe jetzt einmal testweise einen HTML Editor mit wxPython geschrieben und er läuft auf meinem Laptop (WinXP) auch sehr gut.
Jetzt habe ich das Ganze auf dem PC (Windows2000) getestet (Beide Python23) und dort startet das Programm nicht.
Ich habe dann lange herungerätselt und bin dann draufgekommen, dass die Umlaute schuld sind.
Warum weiß ich nicht.
Hat jemand eine Erlkärung?

Code: Alles auswählen

# -*- coding: cp1252 -*-
# ---------------------------------------------------------------------------- #
# WX DemoEditor                                                                #
# (c) Copyright 2004 by Active-4 Software Developement                         #
# Code by Armin Ronacher <armin.ronacher@active-4.com>                         #
# ---------------------------------------------------------------------------- #

from wxPython.wx import *
from wxPython.iewin import *
import os
import sys

class mainframe(wxFrame):
    def __init__(self, *args, **kwds):
        """
        Erstellt die Komponenten, und ruft die Layout Funktionen auf
        """
        #Fenster erstellen
        kwds["style"] = wxCAPTION|wxMINIMIZE_BOX|wxMAXIMIZE_BOX|wxSYSTEM_MENU|wxSIMPLE_BORDER|wxRESIZE_BORDER
        wxFrame.__init__(self, *args, **kwds)
        
        #Notebook Komponente erstellen
        self.notebook = wxNotebook(self, 20, style=0)
        self.notebook_source = wxPanel(self.notebook, -1)
        self.notebook_html = wxPanel(self.notebook, -1)
        
        #Editorfeld
        self.editor = wxTextCtrl(self.notebook_source, -1, "", style=wxTE_MULTILINE | wxHSCROLL)
        
        #IE Komponente
        self.browser = wxIEHtmlWin(self.notebook_html, 20, style = wxNO_FULL_REPAINT_ON_RESIZE)
        
        #Menüleiste
        self.mframe_menubar = wxMenuBar()
        self.SetMenuBar(self.mframe_menubar)
        tmpmenu = wxMenu()
        #Datei Menü
        tmpmenu.Append(110, "Neu", "", wxITEM_NORMAL)
        tmpmenu.Append(120, "Öffnen", "", wxITEM_NORMAL)
        tmpmenu.Append(130, "Speichern", "", wxITEM_NORMAL)
        tmpmenu.Append(140, "Speichern unter", "", wxITEM_NORMAL)
        tmpmenu.AppendSeparator()
        tmpmenu.Append(150, "Beenden", "", wxITEM_NORMAL)
        self.mframe_menubar.Append(tmpmenu, "Datei")
        #Bearbeiten Menü
        tmpmenu = wxMenu()
        tmpmenu.Append(210, "Kopieren", "", wxITEM_NORMAL)
        tmpmenu.Append(220, "Ausschneiden", "", wxITEM_NORMAL)
        tmpmenu.Append(230, "Einfügen", "", wxITEM_NORMAL)
        self.mframe_menubar.Append(tmpmenu, "Bearbeiten")
        #Hilfe Menü
        tmpmenu = wxMenu()
        tmpmenu.Append(310, "Über", "", wxITEM_NORMAL)
        self.mframe_menubar.Append(tmpmenu, "Hilfe")

        #Layout Funktionen aufrufen
        self.__set_properties()
        self.__do_layout()
        self.__register_events()
        
        #Neue Datei erstellen
        self._newFile(1)
        self._setTitle()

    def __set_properties(self):
        """
        Setzt die Eigenschaften für die Komponenten
        """
        self.SetSize((600, 480))
        self.SetBackgroundColour(wxColour(250, 250, 250))
        self.SetFont(wxFont(10, wxMODERN, wxNORMAL, wxNORMAL, 0, "Tahoma"))
        self.editor.SetFont(wxFont(10, wxMODERN, wxNORMAL, wxNORMAL, 0, "Courier New"))

    def __do_layout(self):
        """
        Richtet die Komponenten in den Sizern aus
        """
        #Sizer erstellen
        s1 = wxBoxSizer(wxVERTICAL)
        s2 = wxGridSizer(1, 1, 0, 0)
        s3 = wxGridSizer(1, 1, 0, 0)
        
        #Komponenten montieren
        s3.Add(self.editor, 0, wxEXPAND, 0)
        s2.Add(self.browser, 0, wxEXPAND, 0)
        self.notebook_source.SetAutoLayout(1)
        self.notebook_source.SetSizer(s3)
        s3.Fit(self.notebook_source)
        s3.SetSizeHints(self.notebook_source)
        self.notebook_html.SetAutoLayout(1)
        self.notebook_html.SetSizer(s2)
        s2.Fit(self.notebook_html)
        s2.SetSizeHints(self.notebook_html)
        self.notebook.AddPage(self.notebook_source, "Quellcode")
        self.notebook.AddPage(self.notebook_html, "HTML Ansicht")
        s1.Add(wxNotebookSizer(self.notebook), 1, wxEXPAND, 0)
        self.SetAutoLayout(1)
        self.SetSizer(s1)
        self.Layout()
        
    def __register_events(self):
        """
        Weist den einzelnen Komponenten Events zu
        """
        #Datei Menü
        EVT_MENU(self, 110, self.__OnMenu)
        EVT_MENU(self, 120, self.__OnMenu)
        EVT_MENU(self, 130, self.__OnMenu)
        EVT_MENU(self, 140, self.__OnMenu)
        EVT_MENU(self, 150, self.__OnMenu)
        
        #Bearbeiten Menü
        EVT_MENU(self, 210, self.__OnMenu)
        EVT_MENU(self, 220, self.__OnMenu)
        EVT_MENU(self, 230, self.__OnMenu)
        
        #Hilfe Menu
        EVT_MENU(self, 310, self.__OnMenu)
        
        #Notebook
        EVT_NOTEBOOK_PAGE_CHANGED(self, 20, self.__OnBrowser)
        
        #Editor
        EVT_TEXT(self, 10, self.__OnEditor)
        
    def __OnBrowser(self, event):
        if (self.notebook.GetSelection() == 1):
            self.browser.Navigate(self.filename)
        
    def __OnEditor(self, event):
        self.changed = 1
    
    def __OnMenu(self, event):
        id = event.GetId();
        #Datei->Neu
        if (id == 110):
            self._newFile()
        #Datei->Öffnen
        if (id == 120):
            self._openFile()
        #Datei->Speichern
        if (id == 130):
            self._saveFile()
        #Datei->Speichern unter
        if (id == 140):
            self._saveFile(1)
        #Datei->Beenden
        if (id == 150):
            if (self.changed):
                dlg = wxMessageDialog(self, "Möchten sie Änderungen speichern?",
                                      "Demoeditor", wxYES_NO| wxCANCEL | wxICON_INFORMATION)
                ret = dlg.ShowModal()
                if (ret == wxID_YES):
                    self._saveFile()
                if (ret == wxID_NO):
                    self.Close()
                dlg.Destroy()
            else:
                self.Close()
        #Bearbeiten->Kopieren
        if (id == 210):
            self.editor.Copy()
        #Bearbeiten->Ausschneiden
        if (id == 220):
            self.editor.Cut()
        #Bearbeiten->Einfügen
        if (id == 230):
            self.editor.Paste()
        #Hilfe->Über
        if (id == 310):
            copytext = "Ein einfacher HTML Editor als wxPython Testprojekt\r\n" \
                       "(c) Copyright 2004 by Active-4 Software Developement\r\n" \
                       "Cody by Armin Ronacher\r\n\r\n";
            dlg = wxMessageDialog(self, copytext,
                                  "Demoeditor", wxOK | wxICON_INFORMATION)
            dlg.ShowModal()
            dlg.Destroy()
        
    # ------------------------------------------------------------------------ #
    def _newFile(self, overwrite=0):
        if (overwrite):
            self._clear()
        else: 
            if (not self.saved):
                dlg = wxMessageDialog(self, "Möchten sie Änderungen speichern?",
                                      "Demoeditor", wxYES_NO| wxCANCEL | wxICON_INFORMATION)
                ret = dlg.ShowModal()
                if (ret == wxID_YES):
                    self._saveFile()
                    self._clear()
                if (ret == wxID_NO):
                    self._clear()
                dlg.Destroy()
        
    def _clear(self):
        self.changed = 0
        self.saved = 0
        self.filename = "Unbenannt"
        save = 0
        self.editor.SetValue("")
        
    def _saveFile(self, saveas = 0):
        if (not self.saved or saveas):
            wildcard = "HTML Datei (*.html, *.htm)|*.html;*.htm|"\
                       "Alle Dateien (*.*)|*.*"
            dlg = wxFileDialog(self, "Datei speichern unter...", os.getcwd(), 
                               "", wildcard, wxSAVE )
            ret = dlg.ShowModal()
            if (ret == wxID_OK):
                self.filename = dlg.GetPath()
                cont = self.editor.GetValue()
                file(self.filename, "w").write(cont)
                self.changed = 0
                self.saved = 1
                self._setTitle()
            dlg.Destroy()

    def _openFile(self):
        save = 1
        if (not self.saved):
            save = 0
            dlg = wxMessageDialog(self, "Möchten sie Änderungen speichern?",
                                  "Demoeditor", wxYES_NO| wxCANCEL | wxICON_INFORMATION)
            ret = dlg.ShowModal()
            if (ret == wxID_YES):
                save = 1
            if (ret == wxID_NO):
                save = 1
            dlg.Destroy()
        if (save):
            wildcard = "HTML Datei (*.html, *.htm)|*.html;*.htm|"\
                       "Alle Dateien (*.*)|*.*"
            dlg = wxFileDialog(self, "Datei öffnen...", os.getcwd(), 
                               "", wildcard, wxOPEN )
            ret = dlg.ShowModal()
            if (ret == wxID_OK):
                self.filename = dlg.GetPath()
                cont = file(self.filename, "r").read()
                self.editor.SetValue(cont)
                self.changed = 0
                self.saved = 1
                self._setTitle()
            dlg.Destroy()

    def _setTitle(self):
        self.SetTitle("Demoeditor - "+self.filename);
        
class app(wxApp):
    def OnInit(self):
        wxInitAllImageHandlers()
        mframe = mainframe(None, -1, "")
        self.SetTopWindow(mframe)
        mframe.Show(1)
        return 1

if __name__ == "__main__":
    application = app(0)
    application.MainLoop()

Verfasst: Donnerstag 28. Oktober 2004, 18:45
von Dookie
Hi blackbird,

hmm ich kenn mich mit den verschiedenen windows-versionen ja nicht aus, aber hab da was dunkel in erinnerung, daß NT bzw 2000 doch schon unicode verarbeiten konnt?

Schau mal mit sys.getfilesystemencoding() welches dort verwendet wird. Allerdings müsste dann das Programm trotzdem laufen nur halt die Umlaute etwas seltsam ausschauen. Du könntest auch die Strings die Wx ausgeben soll mir einem vorangestellten u als Unicodestrings deklarieren. Also statt "Öffnen" u"Öffnen" z.B.


Gruß

Dookie

Verfasst: Donnerstag 28. Oktober 2004, 18:50
von mitsuhiko
Es sagt immer:

Code: Alles auswählen

sys:1: DeprecationWarning: Non-ASCII character '\xfc' in file C:\Python23\projec
ts\editor\editor.py on line 32, but no encoding declared; see http://www.python.
org/peps/pep-0263.html for details

Verfasst: Donnerstag 28. Oktober 2004, 18:56
von mitsuhiko
Problem gelöst.
Es liegt am PC selbst.
Ich habe Python neu installiert und jetzt funktioniert es.
Warscheinlich fehlte eine Datei.

Verfasst: Donnerstag 28. Oktober 2004, 18:57
von Dookie
aha das hättest auch gleich sagen können :!:
ist Editor.py Dein Script? Wenn ja sollte es schon passen da du ja ein Encoding angegeben hast.
Versuchen kannst Du es aber mal mit den beiden Zeilen am Scriptanfang:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: cp1252 -*-
Gruß

Dookie

Verfasst: Donnerstag 28. Oktober 2004, 19:04
von mitsuhiko
Dookie hat geschrieben:aha das hättest auch gleich sagen können :!:
ist Editor.py Dein Script? Wenn ja sollte es schon passen da du ja ein Encoding angegeben hast.
Versuchen kannst Du es aber mal mit den beiden Zeilen am Scriptanfang:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: cp1252 -*-
Gruß

Dookie
Die IDLE hängt automatisch ein #-*- coding: cp1252 an, wenn ein Umlaut vorkommt.