Source code for libqtile.widget.clock

from time import time
from datetime import datetime
from contextlib import contextmanager
from . import base

import os

@contextmanager
def tz(the_tz):
    orig = os.environ.get('TZ')
    os.environ['TZ'] = the_tz
    yield
    if orig is not None:
        os.environ['TZ'] = orig
    else:
        del os.environ['TZ']

[docs]class Clock(base.InLoopPollText): """ A simple but flexible text-based clock. """ defaults = [ ('format', '%H:%M', 'A Python datetime format string'), ('update_interval', 1., 'Update interval for the clock'), ('timezone', None, 'The timezone to use for this clock, ' 'e.g. "US/Central" (or anything in /usr/share/zoneinfo). None means ' 'the default timezone.') ] def __init__(self, fmt=None, **config): base.InLoopPollText.__init__(self, **config) self.add_defaults(Clock.defaults) if fmt is not None: base.deprecated('fmt kwarg or positional argument is deprecated. ' 'Please use format.') self.format = fmt def tick(self): self.update(self.poll()) ts = time() return self.update_interval - ts % self.update_interval def _get_time(self): ts = time() # adding .5 to get a proper seconds value because glib could # theoreticaly call our method too early and we could get something # like (x-1).999 instead of x.000 return datetime.fromtimestamp(int(ts + .5)).strftime(self.format) def poll(self): # We use None as a sentinel here because C's strftime defaults to UTC # if TZ=''. if self.timezone is not None: with tz(self.timezone): return self._get_time() else: return self._get_time()