Tkinter: Changing tk.Button text with Stringvar() and trace_add

Tkinter: Changing tk.Button text with Stringvar() and trace_add

In this example, we will see how we can create a text Entry and connect a variable to it. The text in the Entry will then dynamically update a button on the form. You can see how to create a Tkinter application and a button in this earlier post.

The code

#! python3
# -*- coding: utf-8 -*-

import tkinter as tk

class entries_tester_app(tk.Tk):
    def __init__(self, frame_title):
        # Create a title for the frame
        # Create a variable for holding the text in the Entry
        self.entry_text_var = tk.StringVar()
        self.entry_text_var.trace_add("write", self.change_button_text)
        # Create an Entry connected to the entry_text_var
        self.entry_box = tk.Entry(self, text=self.entry_text_var)
        # Create the button
        self.print_button = tk.Button(self, text = "PLACEHOLDER TEXT", command=self.print_text)
        # Put the button and the entry to the frame
    def change_button_text(self, *args): # Note the args
        # Change the button text
    def print_text(self):
        # Print the text to the console
        print("You entered: \"{}\"".format(self.entry_box.get()))
if __name__ == "__main__":
    root = entries_tester_app("Entry test")

The explanation

We need to create a variable that we can track. We create a StringVar() (self.entry_text_var) to hold our text entry. You can also create number variables and boolean variables. We trace the variable with the trace_add method. Note that trace_add replaces the trace method and that the modes are "write", "read" and "unset". We also connect the trace to the change_button_text method.

The button's text will now update as you write in the text entry. Pretty cool right!

Featured Image: "Black-and-white version of the Python logo, useful for small/high contrast icons." by Waldir is licensed under CC BY-SA 4.0

Leave a Reply

Your email address will not be published.

linkedin facebook pinterest youtube rss twitter instagram facebook-blank rss-blank linkedin-blank pinterest youtube twitter instagram