Seite 1 von 1

utf8 äöü funktoniert nicht richtig

Verfasst: Mittwoch 17. September 2008, 08:51
von Quemo
Hallo.
Habe eine frage. Ich habe ein Programm angefangen zu schreiben, aber irgendwie geht das nicht richtig mit utf8

hier der code:

Code: Alles auswählen

#!/usr/bin/python

# -*- coding: utf-8 -*-

# Improtieren der Module

import sys

import cPickle

import time

import os



""" 

    Name: GetContact

    Version: 0.0.1 PreAlpha

    

    This program is free software; you can redistribute it and/or

    modify it under the terms of the GNU General Public License

    as published by the Free Software Foundation; either version 3

    of the License, or (at your option) any later version.

    This program is distributed in the hope that it will be useful,

    but WITHOUT ANY WARRANTY; without even the implied warranty of

    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the

    GNU General Public License for more details.

    

    You dont have a copy of the GNU GPL - dont care about it, 

    we think you know what GPL means ;)

"""



class Adressbuch(object):



    def __init(self):

        pass

    

    def main_loop(self):

        while True: #Programmschleife welche das menue immer wieder aufruft....

            print """ Was wollen sie tun?

            (1) Adressbuch Anzeigen

            (2) Neuen Kontakt anlegen 

            (3) Kontaktinformationen bearbeiten

            (4) Kontakt löschen

            (0) Programm beenden"""

        

            eingabe = int(raw_input("Geben Sie eine Zahl ein!"))

            if eingabe == 1:

                print "Sie haben 1 gewählt..."

            elif eingabe == 2:

                print "Sie haben 2 gewählt..."

            elif eingabe == 3:

                print "Sie haben 3 gewählt..."

            elif eingabe == 4:

                print "Sie haben 4 gewählt..."

            elif eingabe == 0:

                exit()

            else:

                print "Falsche Eingabe."

                

    def eintrag_neu(self):

        pass

    

    def anzeigen(self):

        pass

    

    def eintrag_entfernen(self):

        pass

        

    def kontakt_edit(self):

        pass

        

    def kontakt_suche(self):

        pass

    def _kontakt_(self):
        """

        Diese Klasse steht für einen Kontakt.
        Hier werden alle informationen zwischengespeichert.
        Nachher werden sie mit cPickle in eine Datei gespeichert.

        """
        self.kontakt_vorname = ""

        self.kontakt_nachname = ""

        self.kontakt_land = ""

        self.kontakt_ort = ""

        self.kontakt_strasse = ""

        self.kontakt_hausnummer = ""

        self.kontakt_festnetz_nummer = ""

        self.kontakt_handy_nummer = ""

        self.kontakt_email = ""

        self.kontakt_jabber = ""





# Globale Variabeln

name = "Kontaktmanager"

version = "0.0.1 PreAlpha"

line = "-------------------------"



# Willkommensscreen

print line

print "", name, version

print line





if __name__ == "__main__":

    Adressbuchlistenobjekt = Adressbuch()
    Adressbuchlistenobjekt.main_loop()
    



else:

    print "Dieses Modul ist nicht zum Importieren gedacht"
wiso geht das nicht mit utf8? hab ich was falsch gemacht?

PS: Wird mein erstes Programm.

Verfasst: Mittwoch 17. September 2008, 08:57
von CM
Hallo und willkommen im Forum,

wozu dienen die ganzen Leerzeilen?
  • a) um das Forum langsamer zu machen?
    b) um das Lesen zu erschweren?
    c) um den Interpreter zu verwirren?
    d) gilt a)-c) ?
;-)

Versuche mal die Leerzeilen vorm shebang und der Encoding-Zeile zu löschen. Funktionierts?

Gruß,
Christian

Verfasst: Mittwoch 17. September 2008, 09:07
von Quemo
oh sorry.. ich habs einfach kopiert.. im normalen python script hab ich die leerzeichen nicht...

wieso kann ich das nicht richtig kopieren?
muss ich da was beachten ?

Verfasst: Mittwoch 17. September 2008, 09:16
von Quemo
Reboot hilft immer ... ^^

http://paste.ubuntuusers.de/391999/ hier die richtige Version.

Das Problem besteht aber immer noch.

Die Ausgabe:

quemo@Quemo-1:~$ who i am
quemo pts/0 2008-09-17 10:17 (:0.0)
quemo@Quemo-1:~$ cd Desktop/dev/Python/
quemo@Quemo-1:~/Desktop/dev/Python$ ls
byteofpython_120.pdf getcontact.py getcontact.py~ tut-de-21.pdf
quemo@Quemo-1:~/Desktop/dev/Python$ python getcontact.py
-------------------------
Kontaktmanager 0.0.1 PreAlpha
-------------------------
Was wollen sie tun?
(1) Adressbuch Anzeigen
(2) Neuen Kontakt anlegen
(3) Kontaktinformationen bearbeiten
(4) Kontakt l�schen
(0) Programm beenden
Geben Sie eine Zahl ein!

Verfasst: Mittwoch 17. September 2008, 09:18
von BlackJack
Bitte im Wiki [wiki]Von Umlauten, Unicode und Encodings[/wiki]lesen und verstehen.

*Was* Quelltext tut sollte eigentlich aus dem Quelltext selber deutlich werden. So etwas wie ein Kommentar `Improtieren (sic) der Module` vor ``import``-Anweisungen ist überflüssig.

Die `__init()`-Methode muss `__init__()` heissen.

Benutzerschnittstelle und Programmlogik sollte man trennen. Kommunikation mit dem Benutzer gehört nicht in ein `Adressbuch`.

`_kontakt_()` ist ein eigenartiger Name und es ist eine Funktion bzw. Methode auf `Adressbuch`-Objekten und keine Klasse wie der Docstring suggeriert. Die Attribute in der Methode gehören auch nicht ans `Adressbuch` gebunden, sondern eher wirklich an ein Objekt, welches *eine* Adresse repräsentiert.

Ausführbaren Quelltext auf Modulebene ausser Definitionen von Konstanten, Funktionen, und Klassen sollte man vermeiden. Das sollte in einer `main()`-Funktion verschwinden. Konstanten bekommen per Konvention Namen, die komplett aus GROSSBUCHSTABEN bestehen. Klassennamen beginnen ebenfalls per Konvention mit einem Grossbuchstaben, alles andere mit Kleinbuchstaben.

Für Metainformationen wie Autor und Version sind auch die Namen `__author__` und `__version__` auf Modulebene verbreitet.

`Adressbuchlistenobjekt` sollte also mit einem Kleinbuchstaben beginnen. Ausserdem ist der Zusatz `objekt` überflüssig, weil *alles* was man in Python an Namen binden kann Objekte sind. Der Zusatz trägt also keinerlei Information, die man nicht auch ohne ihn hätte. Die `liste` würde ich auch weglassen und einfach `adressbuch` oder nur `adressen` nehmen. Das beschreibt ausreichend kurz, aber dennoch genau, welche Bedeutung das Objekt hat.

Das letzte ``else`` würde ich auch weglassen. Warum sollte man das Modul nicht importieren? Zum Beispiel um die einzelnen Komponenten zu testen, sich die Docstrings an zu schauen, ein weiteres Modul mit einer grafischen GUI zu den Objekten zu schreiben usw.

Verfasst: Mittwoch 17. September 2008, 09:22
von Quemo
Ich weiss das ich viele fehler habe.. Programmiere auch ncoh nicht lange... werde mal alles überarbeiten.

Danke für die schnellen Kommentare.

Quemo

Verfasst: Mittwoch 17. September 2008, 09:41
von Quemo
http://www.spongedpaste.com/index.php?l=a48251d4c1

Was kann ich jetzt noch verbessern? Gibt es noch grosse Fehler?

Verfasst: Mittwoch 17. September 2008, 10:29
von BlackJack
Mit `__name__` überschreibst Du das Attribut, das Python selber normalerweise auf den Namen des Moduls oder '__main__' setzt; so funktioniert das ``if __name__ == '__main__':``-Idiom nicht mehr, welches Du jetzt nicht mehr verwendest.

Die Zeichenkette ab Zeile 10 gehört vor die ``import``-Anweisungen. Eine Zeichenkette ist nur dann ein "docstring", wenn sie vor den Anweisungen steht.

`Kontakt.kontakt()` sollte `Kontakt.__init__()` heissen und die ganzen `kontakt_*`-Präfixe bei den Attributen sind überflüssig. Das es sich um einen Kontakt handelt wird ja schon dadurch deutlich, das es Attribute eine Exemplars der Klasse `Kontakt` sind. Es wäre auch vorteilhaft, wenn die Attribute nicht alle mit einer leeren Zeichenkette belegt werden, sondern man die Werte als Argumente übergeben kann.

Verfasst: Mittwoch 17. September 2008, 15:25
von sea-live
Das wird erst richtig interesant wenn du deine GUI in eine exe transportieren wilst

dann kommen die module so richtig in fahrt mit den umlauten

Verfasst: Mittwoch 17. September 2008, 15:30
von BlackJack
@sea-live: Du bist gerade auf einem "sinnlose Kommentare abgeben"-Trip, oder?

Verfasst: Mittwoch 17. September 2008, 15:35
von sea-live
nicht wirklich BlackJack

bin halt Basicianer!

Verfasst: Mittwoch 17. September 2008, 16:17
von Leonidas
sea-live hat geschrieben:bin halt Basicianer!
Das ist gerold auch, aber dem seine Kommentare sind nicht so überflüssig.

Und ja, Umlaute funktionieren in GUIs sehr, sehr gut. PyGTK und wxPython nutzen beide UTF-8, GTK selbst hat einen recht brauchbaren Renderer, Pango.

Verfasst: Mittwoch 17. September 2008, 18:32
von nemomuk
evtl. wäre eine Ausnahmebehandlung mit try..except bei int(raw_input("Geben Sie eine Zahl ein!")) von Vorteil:

Code: Alles auswählen

try:
     int(raw_input("Geben Sie eine Zahl ein!"))
except ValueError:
    print "Keine Zahl"

Verfasst: Mittwoch 17. September 2008, 18:52
von Quemo
SchneiderWeisse hat geschrieben:evtl. wäre eine Ausnahmebehandlung mit try..except bei int(raw_input("Geben Sie eine Zahl ein!")) von Vorteil:

Code: Alles auswählen

try:
     int(raw_input("Geben Sie eine Zahl ein!"))
except ValueError:
    print "Keine Zahl"
genau das will ich auch noch machen :D Neue Version kommt in ein paar Stunden.