🖼️ Tkinter – Grafiskās lietotāja saskarnes
Tkinter ir Python iebūvētā bibliotēka grafisko logu (GUI) veidošanai. Tā ir iekļauta Python standarta instalācijā – papildus instalācija nav vajadzīga.
Pirmais logs
Teksts
import tkinter as tk
# Izveidot galveno logu
logs = tk.Tk()
logs.title("Mans pirmais logs")
logs.geometry("400x300") # platums x augstums
logs.resizable(True, True) # Vai var mainīt izmēru
# Etiķete (Label)
etiķete = tk.Label(logs, text="Sveika, Tkinter!", font=("Arial", 18, "bold"))
etiķete.pack(pady=20) # pady – vertikāla atstarpe
# Poga (Button)
def noklikšķināts():
etiķete.config(text="Noklikšķināts! 🎉")
poga = tk.Button(logs, text="Noklikšķini mani", command=noklikšķināts,
bg="#dc6b2f", fg="white", padx=10, pady=5)
poga.pack()
# Sākt notikumu cilpu – obligāts!
logs.mainloop()
Izkārtojuma pārvaldnieki
Teksts
import tkinter as tk
logs = tk.Tk()
logs.geometry("500x400")
# --- pack() – kastu izkārtojums ---
rāmis1 = tk.Frame(logs, bg="#fdf6ee", bd=2, relief="sunken")
rāmis1.pack(fill="x", padx=10, pady=5)
tk.Label(rāmis1, text="pack() piemērs", bg="#fdf6ee").pack(side="left")
tk.Button(rāmis1, text="Poga 1").pack(side="right")
# --- grid() – tabulas izkārtojums ---
rāmis2 = tk.Frame(logs)
rāmis2.pack(padx=10, pady=10)
for rinda in range(3):
for kolonna in range(3):
tk.Button(rāmis2, text=f"({rinda},{kolonna})", width=6)\
.grid(row=rinda, column=kolonna, padx=2, pady=2)
# --- grid() forma ---
rāmis3 = tk.Frame(logs, bg="#fff3e0", bd=1, relief="ridge")
rāmis3.pack(fill="x", padx=10, pady=5)
tk.Label(rāmis3, text="Vārds:", bg="#fff3e0").grid(row=0, column=0, sticky="e", padx=5, pady=4)
tk.Entry(rāmis3, width=20).grid(row=0, column=1, padx=5, pady=4)
tk.Label(rāmis3, text="E-pasts:", bg="#fff3e0").grid(row=1, column=0, sticky="e", padx=5, pady=4)
tk.Entry(rāmis3, width=20).grid(row=1, column=1, padx=5, pady=4)
# --- place() – absolūtās koordinātas ---
rāmis4 = tk.Frame(logs, width=400, height=80, bg="#e0f2f1")
rāmis4.pack(fill="x", padx=10, pady=5)
rāmis4.pack_propagate(False) # Nelauj rāmim samazināties
tk.Label(rāmis4, text="place() – precīzas koordinātas", bg="#e0f2f1")\
.place(x=10, y=10)
tk.Button(rāmis4, text="Labajā stūrī")\
.place(relx=1.0, rely=1.0, anchor="se") # Relatīvās koordinātas
logs.mainloop()
Pamata vidžeti
Teksts
import tkinter as tk
from tkinter import ttk # Modernāki widgeti
logs = tk.Tk()
logs.title("Widgetu galerija")
logs.geometry("450x500")
# Entry – teksta ievadlauks
tk.Label(logs, text="Teksta ievade:").pack(anchor="w", padx=15, pady=(10,0))
ievade = tk.Entry(logs, width=30)
ievade.pack(padx=15)
ievade.insert(0, "Piemēra teksts") # Noklusējuma teksts
# Spinbox – skaitliskā ievade
tk.Label(logs, text="Spinbox:").pack(anchor="w", padx=15, pady=(10,0))
spinbox = ttk.Spinbox(logs, from_=1, to=100, width=10)
spinbox.pack(padx=15, anchor="w")
# Checkbutton – izvēles rūtiņa
izvēlne_vērtība = tk.BooleanVar()
cb = tk.Checkbutton(logs, text="Piekrītu noteikumiem", variable=izvēlne_vērtība)
cb.pack(padx=15, anchor="w", pady=5)
# Radiobutton – vienas izvēles poga
radio_izvēle = tk.StringVar(value="php")
tk.Label(logs, text="Valoda:").pack(anchor="w", padx=15)
for valoda in ["python", "php", "javascript"]:
tk.Radiobutton(logs, text=valoda.capitalize(), variable=radio_izvēle,
value=valoda).pack(anchor="w", padx=30)
# Combobox (dropdown)
tk.Label(logs, text="Pilsēta:").pack(anchor="w", padx=15, pady=(10,0))
combo = ttk.Combobox(logs, values=["Rīga", "Valmiera", "Liepāja", "Daugavpils"], width=20)
combo.set("Rīga")
combo.pack(padx=15, anchor="w")
# Text – daudzrindu teksts
tk.Label(logs, text="Piezīmes:").pack(anchor="w", padx=15, pady=(10,0))
teksts = tk.Text(logs, height=4, width=40)
teksts.pack(padx=15)
# Nolasīt vērtību
def nolasīt():
print(f"Ievade: {ievade.get()}")
print(f"Piekritis: {izvēlne_vērtība.get()}")
print(f"Valoda: {radio_izvēle.get()}")
print(f"Pilsēta: {combo.get()}")
print(f"Teksts: {teksts.get('1.0', 'end').strip()}")
tk.Button(logs, text="Nolasīt vērtības", command=nolasīt).pack(pady=10)
logs.mainloop()
Notikumu apstrāde
Teksts
import tkinter as tk
logs = tk.Tk()
logs.title("Notikumi")
logs.geometry("400x350")
info = tk.Label(logs, text="Kustini peli vai klikšķini", font=("Arial", 12))
info.pack(pady=20)
# bind() – piesaistīt notikumu
def peles_kustība(notikums):
info.config(text=f"Pele: x={notikums.x}, y={notikums.y}")
def klikšķis(notikums):
info.config(text=f"Klikšķis: {notikums.x}, {notikums.y}")
def taustiņš(notikums):
info.config(text=f"Taustiņš: {notikums.keysym!r}")
logs.bind("<Motion>", peles_kustība) # Peles kustība
logs.bind("<Button-1>", klikšķis) # Kreisais klikšķis
logs.bind("<Button-3>", lambda e: info.config(text="Labais klikšķis!"))
logs.bind("<Key>", taustiņš) # Jebkurš taustiņš
logs.bind("<Return>", lambda e: info.config(text="Enter nospiests!"))
logs.bind("<Escape>", lambda e: logs.destroy()) # Escape aizver logu
# after() – aizkavēts izsaukums
def atjaunot():
info.config(text="Atjaunots!")
logs.after(2000, lambda: info.config(text="Gaida...")) # 2 sekundes
tk.Button(logs, text="Atjaunot (2s pēc tam)",
command=atjaunot).pack(pady=5)
logs.mainloop()
Dialogi un izvēlnes
🎨 ttk – mūsdienīgāki widgeti
Izmanto tkinter.ttk moduli stilizētākiem vidžetiem: ttk.Button, ttk.Entry, ttk.Combobox, ttk.Notebook (cilnes). Tie automātiski pielāgojas OS izskatam.
Teksts
import tkinter as tk
from tkinter import messagebox, filedialog, colorchooser, simpledialog
logs = tk.Tk()
logs.geometry("400x350")
rezultāts = tk.Label(logs, text="Rezultāts parādīsies šeit", wraplength=350)
rezultāts.pack(pady=20)
# messagebox
def rādīt_dialogs():
atbilde = messagebox.askyesno("Jautājums", "Vai tu esi programmētājs?")
rezultāts.config(text="Jā!" if atbilde else "Nē!")
def rādīt_kļūda():
messagebox.showerror("Kļūda", "Kaut kas nogāja greizi!")
# filedialog
def atvērt_failu():
ceļš = filedialog.askopenfilename(
title="Izvēlies failu",
filetypes=[("Teksta faili", "*.txt"), ("Visi faili", "*.*")]
)
if ceļš:
rezultāts.config(text=f"Izvēlēts: {ceļš}")
def saglabāt_failu():
ceļš = filedialog.asksaveasfilename(
defaultextension=".txt",
filetypes=[("Teksta faili", "*.txt")]
)
if ceļš:
rezultāts.config(text=f"Saglabāt uz: {ceļš}")
# colorchooser
def izvēlēties_krāsu():
krāsa = colorchooser.askcolor(title="Izvēlies krāsu")
if krāsa[1]:
logs.config(bg=krāsa[1])
rezultāts.config(text=f"Krāsa: {krāsa[1]}")
# Pogas
tk.Button(logs, text="Jā/Nē dialogs", command=rādīt_dialogs).pack(pady=3)
tk.Button(logs, text="Kļūdas dialogs", command=rādīt_kļūda).pack(pady=3)
tk.Button(logs, text="Atvērt failu", command=atvērt_failu).pack(pady=3)
tk.Button(logs, text="Saglabāt failu", command=saglabāt_failu).pack(pady=3)
tk.Button(logs, text="Izvēlēties krāsu", command=izvēlēties_krāsu).pack(pady=3)
logs.mainloop()