Apr-18-2020, 08:03 PM
Hi everyone,
I've found this code to enter the date and that I'd like to use in tkinter but I'm having several issue:
TypeError: get() takes 1 positional argument but 2 were given". I've no idea why this is happening.
Also I'd like to edit a little the code and I was wondering if it could be possible to:
1. Po put a little bit of space between the three boxes and add a "/" between them?
2. Also right now it is possible to input incorrect date like 31 November ecc. How could I fix this?
Thank you all for your help!
I've found this code to enter the date and that I'd like to use in tkinter but I'm having several issue:
import tkinter as tk
from datetime import datetime
class DateEntry(tk.Frame):
def __init__(self, parent, **kwargs):
years = kwargs.pop('years', (1900, 9999))
super().__init__(parent, **kwargs)
vcmd = (self.register(self._validate), '%W', '%V', '%v', '%P', '%S')
for name, text, v1, v2 in (('day', 'DD', 1, 31),
('month', 'MM', 1, 12),
('year', 'YYYY', years[0], years[1])):
e = tk.Entry(self, name=name, width=len(text) + 2, justify="center")
e.pack(side=tk.LEFT)
e.insert(0, text)
e._valid = (len(text), v1, v2)
e.config(validate="all", validatecommand=vcmd)
def get(self):
data = {}
for entry in [self.nametowidget(child) for child in self.children]:
text = entry.get()
data[entry.winfo_name()] = int(text) if text.isdigit() else None
return data
def _validate(self, widget, cmd, validate, value, text):
# get this entry reference
w = self.nametowidget(widget)
# Clear entry or do nothing
if cmd in ('focusin', 'forced') or value == '':
if not value.isdigit():
w.delete(0, tk.END)
# Set the 'validate' option again after edit
w.after_idle(w.config, {'validate': validate})
return True
# process key
elif cmd == 'key' and value.isdigit():
# get from this entry the valid parameter
l, v1, v2 = w._valid
# get the startswith chars if YYYY
if v1 > 1 and len(value) < l:
l2 = len(value)
v1, v2 = int(str(v1)[:l2]), int(str(v2)[:l2])
# allow leading zero in DD / MM
elif v1 == 1 and len(value) == 1 and int(value) == 0:
return True
# return True if all valid else False
return all((text.isdigit(), v1 <= int(value) <= v2, len(value) <= l))
# else return False
return FalseThis is how I'm using it after importing it self.birthday = StringVar(self)
self.birthday.set('')
self.birthday=DateEntry(self, years=(1935, 2020))
self.birthday.place(relx=0.22, rely=0.16, height=25, width=100)I cannot access to the entry input I'm trying this way: for key in self.birthday.keys():
birth_year = self.birthday.get('year')
birth_month = self.birthday.get('month')
birth_day = self.birthday.get('day')
birth_date = datetime.datetime(birth_year, birth_month, birth_day)But it gives me this error "birth_year = self.birthday.get('year')TypeError: get() takes 1 positional argument but 2 were given". I've no idea why this is happening.
Also I'd like to edit a little the code and I was wondering if it could be possible to:
1. Po put a little bit of space between the three boxes and add a "/" between them?
2. Also right now it is possible to input incorrect date like 31 November ecc. How could I fix this?
Thank you all for your help!
