Hilfe, wo ist der Fehler?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
philipp
User
Beiträge: 3
Registriert: Montag 19. September 2005, 22:51

Hallo,
ich bin leider absoluter Anfänger in Python.
Möchte ein Programm schreiben, welches eine zufällige Zeile aus einer Datei liest und diese zurückgibt.
Leider klappt das nicht, irgendwie gibt die Funktion "wortwahl" den Wert nicht korrekt zurück! Wo liegt der Fehler?
Lacht ruhig über meine ersten Versuche, aber helft mir bitte.

Danke und Grüße,

Philipp

-----

from Tkinter import *
from random import *

global datei, wahlzeile, wahlnr

def dateiman(datei):
#öffnen wortdatenbank
f=open ("wortbank.txt", "r")
datei=f.readlines()
return datei

def wortwahl(datei,wahlzeile):
#auswahl wort
laenge=len(datei)-1
wahlnr=(randint(0, laenge))
print wahlnr
wahlzeile=datei[wahlnr].split("#")
print wahlzeile[0]
return wahlzeile, wahlnr

root=Tk()

dateiman(datei)
wortwahl(datei,wahlzeile)

print datei
print wahlnr
print wahlzeile[0]

root.label=Label(root, text=wahlzeile[0])
root.label.pack()
root.mainloop()



-----

In der Datei wortbank.txt steht z.B.

Apfel#m#
Birne#w#
Banane#w#
Ananas#w#
Haus#s#
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

- Packe deinen Code in code-Tags, sonst kann es keiner vernünftig lesen.
- Dann entferne gleich die *-Import, das führt nur zu Problemen.
- Warum importierst du überhaupt Tkinter, das ist irgendwie unnütz. Generell gilt: poste ein Minimalbeispiel, welches jeder ausprobieren und schnell überblicken kann. Das erhöht deine Chancen auf eine Antwort.
- Das es global gibt, solltest du gleich vergessen und aus deinem Code entfernen. Arbeite mit Parametern und Rückgabewerten.
- Wenn du eine Datei öffnest, dann schließe sie auch wieder.

Zu deinem Problem: die Parameter der Funktionen verdecken die globalen Namen. Da Dir das wahrscheinlich nicht sagen wird, solltest du noch einmal das offizielle Python-Tutorial durcharbeiten und den Code nach meinen Vorschlägen anpassen. Dann löst sich dein Problem vielleicht schon ganz von alleine.
Das Leben ist wie ein Tennisball.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

1. Vergiss, dass es die Sternchen-Importe gibt.
2. Vergiss, dass es ``global`` gibt.
3. Benutze code-tags ;)

4. Streich mal ``dateiman`` und uebernimm das in deine andere Funktion und schliesse die Datei dann auch, am besten in ``try ... finally`` oder gleich mit ``with`` (ab 2.6)

Und um das eigentliche Problem zu loesen muss man raten, gib doch mal an, was ``wortwahl`` denn enthaelt, dass er nicht korrekt ist hilft uns dabei nicht. Allerdings wuerde ich mal darauf tippen, dass deine globals da nicht unbeteiligt sind.
Benutzeravatar
bwbg
User
Beiträge: 407
Registriert: Mittwoch 23. Januar 2008, 13:35

Da ich gerade sowieso die Tasse Kaffee am Mann habe, hier ein paar "ausführbare" Anmerkungen:

Code: Alles auswählen

#!/usr/bin/env python
# coding: iso-8859-1

##>from Tkinter import *
##>from random import *

# Grundsätzlich keine *-importe. Es gibt nur ganz wenige Ausnahmen, wo das
# wirklich Sinn macht. Bei Tkinter empfielt sich ein 'import Tkinter as tk'
# Tkinter wird für das Minimalbeispiel (der Kern des Problems) nicht
# wirklich benötigt.

import random

##>global datei, wahlzeile, wahlnr

# Das selbe gilt für global.

##>def dateiman(datei):
##>   #öffnen wortdatenbank
##>    f=open ("wortbank.txt", "r")
##>   datei=f.readlines()
##>    return datei

# Diese Funktion macht keinen Sinn, sie bläht den Code nur unnötig auf.
# Weiterhin ist der Bezeichner 'datei' schlichtweg falsch. Es handelt es sich
# nicht um eine Datei, welche zurückgegeben wird, sondern um eine Liste mit
# den Textzeilen der Datei.

##>def wortwahl(datei,wahlzeile):
##>    #auswahl wort
##>    laenge=len(datei)-1
##>    wahlnr=(randint(0, laenge))
##>    print wahlnr
##>    wahlzeile=datei[wahlnr].split("#")
##>    print wahlzeile[0]
##>    return wahlzeile, wahlnr

# Die Funktionsbeschreibung / Dokumentation ('#auswahl wort') hättest du dir
# hier sparen können. Negativkommentierungsbeispiel mit Humor:
class Fleischwurst(object):
    '''Eine Wurst aus Fleisch'''
    pass

# Bei Klassen und Funktionen ist die erste Zeichenkette "welche so darsteht"
# die Dokumentation. Diese sollten das beschreiben, was die Funktion macht
# und/oder was sie erwartet und zurückgibt.

def main():
    '''Ausführbarer Code auf Modulebene ist nicht gerne gesehen. Er verhindert,
    dass man das Modul (die .py-Datei) vernünftig importieren kann. Daher
    verwendet man eine main-Funktion, um diesen Code aufzurufen. '''
    
    # Wortdatei öffnen und als einzelne Textzeilen einlesen.
    with open('wortbank.txt', 'r') as datei:
        # Hier ist datei wirklich eine Datei
        lines = datei.readlines()
    
    # Die Wörterdatenbank liegt nun Zeilenweise in 'lines' (eine Liste) vor.
    # Listenelemente können zufällig "herausgepickt" werden. Hierzu bietet
    # das Modul 'random' eine entsprechende Funktion an.
    zufalls_wahl = random.choice(lines)
    
    # Für eine Ausgabe muss die Textzeile nun noch zerlegt werden. Die
    # split-Methode (auf Strings/Zeichenketten) gibt ebenfalls eine Liste
    # zurück. Hier kann man ganz komfortabel auf die Mehrfachzuweisung
    # zurückgreifen:
    wort, geschlecht, dummy = zufalls_wahl.split('#')
    
    # Der dummy ist hier notwendig, da hier (aufgrund der Inhalte in
    # 'wortbank.txt' eine Liste mit drei Elementen zurückgegeben wird.
    # Eine alternative Möglichkeit wäre 'zufalls_wahl.split('#')[:2]'
    
    print 'Wort: %s (Geschlecht %s)' % (wort, geschlecht)


# Nur wenn die Datei direkt aufgerufen (gestartet) wird. Wird die main-Funktion
# aufgerufen.    
if __name__ == '__main__':
    main()

##>dateiman(datei)
##>wortwahl(datei,wahlzeile)

##>print datei
##>print wahlnr
##>print wahlzeile[0]

# Alle Tkinter-Aufrufe wurden von mir entfernt.
Im Grunde sind das alle Anmerkungen, die von den Vorpostern gemacht wurden zusammengefasst.

Grüße... Heiko
--
Jabber: bwbg@jabber.ccc.de
Antworten