How do you run your own code alongside Tkinter's event loop?

Tkinter is widely used to create and develop GUI-based applications and games. Tkinter provides its window or frame where we execute our programs and functions along with other attributes.

When working with Tkinter applications, you often need to run your own code alongside the main event loop without blocking the GUI. Tkinter provides the after() method which schedules a function to run after a specified duration, allowing you to execute custom code while keeping the GUI responsive.

Using the after() Method

The after(duration, task) method schedules a function to execute after a specified time in milliseconds. This approach prevents blocking the main thread and keeps your GUI interactive.

Basic Example

Here's how to run a counter alongside the Tkinter event loop ?

import tkinter as tk

# Create an instance of tkinter window
win = tk.Tk()
win.geometry("400x200")
win.title("Running Code with Event Loop")

# Counter variable
counter = 0

# Function to run alongside the event loop
def update_counter():
    global counter
    print(f"Counter: {counter}")
    counter += 1
    
    # Schedule the function to run again after 1000ms (1 second)
    win.after(1000, update_counter)

# Start the counter
win.after(1000, update_counter)

# Run the main event loop
win.mainloop()

The output shows the counter incrementing every second while the GUI remains responsive ?

Counter: 0
Counter: 1
Counter: 2
Counter: 3
Counter: 4
...

Example with GUI Updates

You can also update GUI elements while running your code ?

import tkinter as tk
from datetime import datetime

# Create the main window
root = tk.Tk()
root.geometry("300x150")
root.title("Live Clock")

# Create a label to display time
time_label = tk.Label(root, font=("Arial", 16))
time_label.pack(expand=True)

def update_time():
    # Get current time
    current_time = datetime.now().strftime("%H:%M:%S")
    
    # Update the label
    time_label.config(text=current_time)
    
    # Schedule next update after 1000ms
    root.after(1000, update_time)

# Start the clock
update_time()

# Run the event loop
root.mainloop()

Key Points

  • Non-blocking: The after() method doesn't block the GUI thread
  • Recursive calls: Call after() again inside your function to create a loop
  • Timing: Duration is specified in milliseconds
  • Thread-safe: This approach is safer than using threading with Tkinter

Comparison with Threading

Method Thread Safety GUI Responsiveness Complexity
after() Safe Excellent Simple
Threading Requires care Good Complex

Conclusion

Use Tkinter's after() method to run your code alongside the event loop. This approach keeps your GUI responsive while executing custom functions at regular intervals without the complexity of threading.

Updated on: 2026-03-25T16:49:51+05:30

2K+ Views

Kickstart Your Career

Get certified by completing the course

Get Started
Advertisements