Entry tarih formatı

Mrb arkadaşlar entry alanına tarih girmek istiyorum şu şekilde:28.06.2019 kulanıcıyı bu formata zorlamak istiyorum. xx.xx.xxxx
çok araştırdım ama istediğim sonuca ulaşamadım. İyi akşamlar…

Cok az şey veriyorsun. Entry alanı neresi? Inputu nereden alıyorsun? Web app mi bu? Hangi dil hangi teknoloji?
Kısıtlı bilgilerle sana önerebileceğim sadece regular expression ile gelen tarihi validate etmen olacak.

[0-9]{2}\.[0-9]{2}\.[0-9]{4}

işte…
02.04.1999
dd.mm.yyyy

python tkinter entry alanı kulanıcı tarih değeri dışına çıkamasın

Tam olarak nasıl bir widget tasarlamak istiyorsunuz bilmiyorum ama, bir fikir vermesi açısından aşağıdaki kodları bir inceleyin isterseniz:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import tkinter as tk
from datetime import datetime as dt

root = tk.Tk()
entry = tk.Entry(root)
entry.pack()
label = tk.Label(root, text="Tarih girilmedi.")
label.pack()


def f(event):
    try:
        date = dt.strptime(event.widget.get(), "%d.%m.%Y")
        label.configure(text="Tarih girildi.")
    except ValueError:
        label.configure(text="Tarih girilmedi.")
        
        
entry.bind("<KeyRelease>", f)
root.mainloop()
1 Like
import tkinter as tk
from datetime import datetime as dt
import re

root = tk.Tk()
entry = tk.Entry(root)
entry.pack()
label = tk.Label(root, text="Tarih girilmedi.")
label.pack()


def f(event):
    mached = re.match("[0-9]{2}\.[0-9]{2}\.[0-9]{4}", entry.get())
    if mached:
        label.configure(text="Tarih girildi.")
    else:
        label.configure(text="Tarih girilmedi.")
        
        
entry.bind("<KeyRelease>", f)
root.mainloop()

aha bu da regex ile

2 Likes

@override’in yazdığı kodlara göre, kullanıcı gün veya ay sayılarını girerken iki rakam yazmak zorunda.

Benim yazdığım kodlara göre kullanıcı 1.1.2018 veya 01.1.2018 yazabilir, çünkü her iki veri de aynı datetime verisidir.

Ama eğer diyorsanız ki, tarih biçimi 01.01.2018 biçimine benzer olsun, o zaman kodları bu biçime uygun olacak şekilde yeniden düzenleyebilirsiniz.

1 Like

Yine regex ile o halledilir. Senin yonetmin her turlu daha mantikli ama

Mesela sizin yazdığınız kodlara göre kullanıcı 30.30.1999 yazarsa, yazılan şey bir tarih olmamasına rağmen regex örüntüsüne uyduğu için, label widgetinin text argümanı "Tarih girildi." olarak değişecek.

Bu arada bir önceki mesajımda kullanıcının girmesi gereken tarih biçiminin aşağıdaki gibi yeniden düzenlenmesinden bahsediyordum:

def f(event):
    if len(event.widget.get()) == 10:
        try:
            date = dt.strptime(event.widget.get(), "%d.%m.%Y")
            label.configure(text="Tarih girildi.")
        except ValueError:
            label.configure(text="Tarih girilmedi.")
    else:
        label.configure(text="Tarih girilmedi.")

Regex guzel bir arac ama tarih dogrulamasi yapmak icin iyi bir arac degil. En basidinden, 99.99.9999 sorunu var. Daha karmasik olarak, 29.02.2100 ve 09.09.1752 gibi dogru gozukup yanlis olan tarihler var. En yakindaki datetime kutuphanenizi kullaniniz.

Geliştirilebilir bir kod

# coding: utf-8

import tkinter as tk

class DateEntry(tk.Frame):
    def __init__(self, master, frame_look={}, **look):
        args = dict(relief=tk.SUNKEN, border=1)
        args.update(frame_look)
        tk.Frame.__init__(self, master, **args)

        args = {'relief': tk.FLAT}
        args.update(look)

        self.entry_1 = tk.Entry(self, width=2, **args)
        self.label_1 = tk.Label(self, text='/', **args)
        self.entry_2 = tk.Entry(self, width=2, **args)
        self.label_2 = tk.Label(self, text='/', **args)
        self.entry_3 = tk.Entry(self, width=4, **args)

        self.entry_1.pack(side=tk.LEFT)
        self.label_1.pack(side=tk.LEFT)
        self.entry_2.pack(side=tk.LEFT)
        self.label_2.pack(side=tk.LEFT)
        self.entry_3.pack(side=tk.LEFT)

        self.entries = [self.entry_1, self.entry_2, self.entry_3]

        self.entry_1.bind('<KeyRelease>', lambda e: self._check(0, 2))
        self.entry_2.bind('<KeyRelease>', lambda e: self._check(1, 2))
        self.entry_3.bind('<KeyRelease>', lambda e: self._check(2, 4))

    def _backspace(self, entry):
        cont = entry.get()
        entry.delete(0, tk.END)
        entry.insert(0, cont[:-1])

    def _check(self, index, size):
        entry = self.entries[index]
        next_index = index + 1
        next_entry = self.entries[next_index] if next_index < len(self.entries) else None
        data = entry.get()

        if len(data) > size or not data.isdigit():
            self._backspace(entry)
        if len(data) >= size and next_entry:
            next_entry.focus()

    def get(self):
        return [e.get() for e in self.entries]

frame = tk.Tk()
frame.title("DateEntry")
frame.geometry("300x300")
DateEntry(master=frame).pack()
frame.mainloop()
1 Like

Arkadaşlar programcılığa ara vermiştim.Önceleri Delphi3 kullanırdım textbox alanına tarih girmek için zorlanmazdım. Pythonu her ihtiyacımı karşılamak ve kendimi geliştirmek için yeterli ve güçlü bir dil olarak görüyorum. Pythonda Gui programcılığı beni baya zorladı ama pes etmeyi düşünmüyorum. Delidolu arkdaşımızın gönderdiği kod iş görüyor.diğer arkadaşlarımızın gönderdiği kodlarda ise sıkıntı var, yanlış tarih girilebiliyor. Tüm arkadaşlarıma tşk ederim tüm kodlar bana fikir vermesi açısından önemli bu arada validation expression kavramınıda ilk defa bu ortmada gördüm.Bu kavram da gelişmem açısından önemlidir… tekrar tşk ederim…

Mrb arkadaşlar
delidolu arkadaşımızın
def f(event) fonksiyonunu projeme uyguladığımda

AttributeError: ‘NoneType’ object has no attribute ‘bind’ hatası oluyorum…

Merhaba.

Öncelikle delidolu değil dildeolupbiten. :slight_smile:

İkincisi kodlarınızı burada paylaşabilirseniz, daha rahat yardımcı olabiliriz.

1 Like

pardon dilde olupbiten::slight_smile:

    self.ent_ilk_tar=Entry(self.oplani,relief=FLAT).place(x=50,y=70,width=60)
    self.ent_ilk_tar.bind("<KeyRelease>", self.f)
    self.lab_taksit_tutar=Label(self.oplani,text="Ö.Tutarı").place(x=180,y=50)
    

def f(event):
    
    try:
        
        date = dt.strptime(event.widget.get(), "%d/%m/%Y")
        print(text="Tarih girildi.")
    except ValueError:
        print("Tarih girilmedi.")

Tüm kodları paylaşsanız?

from tkinter import ttk
from tkinter import *
from tkinter import messagebox
from tkcalendar import *

import sqlite3
#import string
from datetime import datetime as dt
#from tkcalendar import DateEntry

class Anamenu():
    def __init__(self,master):#ana menü
        self.deger=2
        self.sayac=8
        self.master=master
        self.master.title("KASA PROGRAMI")
        self.master.geometry("{0}x{1}+0+0".format(master.winfo_screenwidth(),master.winfo_screenheight()))#"0X1+0+0 TAMEKRAN YAPAR
        self.vcmd =(master.register(self.validate),                           #sayısal
                          '%d', '%i', '%P', '%s', '%S', '%v', '%V', '%W')     #sayısal

        self.tarih={"31/02/2020":"29/02/2020","31/02/2021":"28/02/2021","31/02/2022":"28/02/2022","31/02/2023":"28/02/2023","30/02/2017":"28/02/2017",
                   "31/04/2020":"30/04/2020","31/04/2021":"30/04/2021","31/04/2022":"30/04/2022","31/04/2023":"30/04/2023","30/02/2018":"30/02/2018",
                   "31/06/2020":"30/06/2020","31/06/2021":"30/06/2021","31/06/2022":"30/06/2022","31/06/2023":"30/06/2023","30/02/2019":"30/02/2019",
                   "31/09/2020":"30/09/2020","31/09/2021":"30/09/2021","31/09/2022":"30/09/2022","31/09/2023":"30/09/2023","30/02/2020":"29/02/2020",
                   "31/11/2020":"30/11/2020","31/11/2021":"30/11/2021","31/11/2022":"30/11/2022","31/11/2023":"30/11/2023","30/02/2021":"28/02/2021",
                   "31/02/2024":"29/02/2024","31/02/2025":"28/02/2025","31/02/2019":"28/02/2019","31/02/2018":"28/02/2018","30/02/2022":"28/02/2022",
                   "31/04/2024":"30/04/2024","31/04/2025":"30/04/2025","31/04/2019":"30/04/2019","31/04/2018":"30/04/2018","30/02/2023":"28/02/2023",
                   "31/06/2024":"30/06/2024","31/06/2025":"30/06/2025","31/06/2019":"30/06/2019","31/06/2018":"30/06/2018","30/02/2024":"29/02/2024",
            	   "31/09/2024":"30/09/2024","31/09/2025":"30/09/2025","31/09/2019":"30/09/2019","31/09/2018":"30/09/2018","31/02/2025":"28/02/2025",
            	   "31/11/2024":"30/11/2024","31/11/2025":"30/11/2025","31/11/2019":"30/11/2019","31/11/2018":"30/11/2018", "31/02/2018":"28/02/2018"}
    def sayii(self,a):
        self.a=a
        print("serrr"+self.a)
        
    def validate(self, action, index, value_if_allowed,prior_value, text,#Sayısal karaktere zorlar float----------------------
        validation_type, trigger_type, widget_name):
        if(action=="1"):
            if text in '0123456789.-+':
                try:
                    float(value_if_allowed)
                    return True
                except ValueError:
                    return False
            else:
                return False
        else:
            return True
##    def sqlOgrenci_kayit(self)
    def menucubugu(self):#------------------------------ANA MENU MENUBAR------------------------------------------
        self.menubar=Menu(self.master)
        self.kayit=Menu(self.menubar,tearoff=0)
        self.kayit.add_command(label="Öğrenci Kayıt",command=self.kayit_kaydet)
        self.kayit.add_command(label="Personel Kayıt",command=self.personel_kaydet)
        self.kayit.add_command(label="Sınav Kulübü Kayıt")
        self.kayit.add_command(label="Gelir Kalemleri")
        self.kayit.add_command(label="Gider Kalemleri")
        self.menubar.add_cascade(label="--KAYIT---",font=("Verdana 13" ),menu=self.kayit)
        self.gelir=Menu(self.menubar,tearoff=0)
        self.menubar.add_cascade(label="--GELİR--",font=("times", 35),menu=self.gelir)
        self.master.config(bg="lightgreen",menu=self.menubar)
    def sayi(self):
        print("maraba")
    def formEntry(self,baslik,a):
        self.a=a
        self.baslik=baslik
        self.pencere=Toplevel(self.master)
        self.pencere.title(self.baslik)
        self.pencere.geometry("600x300")
        self.sayac=1
        while self.sayac<5:
            self.c=Entry(self.pencere,bd=3)
            self.c.place(x=120,y=self.sayac*20)
            self.sayac+=1
    def penc_sil(self):
        self.kayitwin.destroy()
        self.kayitwin
        messagebox(info,"helleo")
    def kayit_kaydet(self):#öğrenci kayıt penceresi------------------------------------------------------------------------------
        self.kayitwin=Toplevel(self.master)
        self.kayitwin.title("Öğrenci Kaydı")
        self.kayitwin.geometry("811x500")
        self.kayitwin.config(bg="Light Salmon")
        self.k1=Label(self.kayitwin,text="Öğrenci No",justify=CENTER,font=("verdana 10 bold"),bg="Light Salmon",width=17).place(x=5,y=10)
        self.k2=Label(self.kayitwin,text="Öğrenci Adı",justify=CENTER,font=("verdana 10 bold"),bg="Light Salmon",width=17).place(x=5,y=57)
        self.k3=Label(self.kayitwin,text="Öğrenci Soyadı",justify=CENTER,font=("verdana 10 bold"),bg="Light Salmon",width=17).place(x=5,y=107)
        self.k4=Label(self.kayitwin,text="Veli Adı",justify=CENTER,font=("verdana 10 bold"),bg="Light Salmon",width=17).place(x=5,y=157)
        self.k4=Label(self.kayitwin,text="Sınıfı",justify=CENTER,font=("verdana 10 bold"),bg="Light Salmon",width=17).place(x=5,y=207)
        self.e1=Entry(self.kayitwin,bd=3,validate="key",validatecommand=self.vcmd)
        self.e1.place(x=150,y=10,width=65)
        self.e2=Entry(self.kayitwin,bd=3,font=("Times 11"))
        self.e2.place(x=150,y=57,width=150)
        self.e3=Entry(self.kayitwin,bd=3)
        self.e3.place(x=150,y=107,width=150)
        self.e4=Entry(self.kayitwin,bd=3)
        self.e4.place(x=150,y=157,width=160)
        self.sinif=ttk.Combobox(self.kayitwin,values=["9","10","11","12","Mezun"],state='readonly')
        self.sinif.place(x=150,y=207,width=60)
        self.sinif.set("seçiniz")
        self.kbutton=Button(self.kayitwin,text="KAYDET.....",cursor="plus",width=21,height=1,font=("verdana 10 bold"))
        self.kbutton.place(x=99,y=270)
        self.e1.focus_set()
        self.oplani=LabelFrame(self.kayitwin,text="Ödeme Planı")
        self.oplani.place(x=350,y=8,width=400,height=500)
        self.lab_ucret=Label(self.oplani,text="Kayıt Ücreti:")
        self.lab_ucret.place(x=10,y=8)
        self.ent_ucret=Entry(self.oplani,validate="key",validatecommand=self.vcmd)
        self.ent_ucret.place(x=80,y=8,width=55)
        self.lab_taksit=Label(self.oplani,text="Taksit Sayısı:")
        self.lab_taksit.place(x=150,y=10)
        self.ctak_say=ttk.Combobox(self.oplani,values=[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15],state='readonly')
        self.ctak_say.place(x=220,y=10,width=41)
        self.ctak_say.current(0)
        self.v=IntVar()
        Radiobutton(self.oplani,text="10'un katı Bölsün",variable=self.v,value=1).place(x=270,y=5)
        Radiobutton(self.oplani,text="Tam Bölsün",variable=self.v,value=2).place(x=270,y=25)
        self.v.set(1)
        self.lab_ilk=Label(self.oplani,text="Taks.No ",font=("verdana 8 bold underline")).place(x=7,y=50)
        self.lab_ilkT=Label(self.oplani,text="1.Taksit").place(x=10,y=73)
        self.ent_ilk_tar=Entry(self.oplani,relief=FLAT)
        self.ent_ilk_tar.bind("<KeyRelease>", self.f)
        self.ent_ilk_tar.place(x=80,y=73,width=65)
        self.lab_tarih=Label(self.oplani,text="Ö.Tarihi  ",font=("verdana 8 bold underline")).place(x=80,y=50)
        self.lab_taksit_tutar=Label(self.oplani,text="Ö.Tutarı",font=("verdana 8 bold underline")).place(x=220,y=50)
        self.ent_taksit_tutar=Entry(self.oplani,relief=FLAT,validate="key",validatecommand=self.vcmd)
        self.ent_taksit_tutar.place(x=230,y=73,width=50)
        self.but_taksit=Button(self.oplani,text="HESAPLA",cursor="plus",width=9,height=1,font=("verdana 7 bold"),fg="blue",command=self.fonk)
        self.but_taksit.place(x=295,y=65,height=27)
    def t_hesapla(self):
        pass
    def f(self,event):
        if len(event.widget.get()) == 10:
            try:
                date = dt.strptime(event.widget.get(), "%d/%m/%Y")
                self.deger=1
                print("deger Dogru",self.deger)
            except ValueError:
                if event.widget.get()in self.tarih:
                    
                    self.c=event.widget.get()
                    event.widget.delete(first=0,last=20)
                    event.widget.insert(0,self.tarih[self.c])
                    self.deger=1
                    print("self.c",self.c)
                else:
                    self.deger=2
                print("deger yanlış",self.deger)
        else:
            self.deger=2
    def t_kontrol(self,a):
        self.a=a
        if widget.get() in self.tarih:
            self.x=event.widget.get()
            widget.delete(first=0,last=20)
            widget.insert(0,self.tarih[self.x])
            self.deger=1
            
        else:
            pass
            
            
    def fonk(self):
       # self.tarih_kontrol(self.ent_ilk_tar.get())
        
        if self.ent_ucret.get()=="":
            self.ent_ucret.insert(0,0)
        if self.ent_taksit_tutar.get()=="":
            self.ent_taksit_tutar.insert(0,0)
        self.kayit
        self.certaksit=LabelFrame(self.oplani,border=0)
        self.certaksit.place(x=0,y=92,width=395,height=350)
        if self.ent_ilk_tar.get() in self.tarih:
            self.s=self.tarih[self.ent_ilk_tar.get()]
            self.ent_ilk_tar.delete(0,END)
            print(self.s)
            print(str(self.s[3:5]))
            self.ent_ilk_tar.insert(0,self.s)
            deger=1
        self.n=self.ctak_say.current()+1
        print(self.n)
        if self.deger==2 or int(self.ent_ucret.get())==0 or int(self.ent_taksit_tutar.get())==0:
            messagebox.showerror("hata","yanlış tarih veya ücret girilmemiş",parent=self.kayitwin)
        else:
            self.certaksit.destroy()
            self.certaksit=LabelFrame(self.oplani,border=0)
            self.certaksit.place(x=0,y=92,width=395,height=350)
            self.yil=self.ent_ilk_tar.get()[6:]
            self.tarih2=self.ent_ilk_tar.get()
            for self.i in range(2,self.n+1): # 6=>5001
                self.satir=-18+int(self.i-1)*22
                self.mod=str((int(self.tarih2[3:5])+self.i-1)%12)
                if self.mod=="0":
                    self.mod="12"
                if self.mod=="1":
                    self.yil=str(int(self.yil)+1)
                else:
                    pass
                if len(self.mod)==1:
                    self.mod="0"+self.mod
                self.mod=self.tarih2[0:3]+self.mod+"/"+self.yil
                exec(f"self.l{self.i}=Label(self.certaksit,text='{self.i}.Taksit')")
                exec(f"self.l{self.i}.place(x=0,y=self.satir,width=65)")
                exec(f"self.d{self.i} = DateEntry(self.certaksit)")
                exec(f"self.d{self.i}.insert(0,self.mod)")
                exec(f"self.d{self.i}.place(x=80,y=self.satir,width=65)")
                #exec(f"self.t_kontrol(self.d{self.i}.get())")
                exec(f"self.t{self.i} = Entry(self.certaksit)")
                exec(f"self.t{self.i}.place(x=222,y=self.satir,width=50)")
               # exec(f"self.yil=self.d{self.i}.get()[6:]")
         
    def personel_kaydet(self):#Personel kayıt penceresi------------------------------------------------------------------------------
        self.personelwin=Toplevel(self.master)
        self.personelwin.title("PERSONEL KAYIT EKRANI")
        self.personelwin.geometry("360x330")
        self.personelwin.config(bg="Thistle")
        self.k1=Label(self.personelwin,text="Personel Adı",justify=CENTER,font=("verdana 10 bold"),bg="Thistle",width=17)
        self.k1.place(x=5,y=15)
        self.k2=Label(self.personelwin,text="Personel Soyadı",justify=CENTER,font=("verdana 10 bold"),bg="Thistle",width=17)
        self.k2.place(x=5,y=62)
        self.k3=Label(self.personelwin,text="Görevi",justify=CENTER,font=("verdana 10 bold"),bg="Thistle",width=17)
        self.k3.place(x=5,y=112)
        self.e1=Entry(self.personelwin,bd=3)
        self.e1.place(x=150,y=15,width=65)
        self.e2=Entry(self.personelwin,bd=3,font=("Times 11"))
        self.e2.place(x=150,y=62,width=150)
        self.e3=Entry(self.personelwin,bd=3)
        self.e3.place(x=150,y=112,width=150)
        self.sinif=ttk.Combobox(self.personelwin,values=["9","10","11","12","Mezun"],state='readonly')
        self.sinif.place(x=150,y=212,width=60)
        self.sinif.set("seçiniz")
        self.kbutton=Button(self.personelwin,text="KAYDET.....",cursor="plus",width=21,height=1,font=("verdana 10 bold"))
        self.kbutton.place(x=99,y=270)
        self.e1.focus_set()        
        
root=Tk()

my_gui=Anamenu(root)
my_gui.menucubugu()


root.mainloop()

```

f(event) fonksiyonunu f(self, event) şeklinde değiştirin. Ayrıca self.ent_ilk_tar entrisinin place metodunu widgeti oluşturduktan sonra çağırın.

        self.ent_ilk_tar=Entry(self.oplani,relief=FLAT)
        self.ent_ilk_tar.place(x=50,y=70,width=60)
        self.ent_ilk_tar.bind("<KeyRelease>", self.f)

Sonra bir daha deneyin.

1 Like

çok tşk ederim dildeolup…
hata vermiyor

1 Like

Rica ederim kolay gelsin.

Günaydın arkadaşlar;

programımda entry alanında takvime göre tarih seçilmesini istediğimde, programım yavaşlıyor.
Sıkıntı benim yazdığım programda mı yoksa calender modülü sistemi yavaşlatıyor mu? Bu konuda tecrübesi olan arkadaşlarımın fikrini almak isterim Tşkler…