⬅ Previous Next ➡

GUI Programming

Tkinter GUI (Overview)
  • Tkinter is Python's built-in library for GUI development.
  • Main steps: create window → add widgets → run main loop.
  • Import: import tkinter as tk
import tkinter as tk

root = tk.Tk()
root.title("My App")
root.geometry("400x300")

tk.Label(root, text="Hello Tkinter").pack()

root.mainloop()
Common Widgets (Label, Button, Entry, Text)
  • Label → display text
  • Button → clickable button
  • Entry → single-line input
  • Text → multi-line input
  • Checkbutton, Radiobutton, Listbox, Combobox (ttk)
import tkinter as tk
from tkinter import ttk

root = tk.Tk()

tk.Label(root, text="Name").pack()
name_entry = tk.Entry(root)
name_entry.pack()

tk.Button(root, text="Submit").pack()

ttk.Combobox(root, values=["A", "B", "C"]).pack()

root.mainloop()
Layouts (pack, grid, place)
  • pack(): simple layout (top/bottom/left/right)
  • grid(): row-column layout (best for forms/calculators)
  • place(): exact positioning (x,y)
  • Note: Do not mix pack and grid in the same parent frame.
import tkinter as tk

root = tk.Tk()

tk.Label(root, text="Username").grid(row=0, column=0, padx=5, pady=5)
tk.Entry(root).grid(row=0, column=1, padx=5, pady=5)

tk.Label(root, text="Password").grid(row=1, column=0, padx=5, pady=5)
tk.Entry(root, show="*").grid(row=1, column=1, padx=5, pady=5)

root.mainloop()
Event Handling (command and bind)
  • command= is used for button click events.
  • bind() is used for keyboard/mouse events.
import tkinter as tk

def on_click():
    print("Button clicked")

def on_enter(event):
    print("You pressed Enter")

root = tk.Tk()

btn = tk.Button(root, text="Click", command=on_click)
btn.pack(pady=10)

root.bind("", on_enter)

root.mainloop()
Project 1: Calculator App (Basic)
  • Simple calculator using Entry + Buttons + eval().
  • Good for learning grid layout and button events.
import tkinter as tk

def press(key):
    entry.insert(tk.END, key)

def clear():
    entry.delete(0, tk.END)

def equal():
    try:
        exp = entry.get()
        result = eval(exp)
        entry.delete(0, tk.END)
        entry.insert(0, str(result))
    except:
        entry.delete(0, tk.END)
        entry.insert(0, "Error")

root = tk.Tk()
root.title("Calculator")

entry = tk.Entry(root, font=("Arial", 18), justify="right")
entry.grid(row=0, column=0, columnspan=4, padx=8, pady=8, sticky="nsew")

buttons = [
    "7","8","9","/",
    "4","5","6","*",
    "1","2","3","-",
    "0",".","=","+"
]

r = 1
c = 0

for b in buttons:
    if b == "=":
        cmd = equal
    else:
        cmd = lambda x=b: press(x)

    tk.Button(root, text=b, width=5, height=2, command=cmd).grid(
        row=r, column=c, padx=4, pady=4, sticky="nsew"
    )

    c += 1
    if c == 4:
        c = 0
        r += 1

tk.Button(root, text="C", command=clear).grid(
    row=r, column=0, columnspan=4, sticky="nsew", padx=4, pady=4
)

for i in range(4):
    root.grid_columnconfigure(i, weight=1)

root.mainloop()
Project 2: Form App (Student Registration)
  • Form app using Labels, Entry, Radiobutton, Checkbutton.
  • Shows validation + messagebox output.
import tkinter as tk
from tkinter import messagebox

def submit():
    name = name_var.get().strip()
    age = age_var.get().strip()
    gender = gender_var.get()

    if not name or not age.isdigit():
        messagebox.showerror("Error", "Enter valid name and age")
        return

    skills = []
    if py_var.get():
        skills.append("Python")
    if c_var.get():
        skills.append("C")

    skills_text = ", ".join(skills) if skills else "None"

    msg = (
        f"Name: {name}\n"
        f"Age: {age}\n"
        f"Gender: {gender}\n"
        f"Skills: {skills_text}"
    )
    messagebox.showinfo("Saved", msg)

root = tk.Tk()
root.title("Student Form")

name_var = tk.StringVar()
age_var = tk.StringVar()
gender_var = tk.StringVar(value="Male")
py_var = tk.IntVar()
c_var = tk.IntVar()

tk.Label(root, text="Name").grid(row=0, column=0, padx=6, pady=6, sticky="w")
tk.Entry(root, textvariable=name_var).grid(row=0, column=1, padx=6, pady=6)

tk.Label(root, text="Age").grid(row=1, column=0, padx=6, pady=6, sticky="w")
tk.Entry(root, textvariable=age_var).grid(row=1, column=1, padx=6, pady=6)

tk.Label(root, text="Gender").grid(row=2, column=0, padx=6, pady=6, sticky="w")
tk.Radiobutton(root, text="Male", variable=gender_var, value="Male").grid(row=2, column=1, sticky="w")
tk.Radiobutton(root, text="Female", variable=gender_var, value="Female").grid(row=3, column=1, sticky="w")

tk.Label(root, text="Skills").grid(row=4, column=0, padx=6, pady=6, sticky="w")
tk.Checkbutton(root, text="Python", variable=py_var).grid(row=4, column=1, sticky="w")
tk.Checkbutton(root, text="C", variable=c_var).grid(row=5, column=1, sticky="w")

tk.Button(root, text="Submit", command=submit).grid(row=6, column=0, columnspan=2, pady=10)

root.mainloop()
Project 3: Snake Game (Mini Tkinter Canvas)
  • Snake game can be created using Canvas and key bindings.
  • This is a mini version (movement + food + score).
  • Concepts: Canvas, after(), bind(), collision.
import tkinter as tk
import random

CELL = 20
W, H = 20, 20

class SnakeGame:
    def __init__(self, root):
        self.root = root
        self.root.title("Snake Game")

        self.canvas = tk.Canvas(root, width=W * CELL, height=H * CELL, bg="black")
        self.canvas.pack()

        self.direction = "Right"
        self.snake = [(5, 5), (4, 5), (3, 5)]
        self.food = self.random_food()
        self.score = 0

        self.root.bind("", lambda e: self.change_dir("Up"))
        self.root.bind("", lambda e: self.change_dir("Down"))
        self.root.bind("", lambda e: self.change_dir("Left"))
        self.root.bind("", lambda e: self.change_dir("Right"))

        self.loop()

    def change_dir(self, d):
        opposite = {"Up": "Down", "Down": "Up", "Left": "Right", "Right": "Left"}
        if d != opposite[self.direction]:
            self.direction = d

    def random_food(self):
        while True:
            p = (random.randint(0, W - 1), random.randint(0, H - 1))
            if p not in self.snake:
                return p

    def move(self):
        x, y = self.snake[0]

        if self.direction == "Up":
            y -= 1
        elif self.direction == "Down":
            y += 1
        elif self.direction == "Left":
            x -= 1
        else:
            x += 1

        new_head = (x, y)

        if x < 0 or x >= W or y < 0 or y >= H or new_head in self.snake:
            self.game_over()
            return False

        self.snake.insert(0, new_head)

        if new_head == self.food:
            self.score += 1
            self.food = self.random_food()
        else:
            self.snake.pop()

        return True

    def draw(self):
        self.canvas.delete("all")

        fx, fy = self.food
        self.canvas.create_rectangle(
            fx * CELL, fy * CELL, fx * CELL + CELL, fy * CELL + CELL,
            fill="red", outline=""
        )

        for i, (x, y) in enumerate(self.snake):
            color = "green" if i == 0 else "lime"
            self.canvas.create_rectangle(
                x * CELL, y * CELL, x * CELL + CELL, y * CELL + CELL,
                fill=color, outline=""
            )

        self.canvas.create_text(60, 10, fill="white", text=f"Score: {self.score}")

    def loop(self):
        ok = self.move()
        if ok:
            self.draw()
            self.root.after(120, self.loop)

    def game_over(self):
        self.canvas.create_text(
            (W * CELL) // 2, (H * CELL) // 2,
            fill="white",
            text=f"Game Over! Score: {self.score}",
            font=("Arial", 18)
        )

root = tk.Tk()
SnakeGame(root)
root.mainloop()
⬅ Previous Next ➡