0%

🖼️ 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.

python

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()