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#
Hilfe, wo ist der Fehler?
- 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.
- 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.
- 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.
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.
Da ich gerade sowieso die Tasse Kaffee am Mann habe, hier ein paar "ausführbare" Anmerkungen:
Im Grunde sind das alle Anmerkungen, die von den Vorpostern gemacht wurden zusammengefasst.
Grüße... Heiko
--
Jabber: bwbg@jabber.ccc.de
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.
Grüße... Heiko
--
Jabber: bwbg@jabber.ccc.de