使用Tkinter在Python中创建数字时钟

使用Tkinter在Python中创建数字时钟

创建图形用户界面(GUI)应用程序的惊人之处在于我们可以按照自己的想法进行自定义。我们可以根据需要自定义各种功能,从文本的字体到背景颜色都可以调整。在下面的教程中,我们将学习如何使用Python编程语言中的Tkinter库构建一个数字时钟。

所以,让我们开始吧。

项目的先决条件

为了在Python中使用GUI构建数字时钟,我们需要以下模块:

  1. Tkinter: Tkinter 模块将允许我们为应用程序提供图形用户界面(GUI)。
  2. Time: time 模块将允许我们处理时间。

由于这两个模块都预先安装在Python中,我们无需单独安装它们。

使用Python构建数字时钟的过程

为了更好地理解,在Python中构建数字时钟的过程分为几个步骤。我们需要执行的步骤如下:

步骤1: 首先,我们将导入所需的模块。

步骤2: 然后,我们将定义用于显示当前时间的函数。

步骤3: 然后,我们将创建应用程序的主窗口。

步骤4: 然后,我们将向窗口添加部件。

现在让我们详细了解这些步骤。

导入所需的模块

首先,我们将导入所有必要的模块,以帮助我们构建这个项目。这些模块包括 Tkinter 模块,用于向应用程序添加图形用户界面,以及 time 模块,用于处理日期。

让我们考虑以下代码片段展示了相同的内容。

文件:clock_gui.py

# importing the required modules
from tkinter import *   # importing all the modules and widgets from tkinter
import time             # importing the time module

说明:

在上面的代码片段中,我们从tkinter中导入了所有的模块和小部件,以提供应用程序的GUI。我们还导入了time模块来显示时间。

定义显示当前时间的函数

现在,我们将定义一个函数,使我们能够在程序运行时显示当前时间。此函数将使用tkinter模块的strftime()方法以字符串格式表示当前时间。然后,我们将把24小时制时间转换为12小时制,并根据要求将值设置为上午或下午,并将计算得到的值插入到我们稍后创建的标签中。

让我们看一下下面的代码片段,展示了相同的内容。

文件:clock_gui.py

# defining a function to display the time
def display_time():
    # using the strftime() method to represent current time in string
    hour = str(time.strftime("%H"))
    minute = str(time.strftime("%M"))
    second = str(time.strftime("%S"))

    # if the hour range between 12 to 24 and minute is greater
    # than or equal to 0 then set the value of the meridiem_label label to PM
    if int(hour) >= 12 and int(hour) < 24 and int (minute) >= 0:
        meridiem_label.config(text = "PM")
    # else set the value of the meridiem_label to AM
    else:
        meridiem_label.config(text = "AM")

    # converting 24-hour time to 12-hour time by
    # subtracting 12 from hours ranging from 13 to 24
    if int(hour) > 12:
        hour = str((int(hour) - 12))
    # if the hour is equal to 0, setting the hour to 12
    elif int(hour) == 0:
        hour = str(12)

    # configuring the text of the hour, minute, and second labels
    hour_label.config(text = hour)
    minute_label.config(text = minute)
    second_label.config(text = second)
    # using the after() to call the display_time() after 200 milliseconds
    hour_label.after(200, display_time)

解释:

在上面的代码片段中,我们定义了一个函数 display_time() 。在这个函数内部,我们使用了时间模块的 strftime() 方法来以字符串格式表示当前时间,并将时间分成小时、分钟和秒,并将它们存储在不同的变量中。然后,我们使用 if-else 条件语句来检查小时范围是否在12到24之间,并且分钟大于或等于0,然后将 meridiem_label 标签的值设置为PM。如果没有,我们将 meridiem_label 标签的值设置为AM。然后,我们使用 if-elif 条件语句将24小时制转换为12小时制,通过从介于13和24之间的小时中减去12。如果小时为0,则将小时值设为12。然后,我们使用 tkinter 模块的 config() 方法来将显示小时、分钟和秒的标签的文本设置为先前评估的值。最后,我们使用 after() 方法在200毫秒后调用 display_time() 函数。

创建应用程序的主窗口

现在,我们已经定义了所需的函数,是时候创建应用程序的主窗口来显示函数的工作了。我们可以通过实例化 tkinter 模块的 Tk() 类来创建一个窗口。然后,我们将为窗口设置适当的标题,并设置窗口的大小和位置。我们还将添加一个图标,并配置窗口的背景颜色。让我们考虑以下代码片段,说明了相同的内容。

File: clock_gui.py

# main function
if __name__ == "__main__":
    # creating an object of the Tk() class
    gui_root = Tk()
    # setting the title of the window
    gui_root.title("Digital Clock - JAVATPOINT")
    # setting the size and position of the window
    gui_root.geometry("650x250+650+250")
    # disabling the resizable option for better UI
    gui_root.resizable(0, 0)
    # configuring the background color to #2C3C3F
    gui_root.config(bg = "#2C3C3F")
    # setting the icon of the window
    gui_root.iconbitmap("clock_img.ico")

解释:

在上述代码片段中,我们创建了一个名为gui_root的Tk()类对象,代表应用程序的主窗口。我们使用title()方法设置了窗口的标题。我们还使用geometry()方法设置了窗口在屏幕上的大小和位置。然后,我们通过将resizable()方法的值设为零来禁用了可调整大小选项。我们还使用config()方法中的bg参数将背景色配置为#2C3C3F。最后,我们使用iconbitmap()方法指定了目录中ICO文件的地址来设置窗口的图标。

将小部件添加到主窗口

现在,我们将添加一些小部件到窗口中,以显示给用户的数据。这些小部件包括一些框架和标签。框架将为在窗口上放置其他小部件提供明确定义的结构,而标签将显示标题和时间。

让我们详细了解下面所示的这些小部件的实现。

添加框架

我们将从使用tkinter模块提供的Frame()小部件向主窗口添加一些框架。这些框架将为其他小部件提供支持。然后,我们将使用pack()方法设置这些框架在窗口上的位置。

让我们考虑以下演示相同操作的代码片段。

文件: clock_gui.py

    # creating some frames to provide structure to other widgets
    header_frame = Frame(gui_root, bg = "#2C3C3F")
    body_frame = Frame(gui_root, bg = "#2C3C3F")

    # using the pack() method to set the positions of the above
    # frames on the window screen
    header_frame.pack(pady = 15)
    body_frame.pack()

解释:

在上面的代码片段中,我们使用tkinter模块的Frame()小部件添加了框架,并将它们的master参数设置为之前创建的Tk()类的对象gui_root。我们还将它们的背景颜色设置为#2C3C3F。最后,我们使用pack()方法将这些框架的位置设置在窗口屏幕上。

将小部件添加到header_frame框架中

现在我们将在header_frame框架中添加一个标签来显示标题。我们可以使用tkinter模块提供的Label()小部件来添加标签。我们还将使用pack()方法将此标签的位置设置在窗口屏幕上。

让我们考虑下面的代码片段,它描述了相同的情况。

文件:clock_gui.py

    #------------------- Header Frame -------------------------
    # defining a label to display the heading
    header_label = Label(
        header_frame,
        text = "Digital Clock",
        font = ("consolas", "14", "bold"),
        bg = "#2C3C3F",
        fg = "#CAF6FF"
        )
    # using the pack() method to set the position of the label
    # on the window screen
    header_label.pack()

解释:

在上面的代码片段中,我们使用了tkinter模块的Label()小部件将一个标签添加到窗口,并将其master参数设置为我们之前创建的一个名为header_frame的框架。我们还设置了该标签将显示的文本,以及字体样式和大小。我们还配置了标签的背景和前景颜色。最后,我们使用pack()方法将该标签在窗口屏幕上的位置设置好。

将小部件添加到body_frame框架中

现在,我们将在body_frame框架中添加一些标签来显示时间。我们将再次使用tkinter模块的Label()小部件将标签添加到窗口中。我们还将使用grid()方法将这些标签在主窗口上以网格格式设置位置。

让我们考虑以下代码实现相同的片段。

文件:clock_gui.py

    #------------------- Body Frame ---------------------------
    # defining some labels to display the time in the "HH:MM:SS AM/PM" format
    hour_label = Label(
        body_frame,
        text = "00",
        font = ("radioland", "48"),
        bg = "#2C3C3F",
        fg = "#00D2FF"
        )
    colon_label_one = Label(
        body_frame,
        text = ":",
        font = ("radioland", "48"),
        bg = "#2C3C3F",
        fg = "#00D2FF"
        )
    minute_label = Label(
        body_frame,
        text = "00",
        font = ("radioland", "48"),
        bg = "#2C3C3F",
        fg = "#00D2FF"
        )
    colon_label_two = Label(
        body_frame,
        text = ":",
        font = ("radioland", "48"),
        bg = "#2C3C3F",
        fg = "#00D2FF"
        )
    second_label = Label(
        body_frame,
        text = "00",
        font = ("radioland", "48"),
        bg = "#2C3C3F",
        fg = "#00D2FF"
        )
    meridiem_label = Label(
        body_frame,
        text = "AM",
        font = ("radioland", "48"),
        bg = "#2C3C3F",
        fg = "#00D2FF"
        )

    # using the grid() method to set the position of the above
    # labels in a grid form on the window screen
    hour_label.grid(row = 0, column = 0, padx = 5, pady = 5)
    colon_label_one.grid(row = 0, column = 1, padx = 5, pady = 5)
    minute_label.grid(row = 0, column = 2, padx = 5, pady = 5)
    colon_label_two.grid(row = 0, column = 3, padx = 5, pady = 5)
    second_label.grid(row = 0, column = 4, padx = 5, pady = 5)
    meridiem_label.grid(row = 0, column = 5, padx = 5, pady = 5)

解释:

在上面的代码片段中,我们使用了tkinter模块的Label()小部件向窗口添加一些标签,显示时钟的不同组件,如小时、分钟、秒、上午或下午以及分隔这些组件的冒号。我们将这些标签的master参数设置为我们之前创建的另一个框架body_frame。我们还设置了这些标签将显示的文本以及字体样式和大小。我们还配置了标签的背景和前景颜色。最后,我们使用了grid()方法来设置标签在窗口屏幕上的位置。

运行应用程序

一旦我们成功添加了所有必要的小部件,就可以调用我们之前定义的display_time()函数,并使用mainloop()方法来运行应用程序。

让我们考虑以下代码片段,说明了相同的情况。

文件:clock_gui.py

    # calling the display_time() function to display the current time
    display_time()

    # using the mainloop() method to run the application
    gui_root.mainloop()

解释:

在上面的代码片段中,我们调用了 display_time() 函数来启动时钟。然后,我们使用 mainloop() 方法和 Tk() 类的对象,即 gui_root ,来运行应用程序。

应用程序的编码部分已经完成。我们将保存Python项目文件,并在命令提示符或终端中输入以下命令来执行程序。

语法:

$ python clock_gui.py

在我们看到输出之前,让我们考虑一下“使用Tkinter制作数字时钟”项目的完整代码。

完整的项目代码

以下是“使用Tkinter在Python中制作数字时钟”的完整代码。

文件:clock_gui.py

# importing the required modules
from tkinter import *   # importing all the modules and widgets from tkinter
import time             # importing the time module

# defining a function to display the time
def display_time():
    # using the strftime() method to represent current time in string
    hour = str(time.strftime("%H"))
    minute = str(time.strftime("%M"))
    second = str(time.strftime("%S"))

    # if the hour range between 12 to 24 and minute is greater
    # than or equal to 0 then set the value of the meridiem_label label to PM
    if int(hour) >= 12 and int(hour) < 24 and int (minute) >= 0:
        meridiem_label.config(text = "PM")
    # else set the value of the meridiem_label to AM
    else:
        meridiem_label.config(text = "AM")

    # converting 24-hour time to 12-hour time by
    # subtracting 12 from hours ranging from 13 to 24
    if int(hour) > 12:
        hour = str((int(hour) - 12))
    # if the hour is equal to 0, setting the hour to 12
    elif int(hour) == 0:
        hour = str(12)

    # configuring the text of the hour, minute, and second labels
    hour_label.config(text = hour)
    minute_label.config(text = minute)
    second_label.config(text = second)
    # using the after() to call the display_time() after 200 milliseconds
    hour_label.after(200, display_time)

# main function
if __name__ == "__main__":
    # creating an object of the Tk() class
    gui_root = Tk()
    # setting the title of the window
    gui_root.title("Digital Clock - JAVATPOINT")
    # setting the size and position of the window
    gui_root.geometry("650x250+650+250")
    # disabling the resizable option for better UI
    gui_root.resizable(0, 0)
    # configuring the background color to #2C3C3F
    gui_root.config(bg = "#2C3C3F")
    # setting the icon for the window
    gui_root.iconbitmap("clock_img.ico")

    # creating some frames to provide structure to other widgets
    header_frame = Frame(gui_root, bg = "#2C3C3F")
    body_frame = Frame(gui_root, bg = "#2C3C3F")

    # using the pack() method to set the positions of the above
    # frames on the window screen
    header_frame.pack(pady = 15)
    body_frame.pack()

    #------------------- Header Frame -------------------------
    # defining a label to display the heading
    header_label = Label(
        header_frame,
        text = "Digital Clock",
        font = ("consolas", "14", "bold"),
        bg = "#2C3C3F",
        fg = "#CAF6FF"
        )
    # using the pack() method to set the position of the label
    # on the window screen
    header_label.pack()

    #------------------- Body Frame ---------------------------
    # defining some labels to display the time in the "HH:MM:SS AM/PM" format
    hour_label = Label(
        body_frame,
        text = "00",
        font = ("radioland", "48"),
        bg = "#2C3C3F",
        fg = "#00D2FF"
        )
    colon_label_one = Label(
        body_frame,
        text = ":",
        font = ("radioland", "48"),
        bg = "#2C3C3F",
        fg = "#00D2FF"
        )
    minute_label = Label(
        body_frame,
        text = "00",
        font = ("radioland", "48"),
        bg = "#2C3C3F",
        fg = "#00D2FF"
        )
    colon_label_two = Label(
        body_frame,
        text = ":",
        font = ("radioland", "48"),
        bg = "#2C3C3F",
        fg = "#00D2FF"
        )
    second_label = Label(
        body_frame,
        text = "00",
        font = ("radioland", "48"),
        bg = "#2C3C3F",
        fg = "#00D2FF"
        )
    meridiem_label = Label(
        body_frame,
        text = "AM",
        font = ("radioland", "48"),
        bg = "#2C3C3F",
        fg = "#00D2FF"
        )

    # using the grid() method to set the position of the above
    # labels in a grid form on the window screen
    hour_label.grid(row = 0, column = 0, padx = 5, pady = 5)
    colon_label_one.grid(row = 0, column = 1, padx = 5, pady = 5)
    minute_label.grid(row = 0, column = 2, padx = 5, pady = 5)
    colon_label_two.grid(row = 0, column = 3, padx = 5, pady = 5)
    second_label.grid(row = 0, column = 4, padx = 5, pady = 5)
    meridiem_label.grid(row = 0, column = 5, padx = 5, pady = 5)

    # calling the display_time() function to display the current time
    display_time()

    # using the mainloop() method to run the application
    gui_root.mainloop()

输出:

使用Tkinter在Python中创建数字时钟

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程