-bitte löschen, Fehlpost-
Vielen Dank
---
Schade, dass der schöne Beitrag weg ist.
`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.`
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.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()
`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()