Are you ready to spice up your Python projects with some visual flair? Starting with text customization is a perfect choice. Whether you’re crafting a brand-new application or refreshing one you’ve already developed, changing the color and style of your text can have a dramatic impact.
In today’s tutorial, you’ll learn how to use Python to customize the look of text by adjusting colors, styles, and more. We’ll be using a user-friendly graphical interface (GUI) built with tkinter
, making it easy and intuitive to make these changes. So, let’s dive in and start making your text stand out!
Table of Contents
- Necessary Libraries
- Imports
- Color and Style Definitions
- Defining the ColorTextApp Class
- Setup_ui Method
- Defining the apply_colors Function
- Main Block
- Example
- Full Code
Necessary Libraries
A graphical user interface (GUI) is needed, so make sure to install the tkinter library through your terminal or command prompt:
$ pip install tk
Imports
We begin by importing the tkinter
library and alias it as tk
to simplify referencing its components when creating a graphical user interface. Additionally, from this library, we import ttk
to utilize themed tkinter widgets, and font
to manage fonts.
import tkinter as tk
from tkinter import ttk, font
Color and Style Definitions
Next, we create a colors
dictionary that maps color names to their hexadecimal representations. We then copy this dictionary to another dictionary called backgrounds
to store background colors, ensuring that the background colors are identical to those defined in the original dictionary.
Following this, we define a list named styles
that includes options such as ‘Normal’, ‘Bold’, ‘Italic’, and ‘Bold/Italic’ for users to choose their text style. Lastly, we introduce lists for brightness_levels
and effects
, enabling users to customize these aspects with options like ‘Dim’, ‘Normal’, ‘Bright’ for brightness, and ‘None’, ‘Underline’ for effects.
# Define color options
colors = {
"Black": "#000000", "Red": "#FF0000", "Green": "#00FF00", "Yellow": "#FFFF00",
"Blue": "#0000FF", "Magenta": "#FF00FF", "Cyan": "#00FFFF", "White": "#FFFFFF"
}
backgrounds = colors.copy() # Background colors use the same values
styles = ["Normal", "Bold", "Italic", "Bold/Italic"]
effects = ["None", "Underline"]
brightness_levels = ["Dim", "Normal", "Bright"]
Defining the ColorTextApp Class
Here we start by creating a class named ColorTextApp
that inherits from tkinter, allowing it to utilize properties of the tkinter library such as creating a main window. In the __init__
function, we set up our main window upon its creation. We use super().__init__()
to ensure that our main window inherits all necessary properties from tkinter
properly.
After that, we set a title for our main window and define its geometry, including the default size and font for the text. Finally, we use the setup_ui
method to establish the user interface.
class ColorTextApp(tk.Tk):
def __init__(self):
super().__init__()
self.title("Color Text App - The Pycodes")
self.geometry("600x500")
self.current_font = font.Font(family="Arial", size=12) # Default font
self.setup_ui()
Setup_ui Method
In this part, we will set up the GUI elements that allow the user to interact with the main window. We start by creating an entry box for the user to input their text. Next, we will use a StringVar()
to ensure that the fore_color_var
can store text. Then we create a label that says ‘Foreground Color’ and place it using the grid layout to inform the user. After this, we introduce a drop-down list that contains a dictionary of colors using ttk.Combobox()
and link it to the fore_color_var
. We repeat a similar process for the background color, text style, effect, and brightness.
Finally, we create a button named ‘Apply and Display’ that triggers the apply_colors()
function. We also set up a text widget (display_text
) with specific height, width, and font to display the result. All of these elements will be placed on the main window using the grid layout.
def setup_ui(self):
self.text_entry = ttk.Entry(self, width=50)
self.text_entry.grid(row=0, column=1, padx=10, pady=10)
self.fore_color_var = tk.StringVar()
ttk.Label(self, text="Foreground Color:").grid(row=1, column=0, padx=10, pady=5)
self.fore_color_dropdown = ttk.Combobox(self, textvariable=self.fore_color_var, values=list(colors.keys()))
self.fore_color_dropdown.grid(row=1, column=1, padx=10, pady=5)
self.back_color_var = tk.StringVar()
ttk.Label(self, text="Background Color:").grid(row=2, column=0, padx=10, pady=5)
self.back_color_dropdown = ttk.Combobox(self, textvariable=self.back_color_var, values=list(backgrounds.keys()))
self.back_color_dropdown.grid(row=2, column=1, padx=10, pady=5)
self.style_var = tk.StringVar()
ttk.Label(self, text="Text Style:").grid(row=3, column=0, padx=10, pady=5)
self.style_dropdown = ttk.Combobox(self, textvariable=self.style_var, values=styles)
self.style_dropdown.grid(row=3, column=1, padx=10, pady=5)
self.effect_var = tk.StringVar()
ttk.Label(self, text="Text Effect:").grid(row=4, column=0, padx=10, pady=5)
self.effect_dropdown = ttk.Combobox(self, textvariable=self.effect_var, values=effects)
self.effect_dropdown.grid(row=4, column=1, padx=10, pady=5)
self.brightness_var = tk.StringVar()
ttk.Label(self, text="Brightness:").grid(row=5, column=0, padx=10, pady=5)
self.brightness_dropdown = ttk.Combobox(self, textvariable=self.brightness_var, values=brightness_levels)
self.brightness_dropdown.grid(row=5, column=1, padx=10, pady=5)
self.apply_btn = ttk.Button(self, text="Apply and Display", command=self.apply_colors)
self.apply_btn.grid(row=6, column=1, padx=10, pady=10)
# Using a Text widget to display the results instead of a Label
self.display_text = tk.Text(self, height=10, width=50, font=self.current_font)
self.display_text.grid(row=7, column=1, padx=10, pady=10)
Defining the apply_colors Function
Now we define a function that begins by retrieving the user inputs using the get()
method, starting with the text and then the foreground and background colors. For these last two, it maps the input color to its hexadecimal value, if available. If not, the text will be displayed in default colors: white for the foreground and black for the background. The function also retrieves the style, brightness, and effect, and applies these to the text using display_text
.
The font is updated based on the user’s style and brightness input: ‘bold’ if ‘Bold’ is included in the style, ‘italic’ if ‘Italic’, and the size is adjusted according to the brightness setting. Additionally, if ‘Underline’ is selected as an effect, the text is underlined; otherwise, any underline is removed.
def apply_colors(self):
text = self.text_entry.get()
fore = colors.get(self.fore_color_var.get(), "#FFFFFF")
back = backgrounds.get(self.back_color_var.get(), "#000000")
style = self.style_var.get()
effect = self.effect_var.get()
brightness = self.brightness_var.get()
# Update the font based on user input
weight = "bold" if "Bold" in style else "normal"
slant = "italic" if "Italic" in style else "roman"
size = 10 if brightness == "Dim" else 14 if brightness == "Bright" else 12
self.current_font.config(weight=weight, slant=slant, size=size)
self.display_text.config(font=self.current_font, fg=fore, bg=back)
# Clear existing text and insert new styled text
self.display_text.delete('1.0', tk.END)
self.display_text.insert(tk.END, text)
# Apply underline if selected
if effect == "Underline":
self.display_text.tag_configure("underline", underline=True)
self.display_text.tag_add("underline", "1.0", "end")
else:
self.display_text.tag_remove("underline", "1.0", "end")
Main Block
Lastly, this part ensures that the script is run directly and not imported as a module. It also ensures that the main window remains running and responsive to the user until they decide to exit.
if __name__ == "__main__":
app = ColorTextApp()
app.mainloop()
Example
Full Code
import tkinter as tk
from tkinter import ttk, font
# Define color options
colors = {
"Black": "#000000", "Red": "#FF0000", "Green": "#00FF00", "Yellow": "#FFFF00",
"Blue": "#0000FF", "Magenta": "#FF00FF", "Cyan": "#00FFFF", "White": "#FFFFFF"
}
backgrounds = colors.copy() # Background colors use the same values
styles = ["Normal", "Bold", "Italic", "Bold/Italic"]
effects = ["None", "Underline"]
brightness_levels = ["Dim", "Normal", "Bright"]
class ColorTextApp(tk.Tk):
def __init__(self):
super().__init__()
self.title("Color Text App - The Pycodes")
self.geometry("600x500")
self.current_font = font.Font(family="Arial", size=12) # Default font
self.setup_ui()
def setup_ui(self):
self.text_entry = ttk.Entry(self, width=50)
self.text_entry.grid(row=0, column=1, padx=10, pady=10)
self.fore_color_var = tk.StringVar()
ttk.Label(self, text="Foreground Color:").grid(row=1, column=0, padx=10, pady=5)
self.fore_color_dropdown = ttk.Combobox(self, textvariable=self.fore_color_var, values=list(colors.keys()))
self.fore_color_dropdown.grid(row=1, column=1, padx=10, pady=5)
self.back_color_var = tk.StringVar()
ttk.Label(self, text="Background Color:").grid(row=2, column=0, padx=10, pady=5)
self.back_color_dropdown = ttk.Combobox(self, textvariable=self.back_color_var, values=list(backgrounds.keys()))
self.back_color_dropdown.grid(row=2, column=1, padx=10, pady=5)
self.style_var = tk.StringVar()
ttk.Label(self, text="Text Style:").grid(row=3, column=0, padx=10, pady=5)
self.style_dropdown = ttk.Combobox(self, textvariable=self.style_var, values=styles)
self.style_dropdown.grid(row=3, column=1, padx=10, pady=5)
self.effect_var = tk.StringVar()
ttk.Label(self, text="Text Effect:").grid(row=4, column=0, padx=10, pady=5)
self.effect_dropdown = ttk.Combobox(self, textvariable=self.effect_var, values=effects)
self.effect_dropdown.grid(row=4, column=1, padx=10, pady=5)
self.brightness_var = tk.StringVar()
ttk.Label(self, text="Brightness:").grid(row=5, column=0, padx=10, pady=5)
self.brightness_dropdown = ttk.Combobox(self, textvariable=self.brightness_var, values=brightness_levels)
self.brightness_dropdown.grid(row=5, column=1, padx=10, pady=5)
self.apply_btn = ttk.Button(self, text="Apply and Display", command=self.apply_colors)
self.apply_btn.grid(row=6, column=1, padx=10, pady=10)
# Using a Text widget to display the results instead of a Label
self.display_text = tk.Text(self, height=10, width=50, font=self.current_font)
self.display_text.grid(row=7, column=1, padx=10, pady=10)
def apply_colors(self):
text = self.text_entry.get()
fore = colors.get(self.fore_color_var.get(), "#FFFFFF")
back = backgrounds.get(self.back_color_var.get(), "#000000")
style = self.style_var.get()
effect = self.effect_var.get()
brightness = self.brightness_var.get()
# Update the font based on user input
weight = "bold" if "Bold" in style else "normal"
slant = "italic" if "Italic" in style else "roman"
size = 10 if brightness == "Dim" else 14 if brightness == "Bright" else 12
self.current_font.config(weight=weight, slant=slant, size=size)
self.display_text.config(font=self.current_font, fg=fore, bg=back)
# Clear existing text and insert new styled text
self.display_text.delete('1.0', tk.END)
self.display_text.insert(tk.END, text)
# Apply underline if selected
if effect == "Underline":
self.display_text.tag_configure("underline", underline=True)
self.display_text.tag_add("underline", "1.0", "end")
else:
self.display_text.tag_remove("underline", "1.0", "end")
if __name__ == "__main__":
app = ColorTextApp()
app.mainloop()
Happy Coding!