2 Variablen nutzen.

Fragen zu Tkinter.
Antworten
Valentin KS
User
Beiträge: 10
Registriert: Samstag 12. Dezember 2020, 14:28
Wohnort: Kassel

Hallo zusammen,
da ich mich entschlossen habe Python zu lernen steh ich jetzt vor einer Hürde.
Das Script an dem ich sitze soll ein Spiel sein bei dem man ein Wort erraten muss wie bei Galgenmännchen.
Die zu erratenden Worte werden dabei aus einer Datei ausgelesen. Es soll auch die Sprache gewechselt werden können.
Soweit funktioniert das Programm.
Als nächstes wollte ich eine Möglichkeit einbauen um die Länge der wählen zu können. Dabei stehe ich jetzt vor der Hürde
das nicht mehr die Datei eingelesen wird sondern die Länge. (wenn ich die Zeile #1 deaktiviere läuft das Programm wieder
aber ohne die Wiedergabe des Wertes für die Länge.

Was hab ich vergessen. Wie schaffe ich es das ich für beide Auswahlmöglichkeiten einen Wert zurück bekomme.
(Die ganzen Print angaben dienen nur dem Einblick um zu sehen was ab wo ausgegeben wird.

Danke schonmal für die Hilfe.

Code: Alles auswählen

import random
from tkinter import *

class Wortgenerator:
  def __init__ (self, datei): 
    self.wortliste=[]
    self.laenge=[]
    laenge=self.laenge
    print("wg: "+str(datei))
    f=open(datei,'r')
    liste=f.read().split()
    f.close()
    for wort in liste:
      if wort.isalpha()and len(wort)>5:
        self.wortliste.append(wort.upper())

    print("laenge 1: "+str(laenge))
    print("laenge 2: "+str(self.laenge))
    #print(self.wortliste) # liefert die komplette Datei
    print("Datei: "+datei) # Gibt die ausgewählte Datei zurück.
    print("Datei??:"+datei)
    print("l: "+str(laenge))

  def getWort(self):
    return random.choice(self.wortliste)

# Auswahl der Sprache bzw. der verwendeten Datei  

class Sprache:
  def __init__(self, master):
    self.master=master
    self.rahmen=Frame()
    self.datei=StringVar()
    self.deutschRadio=Radiobutton(self.rahmen,
                            value='clavigo.txt',
                            text="deutsch",
                            variable=self.datei)
    self.englRadio=Radiobutton(self.rahmen,
                              value='INNOCENTS ABROAD.txt',
                              text="english",
                              variable=self.datei)
    self.testRadio=Radiobutton(self.rahmen,
                              value='test.txt',
                              text="test",
                              variable=self.datei)
    self.deutschRadio.select() # Wählt die Sprache beim Start
    self.deutschRadio.pack()
    self.englRadio.pack()
    self.testRadio.pack()
    self.wg=Wortgenerator(self.datei.get())

  def getDatei(self):
    return self.datei.get()
  
  def neuerWG(self):
    self.wg=Wortgenerator(self.datei.get())

# Auswahl der Laenge der abgefragten Worte 

class Laenge:
  def __init__(self, master):
    self.master=master
    self.rahmen=Frame()
    self.laenge=StringVar()
    laenge=self.laenge
    self.vierRadio=Radiobutton(self.rahmen, indicatoron=0,
                                 value='4',
                                 text="4er",
                                 variable=self.laenge)
    self.fuenfRadio=Radiobutton(self.rahmen, indicatoron=0,
                                 value='5',
                                 text="5er",
                                 variable=self.laenge)
    self.sechsRadio=Radiobutton(self.rahmen, indicatoron=0,
                                 value='6',
                                 text="6er",
                                 variable=self.laenge)
    self.vierRadio.select()
    self.vierRadio.pack()
    self.fuenfRadio.pack()
    self.sechsRadio.pack()
    self.wg=Wortgenerator(self.laenge.get())
   
    print("self.laenge: " +str(self.laenge))
    print("lang: " +str(laenge))
    
  def laenge(self):
    return self.laenge.get()
    laenge=self.laenge.get()
    lang=self.laenge.get
    self.wg=Wortgenerator(self.laenge.get())	#1

  print("A: "+str(laenge))
  #print("self.laenge 1: " +str(self.laenge))
  print("lang 3: " +str(laenge))


class NeuButton:
  def __init__(self,master,punkte,sprache,ausgabe):
    self.ausgabe=ausgabe
    self.punkte=punkte
    self.sprache=sprache
    #self.sprache=laenge
    self.button=Button(master,
                       text="Neu",
                       command=self.neuesSpiel)

  def neuesSpiel(self):
    self.sprache.neuerWG()
    self.punkte.setPunkte(20)
    self.ausgabe.neuesWort()


class Punkte:
  def __init__(self, master, p):
    self.punkte=p
    self.label=Label(master, bg='yellow',
                     text=str(p), font=('Arial',20))

  def aktualisiere(self, wert):
    self.punkte+=wert
    self.label.config(text=str(self.punkte))

  def setPunkte(self, punkte):
    self.punkte=punkte
    self.label.config(text=str(self.punkte))


class Ausgabe:
  def __init__(self, master,sprache):
    self.sprache=sprache
    self.laenge=sprache
    self.wort=self.sprache.wg.getWort()
    self.ausgabe=len(self.wort)*"-"
    self.label=Label(master, bg='white',
                     text=self.ausgabe, font=('Courier',20))

    print("1. Lösung: " +str(self.wort))

  def neuesWort(self):
    self.wort=self.sprache.wg.getWort()
    self.ausgabe=len(self.wort)*"-"
    self.label.config(text=len(self.wort)*"-")

    print("Lösung Neu: " +str(self.wort))

  def aktualisiere(self, wort):
    self.ausgabe=wort
    self.label.config(text=wort)


class OKButton:
  def __init__(self, master, eingabe, ausgabe, punkte, wortgenerator):
    self.eingabe=eingabe
    self.ausgabe=ausgabe
    self.punkte=punkte
    self.wg=wortgenerator
    self.button=Button(master,
                       text="OK",
                       command=self.pruefe)
    
       
  def pruefe(self):  
    z=self.eingabe.get().upper()
    ausgabeliste=list(self.ausgabe.ausgabe)
    self.eingabe.delete(0)
    if z in self.ausgabe.wort and z not in self.ausgabe.ausgabe: 
      # Ausgabe aktualisieren und Pluspunkte
      for i in range(len(self.ausgabe.wort)):
        if self.ausgabe.wort[i]==z:
          ausgabeliste[i]=z
      self.ausgabe.aktualisiere(''.join(ausgabeliste))
      self.punkte.aktualisiere(1) 
      # Wenn Wort vollständig, erzeuge neues Wort
      if "-" not in self.ausgabe.ausgabe:
        self.button.after(2000, self.ausgabe.neuesWort)
        self.punkte.aktualisiere(5)
    else: self.punkte.aktualisiere(-1) 

    print(z) # Gibt alle Eingaben wieder
    print(self.ausgabe.ausgabe) # Gibt die richtigen Eingaben wieder
    

class Spiel:
  def __init__ (self):
    self.fenster=Tk()
    self.sprache=Sprache(self.fenster)
    self.laenge=Laenge(self.fenster)
    self.titel=Label(self.fenster,
                     text="Wörterraten", font=('Arial',20))
    self.labelEingabe=Label(text="Buchstabe:")
    self.punkte=Punkte(self.fenster,20)
    self.ausgabe=Ausgabe(self.fenster, self.sprache)
    self.neu=NeuButton(self.fenster, self.punkte, self.sprache, self.ausgabe)
    self.eingabe=Entry(self.fenster, width=2,
                       font=('Arial',20))
    self.ok=OKButton(self.fenster, self.eingabe, self.ausgabe,
                     self.punkte, self.sprache.wg)
    self.layout()
  print("Länge Spiel: "+str(Laenge)) # Wenn 1 Tab weiter anzeige erst nach beenden

  def layout(self):
    self.titel.grid(column=0,row=0,columnspan=2)
    self.punkte.label.grid(column=3, row=0)
    self.ausgabe.label.grid(column=0,row=1,columnspan=4)
    self.sprache.rahmen.grid(column=0,row=2,padx=10)
    self.laenge.rahmen.grid(column=0, row=3,padx=10)
    self.neu.button.grid(column=1,row=2)
    self.eingabe.grid(column=2,row=2,padx=20)
    self.eingabe.focus_set()
    self.ok.button.grid(column=3,row=2)
    self.fenster.mainloop()

    

spiel=Spiel()

Sirius3
User
Beiträge: 18289
Registriert: Sonntag 21. Oktober 2012, 17:20

Benutze keine *-Importe, weil man damit unkontrolliert Namen in den eigenen Namensraum schaufelt und nicht mehr nachvollziehen kann, woher was kommt.
Eingerückt wird immer mit 4 Leerzeichen pro Ebene, nicht 2. Das ist zu wenig.
Variablennamen, Funktionen und MEthoden werden komplett klein geschrieben.
Strings werden nicht mit + und str erzeugt, sondern mit Formatstrings.
In `Wortgenerator` wird laenge gar nicht verwendet.
Dateien öffnet man mit dem with-Statement.
In `Laenge` rufst Du `Wortgenerator` mit einer Länge auf, obwohl das als Argument doch einen Dateinamen erwartet. Das kann nicht funktionieren.
`return` springt sofort aus der Funktion, alles was danach steht, wird nicht mehr ausgeführt.
Die `print` auf der Klassenebene sollten da nicht stehen.
Die Klasse `NeuButton` macht so keinen Sinn, das ist eigentlich ein ganz normaler Knopf, der halt Aktionen beim Klick ausführt. Für `OKButton` gilt das selbe. Ob man `Punkt` und `Ausgabe` als Klasse braucht, ist auch fraglich.
__init__ ist dazu da, ein Objekt zu initialisieren, nicht dass das ewig läuft, das `mainloop` darf also nicht bereits beim Initialisieren aufgerufen werden.
Dass Du in `layout` auf Attribute von Attributen zugreifst, zeigt auch, dass die oben genannten Klassen nicht wirklich eigenständige Klassen sind.
Valentin KS
User
Beiträge: 10
Registriert: Samstag 12. Dezember 2020, 14:28
Wohnort: Kassel

Danke,
da der Aufbau, bis auf die laenge, aus dem Python Praxisbuch stammt frag ich mich jetzt ob das Buch noch Sinn macht.
Die Print angaben sind, wie oben erwähnt, nur dazu da um zusehen was wann ausgegeben wird.

Welches Werk empfiehlt sich denn am ehesten um in Python einzusteigen?
Benutzeravatar
Dennis89
User
Beiträge: 1575
Registriert: Freitag 11. Dezember 2020, 15:13

Hallo,

für den Einstieg in Python empfiehlt es sich das offizielle Python-Tutorial durchzuarbeiten https://docs.python.org/3/tutorial/index.html

Am Anfang solltest du auf GUI's verzichten. Wenn du die Objektorientierte Programmierung verstanden hast, dann kannst du mit grafischen Oberflächen anfangen.

Über dieses Buch habe ich schon positives in einem anderen Forum gehört. https://effectivepython.com/


Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
Antworten