Tkinter is a Python library that creates graphical user interfaces (GUIs). It is included with most Python installations and is the standard GUI library for Python. Tkinter provides a simple way to create windows, buttons, labels, and other GUI elements.
Here is a Demo of a project we built in this tutorial Source code
Tkinter is based on the Tk GUI toolkit, which was developed for the Tcl programming language. Tkinter provides a Python interface to the Tk toolkit, allowing developers to create GUI applications using Python.
Some of the benefits of using Tkinter include its simplicity, cross-platform support, and availability as a built-in library in Python. Tkinter provides a set of built-in widgets that can be used to create GUI applications quickly and easily. These widgets include buttons, labels, text boxes, check buttons, radio buttons, and more.
Tkinter also provides a set of geometry managers that can be used to position and layout widgets within a window. The three geometry managers are pack, grid, and place. The pack geometry manager arranges widgets vertically or horizontally in the available space, the grid geometry manager arranges widgets in a grid pattern, and the place geometry manager allows you to specify the exact location of widgets within the window.
Tkinter supports event-driven programming, meaning your GUI application responds to user actions such as mouse clicks or button presses. Tkinter provides a set of predefined events and allows you to define your events and callbacks.
Creating a window with Tkinter
To create a window with Tkinter, you can use the Tk
class, which represents the main window of your GUI application. Here’s an example code for creating a simple window using Tkinter:Copy
import tkinter as tk
window = tk.Tk()
window.title("My Window")
window.geometry("300x200")
window.mainloop()
In this code, we first import the tkinter
module and create an instance of the Tk
class using the tk.Tk()
constructor. We then set the title of the window to “My Window” using the title()
method and the size of the window to 300 pixels by 200 pixels using the geometry()
method. Finally, we call the mainloop()
method to start the event loop, which listens for user events and updates the GUI accordingly.
You can also set other attributes of the window using methods like configure()
. For example, you can set the background color of the window using the configure()
a method as follows:
window.configure(bg="white")
This will set the background color of the window to white.
Note that calling the mainloop()
method is necessary for the window to stay open and respond to user events. If you don’t call this method, the window will appear briefly and then disappear.
Adding widgets to a window
To add various widgets to a window in Tkinter, you can use different widget classes provided by the library. Here’s an overview of how to add different types of widgets to a Tkinter window:
a. Labels:
Labels are used to display text or images on the GUI. You can create a label using the Label
class and then add it to the window using the pack()
or grid()
method.
Example:
import tkinter as tk
window = tk.Tk()
label = tk.Label(window, text="Hello, Tkinter!")
label.pack()
window.mainloop()
b. Buttons:
Buttons allow users to trigger an action when clicked. You can create a button using the Button
class and specify the text or image to be displayed. You can also define a callback function to execute when the button is clicked using the command
parameter.
Example:
import tkinter as tk
def button_clicked():
print("Button clicked!")
window = tk.Tk()
button = tk.Button(window, text="Click me!", command=button_clicked)
button.pack()
window.mainloop()
c. Entry widgets:
Entry widgets provide a text field where users can input text. You can create an entry widget using the Entry
class and specify its width and other properties.
Example:
import tkinter as tk
def submit():
text = entry.get()
print("Entered text:", text)
window = tk.Tk()
entry = tk.Entry(window, width=20)
entry.pack()
button = tk.Button(window, text="Submit", command=submit)
button.pack()
window.mainloop()
d. Text widgets:
Text widgets are used for multiline text input or display. You can create a text widget using the Text
class and specify its height and width.
Example:
import tkinter as tk
window = tk.Tk()
text = tk.Text(window, height=5, width=30)
text.pack()
window.mainloop()
e. Checkbuttons:
Checkbuttons are used for selecting multiple options. You can create a checkbutton using the Checkbutton
class and associate it with a variable that stores the state of the checkbutton.
Example:
import tkinter as tk
window = tk.Tk()
var1 = tk.IntVar()
var2 = tk.IntVar()
checkbutton1 = tk.Checkbutton(window, text="Option 1", variable=var1)
checkbutton1.pack()
checkbutton2 = tk.Checkbutton(window, text="Option 2", variable=var2)
checkbutton2.pack()
window.mainloop()
f. Radiobuttons:
Radiobuttons are used for selecting a single option from a group of options. You can create radiobuttons using the Radiobutton
class and associate them with a variable that stores the selected option.
Example:
import tkinter as tk
window = tk.Tk()
var = tk.StringVar()
radiobutton1 = tk.Radiobutton(window, text="Option 1", variable=var, value="option1")
radiobutton1.pack()
radiobutton2 = tk.Radiobutton(window, text="Option 2", variable=var, value="option2")
radiobutton2.pack()
window.mainloop()
g. Listboxes:
Listboxes are used for displaying a list of options. You can create a listbox using the Listbox
class and add items to it using the insert()
method.
import tkinter as tk
window = tk.Tk()
listbox = tk.Listbox(window)
listbox.insert(1, "Item 1")
listbox.insert(2, "Item 2")
listbox.insert(3, "Item 3")
listbox.pack()
window.mainloop()
h. Comboboxes:
Comboboxes are dropdown menus that allow users to select an option from a predefined list. You can create a combobox using the Combobox
class from the ttk
module, which is an advanced widget set for Tkinter.
Example:
import tkinter as tk
from tkinter import ttk
window = tk.Tk()
combobox = ttk.Combobox(window, values=["Option 1", "Option 2", "Option 3"])
combobox.pack()
window.mainloop()
In the example above, we import the ttk
module to access the Combobox
class. We create a combobox instance and specify the list of values that will be displayed as options.
These are some of the commonly used widgets in Tkinter for adding functionality and interactivity to your GUI application. Tkinter offers a variety of other widgets and options for customization, allowing you to build more complex and user-friendly interfaces.
Remember to call window.mainloop()
at the end of your code to start the Tkinter event loop, which handles user input and updates the GUI accordingly.
Geometry management with Tkinter
Geometry management in Tkinter refers to the process of arranging and positioning the widgets within a window. Tkinter provides three geometry managers: pack
, grid
, and place
.
a. Pack geometry manager:
The pack
geometry manager arranges widgets in a horizontal or vertical stack. You can specify the position of the widgets within the stack using the side
parameter, which can be set to TOP
, BOTTOM
, LEFT
, or RIGHT
. The fill
parameter can be set to X
, Y
, or BOTH
to specify how the widget should fill the available space. The expand
parameter can be set to True
to make the widget expand to fill any extra space.
Example:
import tkinter as tk
window = tk.Tk()
label1 = tk.Label(window, text="Label 1")
label1.pack(side="left", fill="both", expand=True)
label2 = tk.Label(window, text="Label 2")
label2.pack(side="right", fill="both", expand=True)
window.mainloop()
b. Grid geometry manager:
The grid
geometry manager arranges widgets in a grid pattern. You can specify the row and column of each widget using the row
and column
parameters, respectively. The sticky
parameter can be set to a combination of N
, S
, E
, and W
to specify how the widget should stick to the sides of the grid cell.
Example:
import tkinter as tk
window = tk.Tk()
label1 = tk.Label(window, text="Label 1")
label1.grid(row=0, column=0, sticky="nsew")
label2 = tk.Label(window, text="Label 2")
label2.grid(row=0, column=1, sticky="nsew")
button = tk.Button(window, text="Button")
button.grid(row=1, column=0, columnspan=2, sticky="nsew")
window.mainloop()
c. Place geometry manager:
The place
geometry manager allows you to specify the exact location of each widget within the window using the x
and y
parameters. You can also specify the width and height of the widget using the width
and height
parameters, respectively.
Example:
import tkinter as tk
window = tk.Tk()
label1 = tk.Label(window, text="Label 1")
label1.place(x=10, y=10, width=100, height=20)
label2 = tk.Label(window, text="Label 2")
label2.place(x=50, y=50, width=100, height=20)
window.mainloop()
In general, the choice of geometry manager depends on the specific requirements of your application. You can also use a combination of geometry managers to achieve the desired layout.
Tkinter events and bindings
In Tkinter, events are actions that trigger a response in the GUI application, such as mouse clicks, key presses, or widget selections. You can handle events in Tkinter using event bindings, which associate a callback function with a particular event.
To create an event binding in Tkinter, you can use the bind()
method of a widget. The bind()
method takes two parameters: the event to be bound, and the callback function to be executed when the event occurs.
Here’s an example of binding a callback function to a button click event:
import tkinter as tk
def button_clicked(event):
print("Button clicked!")
window = tk.Tk()
button = tk.Button(window, text="Click me!")
button.bind("<Button-1>", button_clicked)
button.pack()
window.mainloop()
In this example, we define a callback function button_clicked()
that prints a message to the console when the button is clicked. We create a Button
widget using the Button()
method and then bind the callback function to the left mouse button click event using the bind()
method and the <Button-1>
event identifier. Finally, we pack the button using the pack()
method to add it to the window.
Here are some common events that can be handled using event bindings in Tkinter:
<Button-1>
: Left mouse button click event<Button-2>
: Middle mouse button click event<Button-3>
: Right mouse button click event<Key>
: Key press event<Return>
: Return key press event<FocusIn>
: Focus in event (when a widget gains focus)<FocusOut>
: Focus out event (when a widget loses focus)
You can also define your own custom events and bind them to widget events using the event_generate()
and event_add()
methods.
Handling events using bindings is a powerful feature of Tkinter and allows you to create responsive and interactive GUI applications.
Tkinter menus
Tkinter provides built-in support for creating menus in your GUI application. Menus are typically used to provide access to a set of related commands or options. Tkinter menus can be created using the Menu
class and associated with a widget using the menu
parameter.
There are three types of menus in Tkinter:
a. Simple menus:
Simple menus can be created using the Menu
class and adding items to them using the add_command()
method. Each item in the menu is represented by a string label and a callback function that is executed when the item is selected.
Example:
import tkinter as tk
def file_new():
print("New file created!")
def file_open():
print("File opened!")
window = tk.Tk()
menubar = tk.Menu(window)
file_menu = tk.Menu(menubar, tearoff=0)
file_menu.add_command(label="New", command=file_new)
file_menu.add_command(label="Open", command=file_open)
menubar.add_cascade(label="File", menu=file_menu)
window.config(menu=menubar)
window.mainloop()
In this example, we create a menu bar using the Menu
class and a file menu using the same class with two items: “New” and “Open”. We add these items to the file menu using the add_command()
method and associate them with callback functions. We then add the file menu to the menu bar using the add_cascade()
method and configure the window to use the menu bar using the config()
method.
b. Menus with submenus:
Menus with submenus can be created by adding a new menu to an existing menu using the add_cascade()
method. The new menu is represented by a string label and can contain its own set of items.
Example:
import tkinter as tk
def file_new():
print("New file created!")
def file_open():
print("File opened!")
def edit_cut():
print("Text cut!")
def edit_copy():
print("Text copied!")
window = tk.Tk()
menubar = tk.Menu(window)
file_menu = tk.Menu(menubar, tearoff=0)
file_menu.add_command(label="New", command=file_new)
file_menu.add_command(label="Open", command=file_open)
edit_menu = tk.Menu(menubar, tearoff=0)
edit_menu.add_command(label="Cut", command=edit_cut)
edit_menu.add_command(label="Copy", command=edit_copy)
menubar.add_cascade(label="File", menu=file_menu)
menubar.add_cascade(label="Edit", menu=edit_menu)
window.config(menu=menubar)
window.mainloop()
In this example, we create a file menu and an edit menu with their respective items. We then add the file and edit menus to the menu bar using the add_cascade()
method. The edit menu also has its own set of items.
c. Context menus:
Context menus are menus that appear when the user right-clicks on a widget. You can create a context menu by creating a menu using the Menu
class, adding items to it using the add_command()
method, and associating it with a widget using the bind()
method and the <Button-3>
event identifier.
Example:
import tkinter as tk
def cut():
print("Text cut!")
def copy():
print("Text copied!")
def paste():
print("Text pasted!")
window = tk.Tk()
text = tk.Text(window)
text.pack()
context_menu = tk.Menu(window, tearoff=0)
context_menu.add_command(label="Cut", command=cut)
context_menu.add_command(label="Copy", command=copy)
context_menu.add_command(label="Paste", command=paste)
def show_context_menu(event):
context_menu.post(event.x_root, event.y_root)
text.bind("<Button-3>", show_context_menu)
window.mainloop()
In this example, we create a context menu with three items: “Cut”, “Copy”, and “Paste”. We then define a function show_context_menu()
that displays the context menu at the position of the right-click event. We use the bind()
method to associate the function with the <Button-3>
event for the text widget. When the user right-clicks on the text widget, the context menu is displayed at the position of the mouse cursor.
Tkinter menus are a powerful tool for organizing and providing access to the commands and options in your GUI application. They can be used in a variety of ways to enhance the user experience and increase the usability of your application.
Tkinter dialogs
Tkinter provides several built-in dialog boxes that you can use in your GUI application. Dialog boxes are used to display messages, gather user input, and provide feedback to the user.
a. Message boxes:
Message boxes are used to display messages to the user. Tkinter provides several types of message boxes, including showinfo()
, showwarning()
, showerror()
, and askquestion()
. These message boxes display a message with an icon and return a value indicating the user’s response.
Example:
import tkinter as tk
from tkinter import messagebox
def show_message():
messagebox.showinfo("Message", "Hello, world!")
def show_warning():
messagebox.showwarning("Warning", "This is a warning message.")
def show_error():
messagebox.showerror("Error", "An error occurred.")
def ask_question():
result = messagebox.askquestion("Question", "Are you sure?")
if result == "yes":
print("User clicked Yes.")
else:
print("User clicked No.")
window = tk.Tk()
button1 = tk.Button(window, text="Show Message", command=show_message)
button1.pack()
button2 = tk.Button(window, text="Show Warning", command=show_warning)
button2.pack()
button3 = tk.Button(window, text="Show Error", command=show_error)
button3.pack()
button4 = tk.Button(window, text="Ask Question", command=ask_question)
button4.pack()
window.mainloop()
In this example, we define four functions that display different types of message boxes. We create a button for each function using the Button
class and add them to the window using the pack()
method.
b. File dialogs:
File dialogs are used to prompt the user to select a file or directory. Tkinter provides two types of file dialogs: askopenfilename()
and asksaveasfilename()
. These dialogs display a file selection dialog box and return the selected file or directory path.
Example:
import tkinter as tk
from tkinter import filedialog
def open_file():
file_path = filedialog.askopenfilename()
print("Selected file:", file_path)
def save_file():
file_path = filedialog.asksaveasfilename()
print("Selected file:", file_path)
window = tk.Tk()
button1 = tk.Button(window, text="Open File", command=open_file)
button1.pack()
button2 = tk.Button(window, text="Save File", command=save_file)
button2.pack()
window.mainloop()
In this example, we define two functions that display file dialogs. We create a button for each function using the Button
class and add them to the window using the pack()
method. When the user clicks on a button, the corresponding file dialog is displayed and the selected file or directory path is printed to the console.
c. Color dialogs:
Color dialogs are used to prompt the user to select a color. Tkinter provides a colorchooser
module that you can use to create a color dialog. The askcolor()
function displays a color selection dialog box and returns the selected color as a tuple of RGB values.
Example:
import tkinter as tk
from tkinter import colorchooser
def select_color():
color = colorchooser.askcolor(title="Select color")
print("Selected color:", color)
window = tk.Tk()
button = tk.Button(window, text="Select Color", command=select_color)
button.pack()
window.mainloop()
In this example, we define a function select_color()
that displays a color dialog box using the askcolor()
function from the colorchooser
module. We create a button for the function using the Button
class and add it to the window using the pack()
method. When the user clicks on the button, the color dialog is displayed and the selected color is printed to the console.
d. Font dialogs:
Font dialogs are used to prompt the user to select a font. Tkinter provides a fontchooser
module that you can use to create a font dialog. The askfont()
function displays a font selection dialog box and returns the selected font as a Font
object.
Example:
import tkinter as tk
from tkinter import fontchooser
def select_font():
font = fontchooser.askfont(title="Select font")
print("Selected font:", font)
window = tk.Tk()
button = tk.Button(window, text="Select Font", command=select_font)
button.pack()
window.mainloop()
In this example, we define a function select_font()
that displays a font dialog box using the askfont()
function from the fontchooser
module. We create a button for the function using the Button
class and add it to the window using the pack()
method. When the user clicks on the button, the font dialog is displayed and the selected font is printed to the console.
Tkinter color and font dialogs are useful tools for enhancing the functionality and user experience of your GUI application. They provide a standardized interface for selecting colors and fonts and can help to make your application more flexible and customizable.
Tkinter canvas
Tkinter provides a Canvas widget that allows you to draw and manipulate graphical elements such as lines, shapes, text, and images. The Canvas widget provides a 2D drawing surface where you can create interactive graphics and animations.
To use the Canvas widget in Tkinter, you can create an instance of the Canvas
class and specify its width and height. You can then add various graphical elements to the canvas using methods such as create_line()
, create_rectangle()
, create_oval()
, create_text()
, and create_image()
.
Here’s an example that demonstrates the usage of the Canvas widget:
import tkinter as tk
window = tk.Tk()
canvas = tk.Canvas(window, width=400, height=300)
canvas.pack()
# Draw a line
line = canvas.create_line(50, 50, 200, 200)
# Draw a rectangle
rectangle = canvas.create_rectangle(100, 100, 300, 200, fill='blue')
# Draw an oval
oval = canvas.create_oval(150, 150, 250, 250, fill='red')
# Draw text
text = canvas.create_text(200, 50, text='Hello, Tkinter!', fill='green')
# Load and display an image
image = tk.PhotoImage(file='image.png')
canvas.create_image(200, 150, image=image)
window.mainloop()
In this example, we create a Canvas widget with a width of 400 pixels and a height of 300 pixels. We then use various create_
methods to draw different elements on the canvas, such as a line, a rectangle, an oval, and text. We also load an image using the PhotoImage
class and display it on the canvas.
You can further manipulate the graphical elements on the canvas by using methods like itemconfig()
to change their properties, coords()
to change their coordinates, and delete()
to remove them from the canvas.
The Canvas widget also supports event handling, allowing you to respond to mouse clicks, mouse movements, and other events on the canvas. You can bind event handlers to the canvas using the bind()
method.
The Canvas widget in Tkinter provides a powerful tool for creating interactive graphics and visualizations in your GUI applications. You can explore its various methods and options to create complex and dynamic visual elements.
Tkinter styles and themes
Tkinter provides a way to customize the appearance of widgets using styles and themes. A style is a collection of settings that define the appearance of a widget, such as its font, color, and size. A theme is a set of styles that can be applied to all the widgets in an application.
The default theme for Tkinter is the clam
theme, which provides a classic look and feel for widgets. However, you can change the theme to one of the other available themes, such as alt
, default
, classic
, vista
, or xpnative
.
To change the theme in Tkinter, you can use the ttk.Style
class, which provides methods for defining and applying styles and themes. Here’s an example:
import tkinter as tk
from tkinter import ttk
window = tk.Tk()
# Create a style object
style = ttk.Style()
# Set the theme to 'vista'
style.theme_use('vista')
# Create some widgets with the new style
label = ttk.Label(window, text='Hello, Tkinter!')
button = ttk.Button(window, text='Click me!')
label.pack()
button.pack()
window.mainloop()
In this example, we create a style object using the ttk.Style
class. We then use the theme_use()
method to set the theme to 'vista'
. Finally, we create some widgets using the ttk.Label
and ttk.Button
classes, which will automatically use the new style defined by the ttk.Style
object.
You can also define your own styles using the ttk.Style
class. You can use the configure()
method to set the various style options, such as font, color, and padding. Here’s an example:
import tkinter as tk
from tkinter import ttk
window = tk.Tk()
# Create a style object
style = ttk.Style()
# Create a custom style for the label widget
style.configure('MyLabel.TLabel', font=('Arial', 14), foreground='blue', padding=(10, 10))
# Create a label widget with the new style
label = ttk.Label(window, text='Hello, Tkinter!', style='MyLabel.TLabel')
label.pack()
window.mainloop()
In this example, we create a custom style for the ttk.Label
widget using the configure()
method. We set the font to 'Arial'
with a size of 14, the foreground color to 'blue'
, and the padding to (10, 10)
. We then create a ttk.Label
widget with the new style by specifying the style
option as 'MyLabel.TLabel'
.
Tkinter styles and themes provide a way to customize the appearance of widgets in your GUI application, allowing you to create a consistent look and feel across your application. You can explore Tkinter’s various style options and themes to create a customized and visually appealing user interface.
Mini Project Source Code :
from tkinter import * from PIL import ImageTk, Image import os def rotate_image(): global counter img_label.config(image=img_array[counter % len(img_array)]) counter += 1 counter = 0 # Start counter at 0 root = Tk() root.title(‘Wallpaper Viewer’) root.geometry(‘500×750’) root.configure(background=’black’) # Load favicon favicon_path = ‘./assets/icon.png’ # Replace with your favicon path root.iconphoto(False, PhotoImage(file=favicon_path)) # Load images image_folder = ‘./photo’ files = [f for f in os.listdir(image_folder) if f.lower().endswith((‘.png’, ‘.jpg’, ‘.jpeg’, ‘.bmp’, ‘.gif’))] img_array = [] for file in files: img_path = os.path.join(image_folder, file) img = Image.open(img_path) resized_img = img.resize((450, 650), Image.LANCZOS) # Use LANCZOS for high-quality resizing img_array.append(ImageTk.PhotoImage(resized_img)) # Check if there are images loaded if img_array: img_label = Label(root, image=img_array[0]) img_label.pack(pady=(15, 10)) else: no_image_label = Label(root, text=”No images found in the folder”, bg=’black’, fg=’white’) no_image_label.pack(pady=(15, 10)) next_btn = Button(root, text=’Next’, bg=’white’, fg=’black’, width=28, height=2, command=rotate_image) next_btn.pack() root.mainloop() |