Tkinter date entry with boxes

annunci.pervendite at gmail.com annunci.pervendite at gmail.com
Fri Apr 17 10:20:58 EDT 2020


Hi, I'm creating a registration form and I found this script that I'd like to use to have my participants to input their birth date:

import tkinter as tk


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) + 1, 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 False


And I'm using it like this: 

        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'm having several issues and questions:
1. I'd like to write the complete entry date on excel but it gives me a format date error when I try to do so. Also when I try to print(self.birthday.get()) I get nothing. I can't access the value
2. I'd need the day, month and year also saved separately (I need the year to calculate the age of the participants).
3. Is it possible to put a little bit of space between the three boxes and add a "/" between them?
4. Lastly right now it is possible to input incorrect date like 31 November ecc. How could I fix this?
Thank you for your help!


More information about the Python-list mailing list