Apr-07-2021, 06:23 PM
Example of using the after method to do something after every second without blocking the GUI event loop.
import tkinter as tk from tkinter import messagebox import datetime as dt class MainFrame(tk.Frame): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) theLabel = tk.Label(self, text="Enter time below in minutes (e.g 30)") theLabel.pack() self.entry_1 = tk.Entry(self) self.entry_1.pack() button_1 = tk.Button(self, text="Set interval", command=self.set_alarm_time) button_1.pack() self.timenow_label = tk.Label(self) self.timenow_label.pack() self.alarm_time_label = tk.Label(self, text='Alarm time:') self.alarm_time_label.pack() self.pack() self.alarm_time = None self.timer() def set_alarm_time(self): try: interval = dt.timedelta(minutes=int(self.entry_1.get())) except ValueError: self.entry_1.delete(0, tk.END) messagebox.showinfo( 'Entry error', message="Please enter an integer") return self.alarm_time = dt.datetime.now() + interval self.alarm_time_label['text'] = self.alarm_time.strftime( 'Alarm time: %H:%M:%S') def timer(self): timenow = dt.datetime.now() self.timenow_label['text'] = timenow.strftime('Time now: %H:%M:%S') if self.alarm_time and timenow >= self.alarm_time: self.alarm_time = None self.alarm_time_label['text'] = 'Alarm time:' self.entry_1.delete(0, tk.END) messagebox.showinfo( 'STRETCH TIME', message="Please take a stretch break!") self.after(1000, self.timer) if __name__ == "__main__": app = tk.Tk() main_frame = MainFrame() app.mainloop()