Source code for TermTk.TTkWidgets.datetime_datetime
# MIT License
#
# Copyright (c) 2025 Eugenio Parodi <ceccopierangiolieugenio AT googlemail DOT com>
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in all
# copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.
__all__ = ['TTkDateTime']
import datetime as dt
from typing import Optional
from TermTk.TTkCore.signal import pyTTkSignal, pyTTkSlot
from TermTk.TTkWidgets.container import TTkContainer
from TermTk.TTkWidgets.datetime_date import TTkDate
from TermTk.TTkWidgets.datetime_time import TTkTime
[docs]
class TTkDateTime(TTkContainer):
''' TTkDateTime:
A composite widget for displaying and editing date and time values.
Combines :class:`~TermTk.TTkWidgets.datetime_date.TTkDate` and :class:`~TermTk.TTkWidgets.datetime_time.TTkTime` widgets
into a single datetime editor. (`demo <https://ceccopierangiolieugenio.github.io/pyTermTk-Docs/sandbox/sandbox.html?filePath=demo/showcase/date_time.py>`__)
::
2025/11/04 📅 12:30:45
.. code:: python
import TermTk as ttk
root = ttk.TTk(mouseTrack=True)
ttk.TTkDateTime(parent=root) # Defaults to the current datetime
root.mainloop()
:param datetime: The initial datetime to display, defaults to the current datetime.
:type datetime: :py:class:`datetime.datetime`, optional
'''
__slots__ = (
'_datetime',
'_dateWidget', '_timeWidget',
# Signals
'datetimeChanged')
datetimeChanged:pyTTkSignal
'''
This signal is emitted whenever the datetime changes.
:param datetime: The new datetime value
:type datetime: :py:class:`datetime.datetime`
'''
_datetime:dt.datetime
_dateWidget:TTkDate
_timeWidget:TTkTime
def __init__(self, *,
datetime:Optional[dt.datetime]=None,
**kwargs) -> None:
'''
Initializes the TTkDateTime widget.
:param datetime: The initial datetime to display. If None, the current datetime is used.
:type datetime: :py:class:`datetime.datetime`, optional
'''
self.datetimeChanged = pyTTkSignal(dt.datetime)
if not datetime:
datetime = dt.datetime.now().replace(microsecond=0)
self._datetime = datetime
size = (13+1+8,1)
super().__init__(**kwargs|{'size':size, 'minSize':size})
self._dateWidget = TTkDate(parent=self, pos=( 0,0), date=datetime.date())
self._timeWidget = TTkTime(parent=self, pos=(14,0), time=datetime.time())
self._dateWidget.dateChanged.connect(self._somethingChanged)
self._timeWidget.timeChanged.connect(self._somethingChanged)
def setFocus(self) -> None:
return self._dateWidget.setFocus()
@pyTTkSlot()
def _somethingChanged(self) -> None:
'''
Internal slot that synchronizes the datetime value when either date or time changes.
'''
self.setDatetime(
self._datetime.combine(
date=self._dateWidget.date(),
time=self._timeWidget.time()))
[docs]
def datetime(self) -> dt.datetime:
'''
Returns the current datetime of the widget.
:return: The current datetime
:rtype: :py:class:`datetime.datetime`
'''
return self._datetime
[docs]
@pyTTkSlot(dt.datetime)
def setDatetime(self, datetime:dt.datetime) -> None:
'''
Sets the current datetime of the widget.
This updates both the internal date and time widgets and emits the
:py:attr:`datetimeChanged` signal if the value changes.
:param datetime: The new datetime to set
:type datetime: :py:class:`datetime.datetime`
'''
if datetime != self._datetime:
self._datetime = datetime
self._dateWidget.setDate(datetime.date())
self._timeWidget.setTime(datetime.time())
self.datetimeChanged.emit(datetime)