Home Python C Language C ++ HTML 5 CSS Javascript Java Kotlin SQL DJango Bootstrap React.js R C# PHP ASP.Net Numpy Dart Pandas Digital Marketing

Tkinter Custom Widgets


Creating custom widgets in Tkinter allows you to extend its functionality and tailor the user interface to your specific needs. Here’s a step-by-step guide on creating custom widgets in Tkinter:

1. Basic Custom Widget

To create a custom widget, subclass an existing Tkinter widget (like tk.Frame) and add your custom functionality.


Example: Custom Label Frame


python
                        import tkinter as tk

                        class CustomLabelFrame(tk.Frame):
                            def __init__(self, parent, label_text, *args, **kwargs):
                                super().__init__(parent, *args, **kwargs)

                                # Create a label and a frame
                                self.label = tk.Label(self, text=label_text, bg="lightgrey")
                                self.label.pack(side=tk.TOP, fill=tk.X)

                                self.inner_frame = tk.Frame(self, bg="white", bd=2, relief=tk.SUNKEN)
                                self.inner_frame.pack(side=tk.TOP, fill=tk.BOTH, expand=True)

                                # Example widget inside custom widget
                                self.example_label = tk.Label(self.inner_frame, text="Inside Custom Widget")
                                self.example_label.pack(pady=20)

                        # Create the main window
                        root = tk.Tk()
                        root.title("Custom Widget Example")
                        root.geometry("300x200")

                        # Create an instance of the custom widget
                        custom_widget = CustomLabelFrame(root, label_text="Custom Frame")
                        custom_widget.pack(fill=tk.BOTH, expand=True, padx=10, pady=10)

                        # Run the application
                        root.mainloop()

                    

Explanation:

  • class CustomLabelFrame(tk.Frame): Subclass tk.Frame to create a custom widget.
  • super().__init__(parent, *args, **kwargs): Initialize the base class.
  • self.label: Add a label to the custom widget.
  • self.inner_frame: Add an inner frame to hold other widgets.


2. Custom Button with Image

You can create custom widgets with images and custom behavior.

Example: Image Button


python
                        import tkinter as tk


                        from PIL import Image, ImageTk

                        class ImageButton(tk.Button):
                            def __init__(self, parent, image_path, *args, **kwargs):
                                # Load the image
                                image = Image.open(image_path)
                                self.photo = ImageTk.PhotoImage(image)

                                # Initialize the Button with the image
                                super().__init__(parent, image=self.photo, *args, **kwargs)

                        # Create the main window
                        root = tk.Tk()
                        root.title("Image Button Example")
                        root.geometry("300x200")

                        # Create an instance of the custom widget
                        image_button = ImageButton(root, "path/to/your/image.png", command=lambda: print("Button clicked!"))
                        image_button.pack(pady=20)

                        # Run the application
                        root.mainloop()

                    

Explanation:

  • from PIL import Image, ImageTk: Use Pillow to handle image loading.
  • ImageButton(tk.Button): Subclass tk.Button to create an image button.
  • self.photo = ImageTk.PhotoImage(image): Store the image to prevent garbage collection.


3. Custom Entry with Validation

Add validation functionality to a custom entry widget.

Example: Validated Entry


python
                        import tkinter as tk


                        from tkinter import messagebox
                                            
                        class ValidatedEntry(tk.Entry):
                            def __init__(self, parent, *args, **kwargs):
                                super().__init__(parent, *args, **kwargs)
                                            
                                # Bind the validate function to the  event
                                self.bind("", self.validate)
                                
                            def validate(self, event=None):
                                value = self.get()
                                if not value.isdigit():
                                    messagebox.showerror("Invalid input", "Please enter a number")
                                    self.focus_set()
                                    return False
                                return True
                                
                        # Create the main window
                        root = tk.Tk()
                        root.title("Validated Entry Example")
                        root.geometry("300x200")
                                
                        # Create an instance of the custom widget
                        validated_entry = ValidatedEntry(root)
                        validated_entry.pack(pady=20)
                                
                        # Run the application
                        root.mainloop()
                                
                    

Explanation:

  • ValidatedEntry(tk.Entry): Subclass tk.Entry to create a custom entry widget.
  • self.bind("<FocusOut>", self.validate): Bind the validation function to the <FocusOut> event.
  • messagebox.showerror(): Show an error message if validation fails.


4. Custom Complex Widget

Create a more complex custom widget by combining multiple widgets.

Example: Custom Complex Widget


python
                        import tkinter as tk

                        class LabeledEntry(tk.Frame):
                            def __init__(self, parent, label_text, *args, **kwargs):
                                super().__init__(parent, *args, **kwargs)

                                # Create and pack a label
                                self.label = tk.Label(self, text=label_text)
                                self.label.pack(side=tk.LEFT, padx=5, pady=5)

                                # Create and pack an entry
                                self.entry = tk.Entry(self)
                                self.entry.pack(side=tk.LEFT, padx=5, pady=5)

                            def get(self):
                                return self.entry.get()

                            def set(self, text):
                                self.entry.delete(0, tk.END)
                                self.entry.insert(0, text)

                        # Create the main window
                        root = tk.Tk()
                        root.title("Custom Complex Widget Example")
                        root.geometry("300x200")

                        # Create an instance of the custom widget
                        labeled_entry = LabeledEntry(root, label_text="Name:")
                        labeled_entry.pack(pady=20)

                        # Add a button to print the entry value
                        def print_value():
                            print("Entry Value:", labeled_entry.get())

                        print_button = tk.Button(root, text="Print Value", command=print_value)
                        print_button.pack(pady=10)

                        # Run the application
                        root.mainloop()

                    

Explanation:

  • LabeledEntry(tk.Frame): Subclass tk.Frame to create a labeled entry widget.
  • self.entry.get(): Method to get the entry value.
  • self.entry.set(): Method to set the entry value.

Summary

By following these steps, you can create custom widgets in Tkinter to extend its functionality and create more complex and tailored user interfaces. Subclass existing Tkinter widgets, add your custom functionality, and combine multiple widgets to create more advanced custom widgets







Advertisement





Q3 Schools : India


Online Complier

HTML 5

Python

java

C++

C

JavaScript

Website Development

HTML

CSS

JavaScript

Python

SQL

Campus Learning

C

C#

java