---

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
tom16092
User
Beiträge: 5
Registriert: Sonntag 3. Mai 2020, 22:13

-bitte löschen, Fehlpost-

Vielen Dank
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

Schade, dass der schöne Beitrag weg ist.
tom16092 hat geschrieben: Dienstag 19. Mai 2020, 05:44Guten Tag zusammen,

ich bastel gerade an einer Stoppuhr. Das hat soweit auch alles geklappt, leider habe ich immense Probleme mit Klassen in Python: Habe den Code nachdem er funktionierte in eine Klasse gepackt und es funktioniert nichts mehr. Kann mir jemand helfen mit der Zuordnung in der Klasse selber?

Meines Verständnisses nach muss man zunächst die __init__() aufrufen um der Klasse Grundlegende Informationen darzulegen. Dies nutze ich in diesem Fall für den Frame, also das Fenster was ich öffnen möchte, welches ich später durch die run() Funktion ausführe. Zuvor kommt in der timerfunc() die Berechnung der Zeit.

Der Code für die Zeitberechnung mag vielleicht ein bisschen komisch wirken, ist aber im Prinzip erstmal nur dazu da um zu funktionieren, mir geht es speziell um den Aufbau in der Klasse selber. Wäre super wenn mir da jemand helfen könnte :)

Tom

Code: Alles auswählen

Code: Alles auswählen

import time
import tkinter
from tkinter import *
import tkinter as tk
from time import sleep

class Stoppuhr:

    def __init__(self):
        self.main = Tk()
        self.main.maxsize(320, 450)
        self.main.title('Stoppuhr')
        self.time_label = Label(self.main, text = '0:00', )
        self.time_label.config(font=('Arial', 30))
        self.entry = Entry(self.main, bd = 5, width = 5)
        self.start_button = Button(self.main, text = 'START', command = self.timerfunc)
        self.stop_button = Button(self.main, text = 'RES')

        self.entry.grid(row = 0, column = 0)
        self.time_label.grid(row = 0, column = 1)
        self.start_button.grid(row = 1, column = 0)
        self.stop_button.grid(row = 1, column = 1)
        
        self.timer_sec = 60
        self.timer_min = int(self.entry.get())
    
    def timerfunc(self):
        while timer_min != 0:
            timer_min = timer_min - 1
            while timer_sec != 0:
                timer_sec = timer_sec - 1
                sleep(1)
                if timer_sec >= 10:
                    text = (str(timer_min) + ':' + str(timer_sec))
                    time_label['text'] = text
                    time_label.update()
                else:
                    text = (str(timer_min) + ':' + '0' + str(timer_sec))
                    time_label['text'] = text
                    time_label.update()
            timer_sec = timer_sec + 60
    
    def run(self):
        self.main.mainloop()

Stoppuhr().run()
Trotzdem ein paar Anmerkungen: Du hast drei Arten von Import für Tk, wobei nur der zweite (falsche) verwendet wird. *-Importe sollte man nicht verwenden. Besser ist die dritte Variante, wo alle Namen per tk.xyz angesprochen werden.
`update` sollte man nicht verwenden. Statt einer Schleife ruft man die timerfunc periodisch per `after` auf. Strings setzt man nicht per + zusammen, sondern benutzt Stringformatierung, dann ist die if-else-Unterscheidung auch unnötig.

Zum Zeitpunkt, wo `timer_min` gesetzt wird, hatte der Nutzer noch gar keine Gelegenheit, etwas einzugeben. Die Abfrage muß in der Aktion zum Knopfdrücken stehen. `timer_min` ist dann in `timerfunc` gar nicht definiert. Statt getrennt Minuten und Sekunden zu zählen, ist es einfacher, nur Sekunden zu zählen und diese bei der Ausgabe in Minuten umzurechnen. Bei `time_label` fehlt ebenfalls das `self.`

Code: Alles auswählen

import tkinter as tk

class Stoppuhr:
    def __init__(self):
        self.main = tk.Tk()
        self.main.maxsize(320, 450)
        self.main.title('Stoppuhr')
        self.time_label = tk.Label(self.main, text='0:00', font=('Arial', 30))
        self.time_label.grid(row=0, column=1)
        self.entry = tk.Entry(self.main, bd=5, width=5)
        self.entry.grid(row=0, column=0)
        tk.Button(self.main, text='START', command=self.start_timer).grid(row=1, column=0)
        tk.Button(self.main, text='RES').grid(row=1, column=1)
        self.seconds = 0
    
    def start_timer(self):
        self.seconds = int(self.entry.get()) * 60
        self.main.after(1000, self.tick)
    
    def tick(self):
        self.seconds -= 1
        if self.seconds > 0:
            self.main.after(1000, self.tick)
        minutes, seconds = divmod(self.seconds, 60)
        self.time_label['text'] = f"{minutes}:{seconds:02d}"
    
    def run(self):
        self.main.mainloop()

Stoppuhr().run()
Antworten