Erneuerung des Textfeldes

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
Kalschnie
User
Beiträge: 2
Registriert: Donnerstag 28. Mai 2020, 16:06

Hi,
ich bin ein ziemlicher Neuling in Python und bin derzeit sehr Motiviert meine eigenen Programme zu schreiben. Bei einem meiner Programme komme ich allerdings nicht weiter. Aus diesem Grund würde ich mich über ein bisschen Hilfe freuen.
Es handelt sich um Folgendes Problem: Ich habe versucht ein Zufallsgenerator mit python insbesondere Tkinter zu programmieren, welches einem zufällige eines der Übungen aus der Sport_Liste ausgibt und in ein Tkinter fenster schreibt. Jedoch komme ich mit dem Wiederholen button nicht weiter, ich habe es schon mit einer While Schleife probiert, dies hat aber leider nicht funktioniert. Mein Ziel ist es das der Generator Zufällige eine Übung aussucht und diese dann in das Fenster überträgt, desweiterem soll man, wenn man den Wiederholenbutten drückt eine neue Übung bekommen. wie oben gesagt funktioniert dies leider nicht.
Hier das Programm:


import random
import tkinter as tk
import time
#Kalorien= 0
Sport= True
yes_list= ['yes', 'ja', 'y', 'j', 'Ja' , 'Yes' , 'y']
Sport_liste= ['Liegestütze 5x ', 'Liegestütze 10x', 'Kniebeuge 5X', 'Kniebeuge 10x','Planks 30s','Planks 10s', 'Hampelman 10x']
def wiederholen():
fenster.quit
Aufgabe=random.choice(Sport_liste)
text = tk.Label(master=fenster, text= Aufgabe)
text.config(font=('Arial', 72))
text.pack()

while Sport == True:
Aufgabe=random.choice(Sport_liste)

fenster=tk.Tk()
fenster.wm_geometry('800x480')
text = tk.Label(master=fenster, text= Aufgabe)
text.config(font=('Arial', 72))
text.pack()
B = tk.Button(master=fenster, text ="Wiederholen", command = wiederholen )
B.config( height = 5, width = 50 )
B.pack()
fenster.mainloop()
time.sleep(5)
fenster.quit


#if Aufgabe == 'Liegestütze 5x ':
# Kalorien += 1
#if Aufgabe == 'Liegestütze 10x ':
# Kalorien += 2
#if Aufgabe == 'Kniebeuge 5X':
# Kalorien += 1
#if Aufgabe == 'Kniebeuge 10x':
# Kalorien += 1
#if Aufgabe == 'Planks 30s':
# Kalorien += 1
#if Aufgabe == 'Planks 10s':
# Kalorien += 1
#if Aufgabe == 'Hampelman 10x':
# Kalorien += 1

Nicht wundern, der nächste Schritt soll sein, dass man sich am ende noch die Kalorien anzeigen lassen soll.
Vielen Dank :D
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

Das ist das Problem, wenn man als Anfänger gleich mit GUIs anfängt. Denn dort muß man komplett umdenken, weil es keinen Roten Faden des Programmablaufs gibt, sondern man Ergeignisse verarbeiten muß.
Also kann man keine Schleifen benutzten.
Mit `fenster.quit` das Fenster schließen zu wollen und DANACH das Label bestücken, ist doch ziemlicher Quatsch. Zum Glück rufst Du quit ja gar nicht auf.

Wenn man noch keine Fnktionen beherrscht und auch keine Klassen, dann sind GUIs definitiv noch zu früh.

Code: Alles auswählen

import random
import tkinter as tk
from functools import partial

SPORTARTEN = ['Liegestütze 5x ', 'Liegestütze 10x', 'Kniebeuge 5X', 'Kniebeuge 10x','Planks 30s','Planks 10s', 'Hampelman 10x']

def wiederholen(text):
    text['text'] = random.choice(SPORTARTEN)

def main():
    fenster = tk.Tk()
    text = tk.Label(master=fenster, text="Start", font=('Arial', 72))
    text.pack()
    tk.Button(master=fenster, text="Wiederholen",
        command=partial(wiederholen, text)).pack()
    fenster.mainloop()

if __name__ == '__main__':
    main()
Kalschnie
User
Beiträge: 2
Registriert: Donnerstag 28. Mai 2020, 16:06

Sirius3 hat geschrieben: Donnerstag 28. Mai 2020, 19:03 Das ist das Problem, wenn man als Anfänger gleich mit GUIs anfängt. Denn dort muß man komplett umdenken, weil es keinen Roten Faden des Programmablaufs gibt, sondern man Ergeignisse verarbeiten muß.
Also kann man keine Schleifen benutzten.
Mit `fenster.quit` das Fenster schließen zu wollen und DANACH das Label bestücken, ist doch ziemlicher Quatsch. Zum Glück rufst Du quit ja gar nicht auf.

Wenn man noch keine Fnktionen beherrscht und auch keine Klassen, dann sind GUIs definitiv noch zu früh.



Vielen Dank für deine Antwort, ich habe mir deine Lösung angeschaut und mir ist Aufgefallen dass ich noch einiges Lernen muss :geek: . Ich habe mich aber auch nochmal mit einem Freund hingesetzt und mir mein altes Programm angschaut und eine weitere Lösung gefunden:
import random
import tkinter as tk
import time

Sport= True
yes_list= ['yes', 'ja', 'y', 'j', 'Ja' , 'Yes' , 'y']
Sport_liste= ['Liegestütze 5x ', 'Liegestütze 10x', 'Kniebeuge 5X', 'Kniebeuge 10x','Planks 30s','Planks 10s', 'Hampelman 10x']
def wiederholen():
Aufgabe1=random.choice(Sport_liste)
text.config(text=Aufgabe1)


Aufgabe=random.choice(Sport_liste)
fenster=tk.Tk()
fenster.wm_geometry('800x480')
text = tk.Label(master=fenster, text= Aufgabe)
text.config(font=('Arial', 72))
text.pack()
B = tk.Button(master=fenster, text ="Wiederholen", command = wiederholen )
B.config( height = 5, width = 50 )
B.pack()
fenster.mainloop()

Aber Trotzdem vielen vielen Dank
Benutzeravatar
__blackjack__
User
Beiträge: 14052
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Kalschnie: `time` wird importiert, aber nirgends verwendet. `Sport` und `yes_list` werden definiert und auch nirgends verwendet.

Auf Modulebene gehört nur Code der Konstanten, Funktionen, und Klassen definiert. Das Hauptprogramm steht üblicherweise in einer Funktion die `main()` heisst.

Funktionen und Methoden bekommen alles was sie ausser Konstanten benötigen als Argument(e) übergeben. Das führt bei GUI-Programmen mehr oder weniger zwangsläufig dazu, dass man Closures und/oder Klassen braucht.

Namen werden in Python klein_mit_unterstrichen geschrieben. Ausnahmen sind Konstanten (KOMPLETT_GROSS) und Klassen (MixedCase).

Namen sollten keine kryptischen Abkürzungen enthalten oder gar nur aus solchen bestehen. Wenn man `button` meint, sollte man nicht `B` schreiben.

Grunddatentypen haben in Namen nichts zu suchen. Auch sollte man keine sinnlosen Nummern an Namen hängen. Was soll denn die `1` bei `Aufgabe1` bedeuten?

Einige Namen sind schlecht gewählt. `text` ist kein guter Name für ein `Label` und `wiederholen()` wiederholt überhaupt nichts.

Die `config()`-Aufrufe sind überflüssig weil sie direkt nach dem erstellen der Objekte stehen und man die Optionen dabei einfach schon hätte angeben können.

Codewiederholungen sollte man vermeiden. Statt an zwei Stellen eine zufällige Aufgabe auszusuchen und im Label zu setzen, würde man beim erstellen des Labels keinen Text angeben und dafür das aktualisieren des Labels mit einer zufälligen Aufgabe einmal im Hauptprogramm aufrufen.

Code: Alles auswählen

#!/usr/bin/env python3
import random
import tkinter as tk
from functools import partial

AUFGABEN = [
    "Hampelman 10x",
    "Kniebeuge 10x",
    "Kniebeuge 5x",
    "Liegestütze 10x",
    "Liegestütze 5x",
    "Planks 10s",
    "Planks 30s",
]


def aufgabe_aktualisieren(aufgabe_label):
    aufgabe_label.config(text=random.choice(AUFGABEN))


def main():
    fenster = tk.Tk()
    fenster.geometry("800x480")
    aufgabe_label = tk.Label(fenster, font=("Arial", 72))
    aufgabe_label.pack()
    button = tk.Button(
        fenster,
        text="Wiederholen",
        command=partial(aufgabe_aktualisieren, aufgabe_label),
        height=5,
        width=50,
    )
    button.pack()
    button.invoke()
    fenster.mainloop()


if __name__ == "__main__":
    main()
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Antworten