modern tkinter kütüphaneleri
- customtkinter
- ttkbootstrap
widget’ların (bileşen) konumlandırması için 3 tane yerleşim yöneticisi var: pack, grid ve place
- grid: satır ve sütunlardan oluşan bir ızgara üzerinde düzenler (tablo gibi).
- pack: Widget’ları yatay/dikey bloklar halinde sıralar
- place: Widget’ları koordinatlara yerleştirir.
Aynı seviyede tek türk yerleşim yöntemi kullanılır. iç içe yerleşimlerde farklı yöntemler kullanılabilir.
Pack
- side: top, bottom, left, right
- fill: x, y, both
- expand: True, False
- anchor: n,s,w,e,ne,nw,se,sw
- padx, pady: sayısal değer, padx=5 veya padx=(4,6) gibi kullanılabilir.
Grid
- row: satir tamsayı
- column: sütun tamsayı
- rowspan: kaç satır tamsayı
- columnspan: kaç sütun tmsayı
- sticky: n,s,e,w, ve bunların 2’li, 3lü, 4lü kombinasyonu.
-
padx, padx: sayısal değer, padx=5 veya padx=(4,6) gibi
- weight: columnconfigure(0, weight=1), rowconfigure(1, weight=2) gibi kullanılır.
Place
- x, y
- relx, rely
Yerleşimle ilgili ayrıntılar için: https://pressbooks.pub/tkintergui/chapter/layout_managers/
Veri türleri
- StringVar()
- IntVar()
- DoubleVar()
- BooleanVar()
get() ve set() ile veri alınabilir ve set edilebilir.
Örnek:
name_var = tb.StringVar(value="my name") entered_name = name_var.get() age_var = tb.IntVar() age_var.set(25)
Temel widget’lar
- Frame: çerçeve
- Label: etiket
- Button
- Entry: metin/girdi kutusu
Kaynak: https://pressbooks.pub/tkintergui/chapter/basic-widgets-i/
Örnekler
import tkinter as tk
root = tk.Tk()
root.title("Pack Versiyonu")
root.geometry("250x200")
def topla():
sayi1 = float(entry1.get())
sayi2 = float(entry2.get())
sonuc = sayi1 + sayi2
sonuc_label.config(text=f"Sonuç: {sayi1 + sayi2}")
entry1 = tk.Entry(root)
entry1.pack(pady=5)
entry2 = tk.Entry(root)
entry2.pack(pady=5)
btn = tk.Button(root, text="Topla", command=topla)
btn.pack(pady=5)
sonuc_label = tk.Label(root, text="Sonuç: ")
sonuc_label.pack(pady=5)
root.mainloop()
import tkinter as tk
def topla():
sayi1 = float(entry1.get())
sayi2 = float(entry2.get())
sonuc = sayi1 + sayi2
sonuc_label.config(text=f"{sonuc}")
root = tk.Tk()
root.title("Pack Versiyonu")
root.geometry("300x350")
entry1 = tk.Entry(root)
entry1.pack(pady=5)
entry2 = tk.Entry(root)
entry2.pack(pady=5)
btn = tk.Button(root, text="Topla", command=topla)#
btn.pack(pady=5)
sonuc_label = tk.Label(root, text="Sonuç: ")
sonuc_label.pack(pady=5)
root.mainloop()
import tkinter as tk
root = tk.Tk()
root.title("Grid Versiyonu")
root.geometry("250x150")
def topla():
sayi1 = float(entry1.get())
sayi2 = float(entry2.get())
sonuc = sayi1 + sayi2
sonuc_label.config(text=f"Sonuç: {sonuc}")
root.columnconfigure(0, weight=1)
entry1 = tk.Entry(root, width=20)
entry1.grid(row=0, column=0, pady=5, padx=10, sticky='ew')
entry2 = tk.Entry(root, width=20)
entry2.grid(row=1, column=0, pady=5, padx=10, sticky='ew')
btn = tk.Button(root, text="Topla", command=topla)
btn.grid(row=2, column=0, pady=10, padx=10, sticky='ew')
sonuc_label = tk.Label(root, text="Sonuç: ")
sonuc_label.grid(row=3, column=0, pady=5, padx=10, sticky='ew')
root.mainloop()
import tkinter as tk
root = tk.Tk()
root.title("Grid & Tkinter Değişkenleri Versiyonu")
root.geometry("250x150")
def topla():
s1 = sayi1_var.get()
s2 = sayi2_var.get()
sonuc = s1 + s2
sonuc_var.set(f"Sonuç: {sonuc}")
root.columnconfigure(0, weight=1)
sayi1_var = tk.DoubleVar(value=0)
entry1 = tk.Entry(root, width=20, textvariable=sayi1_var)
entry1.grid(row=0, column=0, pady=5, padx=10, sticky='ew')
sayi2_var = tk.DoubleVar(value=0)
entry2 = tk.Entry(root, width=20, textvariable=sayi2_var)
entry2.grid(row=1, column=0, pady=5, padx=10, sticky='ew')
btn = tk.Button(root, text="Topla", command=topla)
btn.grid(row=2, column=0, pady=10, padx=10, sticky='ew')
sonuc_var = tk.StringVar(value="Sonuç: ")
# sonuc_var.set()
sonuc_label = tk.Label(root, textvariable=sonuc_var)
sonuc_label.grid(row=3, column=0, pady=5, padx=10, sticky='ew')
root.mainloop()
import tkinter as tk
from tkinter import filedialog
from PIL import Image, ImageTk
def open_image():
file_path = filedialog.askopenfilename(filetypes=[("Image Files", "*.jpg *.jpeg *.png")])
if file_path:
# Load and display image
img = Image.open(file_path)
img.thumbnail((600, 600)) # Resize while maintaining aspect ratio
photo = ImageTk.PhotoImage(img)
canvas.image = photo # Keep reference
canvas.create_image(0, 0, anchor=tk.NW, image=photo)
file_label.config(text=file_path)
def open_image():
file_path = filedialog.askopenfilename(filetypes=[("Image Files", "*.jpg *.jpeg *.png")])
if file_path:
# Load and display image
img = Image.open(file_path)
img.thumbnail((600, 600)) # Resize while maintaining aspect ratio
photo = ImageTk.PhotoImage(img)
canvas.image = photo # Keep reference
canvas.create_image(0, 0, anchor=tk.NW, image=photo)
file_label.config(text=file_path)
root = tk.Tk()
root.title("Image")
root.geometry("800x600")
# Top Frame (File Dialog)
top_frame = tk.Frame(root, height=30)
top_frame.pack(side="top", fill="x")
open_button = tk.Button(top_frame, text="Open Image", command=open_image)
open_button.pack(side="left", padx=5, pady=2)
file_label = tk.Label(top_frame, text="No image selected")
file_label.pack(side="left", padx=5)
# Main Content Area
main_frame = tk.Frame(root)
main_frame.pack(fill="both", expand=True)
# Left Canvas (Image Display)
left_frame = tk.Frame(main_frame, width=600, bg='gray')
left_frame.pack(side="left", fill="both", expand=True)
canvas = tk.Canvas(left_frame, width=600, height=600)
canvas.pack(fill="both", expand=True)
# Right Panel (Controls)
right_frame = tk.Frame(main_frame, width=200, bg='lightgray')
right_frame.pack(side="right", fill="y")
# Right Panel Controls
control_frame = tk.LabelFrame(right_frame, text="Image Processing", padx=5, pady=5)
control_frame.pack(padx=10, pady=10, fill="x")
# # Example controls
tk.Label(control_frame, text="Filter:").pack(anchor="w")
tk.Button(control_frame, text="Grayscale").pack(fill="x", pady=2)
tk.Button(control_frame, text="Blur").pack(fill="x", pady=2)
tk.Button(control_frame, text="Sharpen").pack(fill="x",pady=2)
# # Parameters Section
param_frame = tk.LabelFrame(right_frame, text="Parameters", padx=5, pady=5)
param_frame.pack(padx=10, pady=10, fill="x")
tk.Label(param_frame, text="Threshold:").pack(anchor="w")
threshold_slider = tk.Scale(param_frame, from_=0, to=255, orient="horizontal")
threshold_slider.pack(fill=tk.X)
root.mainloop()
import cv2
import tkinter.filedialog
import customtkinter as ctk
from PIL import Image, ImageTk
from ultralytics import YOLO
# Model yükle
model = YOLO("yolo12x.pt")
# Global değişkenler
image = None
image_path = None
results = None
boxes = []
def open_image():
global image, image_path, results, boxes
file = tkinter.filedialog.askopenfilename(filetypes=[("Image files", "*.jpg *.png *.jpeg")])
print(file)
if not file:
return
image_path = file
image = cv2.imread(image_path)
image_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
image_resized = cv2.resize(image_rgb, (600, 400))
im_pil = Image.fromarray(image_resized)
imgtk = ImageTk.PhotoImage(im_pil)
canvas.imgtk = imgtk
canvas.create_image(0, 0, anchor="nw", image=imgtk)
file_label.configure(text=f"{image_path.split('/')[-1]}")
# YOLO tahmini
results = model.predict(source=image, classes=None)[0]
boxes = results.boxes
# Slider ayarları
box_slider.configure(to=len(boxes) - 1 if boxes else 0)
update_box(0)
def update_box(index):
if not boxes:
return
index = int(index)
box = boxes[index]
class_id = int(box.cls)
label = model.names[class_id]
conf = float(box.conf)
x, y, w, h = map(int, box.xywh[0])
# Resme kutu çiz
image_copy = image.copy()
cv2.rectangle(image_copy, (x - w // 2, y - h // 2), (x + w // 2, y + h // 2), (0, 255, 0), 2)
cv2.putText(image_copy, f"{label} ({conf:.2f})", (x - w // 2, y - h // 2 - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 1)
image_rgb = cv2.cvtColor(image_copy, cv2.COLOR_BGR2RGB)
image_resized = cv2.resize(image_rgb, (600, 400))
im_pil = Image.fromarray(image_resized)
imgtk = ImageTk.PhotoImage(im_pil)
canvas.imgtk = imgtk
canvas.create_image(0, 0, anchor="nw", image=imgtk)
info_text.configure(text=f"Label: {label}\nConfidence: {conf:.2f}\nXYWH: {box.xywh[0].cpu().numpy().astype(int)}")
# Uygulama ayarları
ctk.set_appearance_mode("light")
ctk.set_default_color_theme("blue")
root = ctk.CTk()
root.title("Araç Tespit Arayüzü")
root.geometry("900x600")
# Üst panel
top_frame = ctk.CTkFrame(root, height=40)
top_frame.pack(side="top", fill="x", padx=10, pady=5)
open_button = ctk.CTkButton(top_frame, text="Resim Aç", command=open_image)
open_button.pack(side="left", padx=10)
file_label = ctk.CTkLabel(top_frame, text="Resim seçilmedi")
file_label.pack(side="left", padx=10)
# Ana içerik
main_frame = ctk.CTkFrame(root)
main_frame.pack(fill="both", expand=True, padx=10, pady=5)
# Sol panel (Canvas)
left_frame = ctk.CTkFrame(main_frame, width=600)
left_frame.pack(side="left", fill="both", expand=True)
canvas = ctk.CTkCanvas(left_frame, width=600, height=400, bg="gray")
canvas.pack(padx=10, pady=10)
# Sağ panel
right_frame = ctk.CTkFrame(main_frame, width=250)
right_frame.pack(side="right", fill="y", padx=10)
ctk.CTkLabel(right_frame, text="Araç Seç", font=("Arial", 14)).pack(pady=(10, 0))
box_slider = ctk.CTkSlider(right_frame, from_=0, to=0, command=update_box)
box_slider.pack(fill="x", padx=20, pady=10)
info_text = ctk.CTkLabel(right_frame, text="", justify="left", anchor="w", wraplength=220)
info_text.pack(padx=20, pady=10)
root.bind("<Escape>", lambda x: root.destroy())
root.mainloop()
Tkinter tutorial tavsiyesi: https://www.youtube.com/watch?v=mop6g-c5HEY