LoginSignup
0
0

More than 1 year has passed since last update.

tkinterでDateEntryを作ってみました

Last updated at Posted at 2023-06-28

オリジナルの DateEntry を作成してみました

customtkinter ver

import customtkinter
import re


class DateEntry(customtkinter.CTkEntry):
    def __init__(self, parent):
        super().__init__(parent)
        self.insert(0, "1990/01/01")
        self.bind('<Escape>', self.entry_escape)
        self.bind('<BackSpace>', self.entry_backspace)
        self.bind('<KeyRelease>', self.after_entry_char)


    def entry_backspace(self, event):
        index_deleting_char = self.index(customtkinter.INSERT) - 1
        if index_deleting_char < 0:
            return
        if self.get()[index_deleting_char] == "/":
            self.insert(index_deleting_char, '/')


    def entry_escape(self, event):
        self.delete(0, "end")
        self.insert(0, "//")


    def after_entry_char(self, event):
        if event.keysym == "Right":
            self.press_right()
            return
        if event.keysym == "Left":
            self.press_left()
            return

        if event.keysym == "slash":
            self.delete(self.index(customtkinter.INSERT) - 1)
            return

        entried_text = self.get()
        if len(re.findall(r"[^\d/]", entried_text)) > 0:
            self.delete(0, "end")
            self.insert(0, re.sub(r"[^\d/]", "", entried_text))

        if len(entried_text) == 0:
            self.insert(0, '//')
            self.icursor(0)


    def press_right(self):
        index_cursor = self.index(customtkinter.INSERT)
        entred_text = self.get()
        if index_cursor < len(entred_text) and re.search(r'^/\d', entred_text[index_cursor-1:]):
            self.icursor(index_cursor+1)


    def press_left(self):
        index_previous_cursor = self.index(customtkinter.INSERT) - 1
        entred_text = self.get()
        if index_previous_cursor > 0 and re.search(r'^/\d', entred_text[index_previous_cursor:]):
            self.icursor(index_previous_cursor)

tkinter ver

from tkinter import ttk
import tkinter as tk
import re



class DateEntry(ttk.Entry):
    def __init__(self, parent):
        super().__init__(parent)
        self.insert(0, "1990/01/01")
        self.bind('<Escape>', self.entry_escape)
        self.bind('<BackSpace>', self.entry_backspace)
        self.bind('<KeyRelease>', self.after_entry_char)


    def entry_backspace(self, event):
        index_deleting_char = self.index(tk.INSERT) - 1
        if index_deleting_char < 0:
            return
        if self.get()[index_deleting_char] == "/":
            self.insert(index_deleting_char, '/')


    def entry_escape(self, event):
        self.delete(0, "end")
        self.insert(0, "//")


    def after_entry_char(self, event):
        if event.keysym == "Right":
            self.press_right()
            return
        if event.keysym == "Left":
            self.press_left()
            return

        if event.keysym == "slash":
            self.delete(self.index(tk.INSERT) - 1)
            return

        entried_text = self.get()
        if len(re.findall(r"[^\d/]", entried_text)) > 0:
            self.delete(0, "end")
            self.insert(0, re.sub(r"[^\d/]", "", entried_text))

        if len(entried_text) == 0:
            self.insert(0, '//')
            self.icursor(0)


    def press_right(self):
        index_cursor = self.index(tk.INSERT)
        entred_text = self.get()
        if index_cursor < len(entred_text) and re.search(r'^/\d', entred_text[index_cursor-1:]):
            self.icursor(index_cursor+1)


    def press_left(self):
        index_previous_cursor = self.index(tk.INSERT) - 1
        entred_text = self.get()
        if index_previous_cursor > 0 and re.search(r'^/\d', entred_text[index_previous_cursor:]):
            self.icursor(index_previous_cursor)

作成してみて、変数名や関数名、関数の使い方など気になる点は多々あるのですが
bind や カーソルなどの理解を深めることができたかなと思います。

追記

バグがあったので修正しました...

参考資料

tkinter document
PythonのTkinterでカレンダー(datepicker)を使用する
Getting the Cursor position in Tkinter Entry widget
How do I bind the escape key to close this window
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0