Unterstriche ersetzen

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
loydi
User
Beiträge: 1
Registriert: Donnerstag 23. März 2017, 19:31

Code: Alles auswählen

striche = []
        strichestr = ""
        for i in range(zufall_wort_länge):
            striche.append(" _")
            strichestr = strichestr + "_"
        print(striche)
        print(strichestr)
        
        x=0
        while x == 0:
            buchstabe = str(entrybuchstabe.get())
            buchstabe = buchstabe.upper()
            entrybuchstabe.delete(0,END)
            for i in range(len(zufall_wort)):
                if buchstabe == zufall_wort[i]:
                    striche[i] = buchstabe
            del strichestr
            strichestr = '' .join(striche)
            
            print(striche)
            print(strichestr)
            return
Moin Leute, ich will mir bei dem Code unterstriche generieren lassen, die genauso lang sind wie ein Wort, welches vorher eingegeben wird(sieht man net im Code). Da dies als Gui läuft lasse ich mir einen Buchstaben, den der User angibt, einer Variable zuweisen. Dann wird der eingegebene Buchstabe anstelle des unterstrichs eingesetzt. Nun das Problem. Mein Programm erzeugt mit der While Schleife eine Endlos-Schleife, da buchstabe keinen neuen Wert bekommt. MeinProgramm hängt sich auf, sodass ich nichtmal nen neuen Wert eingeben kann. Also den Fehler habe ich gefunden, aber ich weiß nicht, wie ich es fixen kann.. Achso bin Python Anfänger, also bitte nicht böse nehmen, dass ich es nicht wie ein Profi beschreibe.
BlackJack

@loydi: Die ``while``-Schleife ist keine Endlosschleife weil da als letztes ein ``return`` drin steht das die Schleife ganz sicher verlassen wird. Womit die Schleife komplett sinnfrei ist, denn Schleifen sollen Code wiederholen, zumindest potentiell mehrfach. Eine Schleife deren Körper grundsätzlich genau einmal durchlaufen wird ist keine Schleife, denn das würde auch ganz normal ohne das ``while`` passieren.

Was Du da mit `striche` und `strichestr` veranstaltest ist redundant weil beide die gleichen Informationen enthalten.

``del strichestr`` sollte Weg, das macht keinen Sinn. Generell macht es kaum Sinn *Namen* zu löschen. Und schon gar nicht wenn man den eben gelöschten Namen gleich eine Zeile danach wieder durch eine Zuweisung erzeugt.

Falls `entrybuchstabe` ein Tk `Entry`-Objekt ist, macht es keinen Sinn den Rückgabewert von `get()` in eine Zeichenkette zu wandeln, denn das *ist* bereits eine.

Das `END` lässt einen *-Import vermuten: Nicht gut — Sternchen-Importe sind Böse™. Das `tkinter`-Modul wird üblicherweise beim Importieren zu `tk` umbenannt mit ``import Tkinter as tk`` oder ``import tkinter as tk`` und die Objekte darin dann über den `tk`-Namen referenziert, also `tk.END` im Falle von `END`.

Eine Liste mit `n` Unterstrichen als Zeichenketten als Inhalt kann man ganz einfach mit dem Multiplikationsoperator erstellen:

Code: Alles auswählen

In [3]: ['_'] * 10
Out[3]: ['_', '_', '_', '_', '_', '_', '_', '_', '_', '_']
Die Leerzeichen würde ich da auch nicht mit reinschreiben, denn die gehören ja nicht wirklich zu den Daten sondern sind nur für die Anzeige wichtig. Und für die Anzeige kann man aus der Liste mit der `join()`-Methode eine Zeichenkette machen und dabei auch die Leerzeichen dazwischen einfügen:

Code: Alles auswählen

In [4]: ' '.join(['_'] * 10)
Out[4]: '_ _ _ _ _ _ _ _ _ _'
``for``-Schleifen die über einen Laufindex gehen sind sowieso ”unpythonisch” weil man in Python *direkt* über die Elemente von Sequenzen wie Zeichenketten und Listen iterieren kann. Falls man *zusätzlich* einen Laufindex braucht, gibt es die `enumerate()`-Funktion. Wenn man über die Elemente von zwei Sequenzen ”parallel” iterieren möchte, gibt es die `zip()`-Funktion.

Statt Listen zu verändern, ist auch eher üblich eine neue Liste zu erstellen. Die „list comprehension“ ist da oft sehr hilfreich.

Code: Alles auswählen

In [5]: wort = 'Pythoninterpreter'.upper()

In [6]: anzeige = ['_'] * len(wort)

In [7]: buchstabe = 'e'.upper()

In [8]: anzeige
Out[8]: 
['_', '_', '_', '_', '_', '_', '_', '_', '_', '_', '_', '_', '_', '_', '_', '_', '_']

In [9]: anzeige = [w if a == '_' and w == buchstabe else a for a, w in zip(anzeige, wort)]

In [10]: ' '.join(anzeige)
Out[10]: '_ _ _ _ _ _ _ _ _ E _ _ _ E _ E _'
Wie man hier sieht ist `striche` auch kein guter Name, denn es bleibt ja nicht bei den Strichen.

Ein Kollege von Dir hat das hier auch gerade als GUI-Programm versucht und kam da nicht mit zurecht: viewtopic.php?f=1&t=40148

GUI ist nicht wirklich etwas für absolute Anfänger, denn da muss man eigentlich schon fast alles können was Python so bietet, inklusive objektorientierter Programmierung mit eigenen Klassen. Das andere Hangman ist letztlich daran gescheitert das es zu unübersichtlich wurde und man diesen grossen Haufen verwobenen Code mit Programmlogik *und* GUI vermischt, nicht sinnvoll testen kann. Also keine in sich geschlossenen Funktionen einzeln testen kann um Fehler zu finden.

Selbst wenn es am Ende mit GUI endet, solltest Du die eigentliche Spiellogik erst einmal ohne eine GUI schreiben und mit Funktionen und sinnvollen Datenstrukturen. Was dann auch bei Galgenmännchen/Hangman schon ohne GUI wohl schon mit einer Klasse endet. Denn den Zustand über mehrere, nicht zusammengefasste Variablen zu verteilen ist nicht wirklich schön.
Antworten