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()
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
@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.
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()
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.
İkincisi kodlarınızı burada paylaşabilirseniz, daha rahat yardımcı olabiliriz.
pardon dilde olupbiten:
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.
çok tşk ederim dildeolup…
hata vermiyor
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…