Tkinter entry de giriş karakter adetini sınırlamak

Merhaba…62 yaşında python başlayınca geçmişin kodları çözüm olmuyor. Entryde giriş alanınında sadece sayısal girişi hallettim. Aynı anda girilen karakter sayısı belli uzunluğu geçmesin istiyorum. Girerken karakteri kabul etmesin. Text ortamda yaparken pencere ortamında Entrty de nasıl yapacağımı çıkaramadım. Mesela tarih girerken gün 2 karakterden uzun olmasın ve 01 ile 31 arasında kalsın. Gün yada aya 1 girerse 01 olarak alsın. Yardımcı olursanız minnettar kalırım. Sınav takip için veritabanı ve tkinter beraber çalıştırıp basit bir şey yapıyorum. Basit ama buna takıldım.

fikir vermesi açısından yazıyorum, tarihi gün ay yıl olacak şekilde 3 spinbox ile alabilirsiniz. Diğer bir seçenekte tkcalendar modülünü kurup kullanmak. Hiç uygulamalarımda bu 2 sini de kullanmadım ama youtube videoları var.

from tkinter import *
from tkcalendar import DateEntry


window = Tk()
window.title("Tarihi Seç")
window.geometry("300x300")

def kaydet():
    print(f"isim : {isim_ent.get()}, soyisim: {soyisim_ent.get()}, dogum tarihi: {tarih_ent.get()}")

isim = Label(window, text="İsim")
isim.grid(row=0, column=0)
isim_ent = Entry(window)
isim_ent.grid(row=0, column=1)

soyisim = Label(window, text="Soyisim")
soyisim.grid(row=1, column=0)
soyisim_ent = Entry(window)
soyisim_ent.grid(row=1, column=1)

dogumtarihi = Label(window, text="Doğum Tarihi")
dogumtarihi.grid(row=2, column=0)
tarih_ent = DateEntry(window, locale='tr_TR',  date_pattern='dd/mm/yyyy')
tarih_ent.grid(row=2, column=1)

buton = Button(window, text="Kaydet", command=kaydet)
buton.grid(row=3, column=0)

window.mainloop()

bende merak ettim calendar kullanımını doğru çalışıyor ama tarih seçerken ilk önce ay sonra yıl sonra gün seçmek hata yapmadan zor.

Aşağıdaki örneği inceleyebilir misiniz?

import tkinter as tk


def max_char_limit(event: tk.Event, max_char: int):
    if len(event.widget.get()) > max_char:
        event.widget.delete(max_char, "end")


def only_numeric(event: tk.Event):
    if not event.widget.get().isnumeric():
        event.widget.delete(event.widget.index("insert") - 1, "end")


def limit_range(event: tk.Event, start: int, end: int):
    if (
            event.widget.get().isnumeric()
            and not
            int(event.widget.get()) in range(start, end + 1)
    ):
        event.widget.delete(event.widget.index("insert") - 1, "end")


root = tk.Tk()

entry = tk.Entry(master=root)
entry.pack()
entry.bind(
    sequence="<KeyRelease>",
    func=lambda event: [
        max_char_limit(event=event, max_char=2),
        only_numeric(event=event),
        limit_range(event=event, start=1, end=30)
    ]
)

root.mainloop()
import tkinter as tk
from tkinter import ttk

window = tk.Tk()
window.title('Tarih Format')
window.geometry('280x200')
window.config(padx=10, pady=10)


def yaz():
    gunsayisini19 = [var_gun.get().zfill(2) if len(var_gun.get()) == 1 else var_gun.get()]
    tarih = (gunsayisini19[0], aylar[var_ay.get()], (var_yil.get()))
    tarih = "/".join(tarih)
    lbl_sonuc["text"] = tarih


header = ttk.Label(window, text="Tarihi Dönüştür", font=(".", 14))
header.grid(row=0, column=0, columnspan=4)
aylar = {"Ocak": "01", "Şubat": "02", "Mart": "03", "Nisan": "04", "Mayıs": "05", "Haziran": "06", "Temmuz": "07",
         "Ağustos": "08", "Eylül": "09", "Ekim": "10", "Kasım": "11", "Aralık": "12"}

gunler = [i for i in range(1, 32)]
yillar = [i for i in range(1901, 2051)]

var_gun = tk.StringVar()
var_ay = tk.StringVar()
var_yil = tk.StringVar()

lbl_gun = ttk.Label(window, text="Gün")
lbl_gun.grid(row=1, column=1)
cbx_gun = ttk.Combobox(window, width=4, textvariable=var_gun, values=gunler)
cbx_gun.grid(row=2, column=1)
cbx_gun.set(1)

lbl_ay = ttk.Label(window, text="Ay")
lbl_ay.grid(row=1, column=2)
cbx_ay = ttk.Combobox(window, width=8, textvariable=var_ay, values=list(aylar.keys()))
cbx_ay.grid(row=2, column=2)
cbx_ay.set("Ocak")

lbl_yil = ttk.Label(window, text="Yıl")
lbl_yil.grid(row=1, column=3)
cbx_yil = ttk.Combobox(window, width=6, textvariable=var_yil, values=yillar)
cbx_yil.grid(row=2, column=3)
cbx_yil.set(2022)

lbl_dogumtarihi = ttk.Label(window, text="Doğum Tarihi:")
lbl_dogumtarihi.grid(row=2, column=0)

btn_yazdir = ttk.Button(window, text="Sonuçları Yazdır", command=yaz)
btn_yazdir.grid(row=3, column=0, columnspan=4, pady=20)

lbl_sonuc = ttk.Label(window, text="", font=(".", 20))
lbl_sonuc.grid(row=4, column=0, columnspan=4)

window.mainloop()

bu daha güzel oldu gibi. tüm tarihler aynı formatta gönderilir databaseye. tarihler arasında nokta(.).- / gibi işaret farkları da önlenmiş olur.

İbrahim bey teşekkür ederim… ilginize. Python konusunda eksiklerimin çok olduğu kesin. 2 kitap bitirmekle olmuyor. Bu konuda iyi eğitim veren izmirde bildipğiniz bir yer var mı ? Bu şekilde sizleride sürekli rahatsız etmek istemem
Teşekkürler…:pray:

Teşekkürler…ilginiz için sağolun… tkinterde eksiklerim çok.
Fırat Özgül diye bir yazılımcının notlarına başladım. Bir sorum daha var. Pythonda ya,dığımız bu kodları mobil uygulamasına çevirmek mümlün mü ? Pyinstaller ile exe oluyor ama apk extension derlemek mümkün mü ?

Kivy ile yapılıyor mobil ıygulamalar.

Teşekkürler…kivy bakmıştım ama oda başlıbaşına bir konu. Tkinter uygulamalarını aynı görsellikte yapma imkanı var mı ? Yine buton, combobox gibi. Birde eğitim konusunda iki kanal önermişti bir arkadaş mesajı bulamadım. İvei+ gibi diğeride …demy.com du sanırım.

tkinterde görsellik açısından zenginlik istiyorsanız Customtkinter yada Bootstrap var onlarlada görsellik artar. Tkinterin kendi içinde görselliğini arttırmak içinde butonlar için kendi yaptığınız buton resimlerini, arkaplan için canvası kullanabilirsiniz. youtube codemy.com farklı diller için eğitim videoları var, tkinter.com kanalı var aynı kişinin tkinter görselliğini Bootstrap ile anlatıyor. evie+ academy python videoları türkçe,