Megastrik3
Megastrik3

Reputation: 95

How to get the current date to display in a tkinter window

So I am try to create a tkinter window that displays the current time, and date, as well as a custom phrase. The issue I'm having though is that I can't seem to get the date to refresh when it's the next day.

I can pass the current date as of the time of running the code but after that it becomes static.

Here is my current program.

import tkinter as tk
import sys
import time
import calendar
import random
import datetime as dt
from tkinter import *


""" DICTIONARY PHRASES """
phrases = ["Phrase1", "Phrase2", "Phrase3"]




class Clock(tk.Label):
    """ Class that contains the clock widget and clock refresh """

    def __init__(self, parent=None, seconds=True, colon=False):
        """
        Create and place the clock widget into the parent element
        It's an ordinary Label element with two additional features.
        """
        tk.Label.__init__(self, parent)

        self.display_seconds = seconds
        if self.display_seconds:
            self.time     = time.strftime('%I:%M:%S %p')
        else:
            self.time     = time.strftime('%I:%M:%S %p').lstrip('0')
        self.display_time = self.time
        self.configure(text=self.display_time)

        if colon:
            self.blink_colon()

        self.after(200, self.tick)


    def tick(self):
        """ Updates the display clock every 200 milliseconds """
        if self.display_seconds:
            new_time = time.strftime('%I:%M:%S %p')
        else:
            new_time = time.strftime('%I:%M:%S %p').lstrip('0')
        if new_time != self.time:
            self.time = new_time
            self.display_time = self.time
            self.config(text=self.display_time)
        self.after(200, self.tick)


    def blink_colon(self):
        """ Blink the colon every second """
        if ':' in self.display_time:
            self.display_time = self.display_time.replace(':',' ')
        else:
            self.display_time = self.display_time.replace(' ',':',1)
        self.config(text=self.display_time)
        self.after(1000, self.blink_colon)



class FullScreenApp(object):
    def __init__(self, master, **kwargs):
        self.master=master
        pad=3
        self._geom='200x200+0+0'
        master.geometry("{0}x{1}+0+0".format(
            master.winfo_screenwidth()-pad, master.winfo_screenheight()-pad))
        master.bind('<Escape>',self.toggle_geom)            
    def toggle_geom(self,event):
        geom=self.master.winfo_geometry()
        print(geom,self._geom)
        self.master.geometry(self._geom)
        self._geom=geom


# Root is the name of the Tkinter Window. This is important to remember.
root=tk.Tk()

# Sets background color to black
root.configure(bg="black")

# Removes the window bar at the top creating a truely fullscreen
root.wm_attributes('-fullscreen','true')
tk.Button(root, text="Quit", bg="black", fg="black", command=lambda root=root:quit(root)).pack()

# this displays the clock know as clock1
clock1 = Clock(root)
clock1.pack()

# This gives the clock format.
clock1.configure(bg='black',fg='white',font=("helvetica",125))

# Gets date from host computer.
date = dt.datetime.now()
# Takes the date and formats it.
format_date = f"{date:%a, %b %d %Y}"

# Selects a random phrase from the phrases dictionary
phrase_print = random.choice(phrases)

# Add the date to the tkinter window
w = Label(root, text=format_date, fg="white", bg="black", font=("helvetica", 40))
w.pack()

# Add the phrase to the tkinter window
e = Label(root, text=phrase_print, fg="white", bg="black", font=("helvetica", 28))
e.pack()


root.mainloop()

Like I said it displays the date but only once. Then it never changes.

Thank you for your help in advance.

Upvotes: 4

Views: 12171

Answers (1)

moe asal
moe asal

Reputation: 582

the reason its not updating, is that a constant value is passed to the widget w. we need to change this so that at each update the widget needs to update the date by calling the function again and again.

remove this:

date = dt.datetime.now()
format_date = f"{date:%a, %b %d %Y}"
w = Label(root, text=format_date, fg="white", bg="black", font=("helvetica", 40))

and add this instead:

w = Label(root, text=f"{dt.datetime.now():%a, %b %d %Y}", fg="white", bg="black", font=("helvetica", 40))

Upvotes: 4

Related Questions