简单日历界面制作——Tkinter


前言

使用Tkinter写一个简单的电子日历界面。


一、基本功能

  1. 能够显示当前日期与时间(年月日时分秒),与系统时间或网络时间自动同步、自动更新。
  2. 具有一般日历的 GUI 界面与功能
    ① 特殊显示“当天”,当前时间所在的天在日历中高亮显示;
    ② 默认显示本月的日历,但可以任意切换到其他年与月份;
    ③ 一键“回到今天”,在浏览其他月份时,可以一键回到当前日期所在的月份;
    ④ 点选某一天可以显示与“今天”相隔的天数;

先看完整代码:

import tkinter as tk
import requests
import time
import calendar
import ctypes

from tkinter import messagebox


class CalendarApp:
    def __init__(self, master):
        self.master = master
        self.master.title("电子日历系统")
        self.master.geometry("1000x1000")
        self.current_year = time.localtime().tm_year
        self.current_month = time.localtime().tm_mon
        self.current_day = time.localtime().tm_mday
        self.today = (self.current_year, self.current_month, self.current_day)
        self.create_widgets()

    def create_widgets(self):
        # 顶部时间显示
        self.time_label = tk.Label(self.master, text="", font=("Arial", 20))
        self.time_label.pack(pady=20)
        self.update_time()



        # 日历显示
        self.calendar_frame = tk.Frame(self.master)
        self.calendar_frame.pack(pady=20)
        self.create_calendar()


    def update_time(self):
        current_time = time.strftime("%Y年%m月%d日 %H:%M:%S", time.localtime())
        self.time_label.config(text=current_time)
        self.master.after(1000, self.update_time)


    def create_calendar(self):
        self.calendar_frame.destroy()
        self.calendar_frame = tk.Frame(self.master)
        self.calendar_frame.pack(pady=20)

        # 年份和月份选择
        year_var = tk.StringVar(value=str(self.current_year))
        year_label = tk.Label(self.calendar_frame, text="年份:")
        year_label.grid(row=0, column=0, padx=5)
        year_entry = tk.Entry(self.calendar_frame, width=6, textvariable=year_var)
        year_entry.grid(row=0, column=1, padx=5)

        month_var = tk.StringVar(value=str(self.current_month))
        month_label = tk.Label(self.calendar_frame, text="月份:")
        month_label.grid(row=0, column=2, padx=5)
        month_entry = tk.Entry(self.calendar_frame, width=4, textvariable=month_var)
        month_entry.grid(row=0, column=3, padx=5)

        # 回到今天按钮
        today_button = tk.Button(self.calendar_frame, text="回到今天", command=self.go_to_today)
        today_button.grid(row=0, column=4, padx=5)

        # 日历显示
        days = calendar.monthcalendar(int(year_var.get()), int(month_var.get()))
        weekday_names = ["一", "二", "三", "四", "五", "六", "日"]
        for i, name in enumerate(weekday_names):
            label = tk.Label(self.calendar_frame, text=name, font=("Arial", 16))
            label.grid(row=1, column=i, padx=5, pady=5)
        for i, week in enumerate(days):
            for j, day in enumerate(week):
                if day == 0:
                    continue
                button = tk.Button(self.calendar_frame, text=str(day), font=("Arial", 16), width=3, height=2)
                button.grid(row=i+2, column=j, padx=5, pady=5)
                if (int(year_var.get()), int(month_var.get()), day) == self.today:
                    button.config(bg="yellow")
                button.bind("<Button-1>", lambda event, day=day: self.show_days_diff(day))

    def go_to_today(self):
        self.current_year = self.today[0]
        self.current_month = self.today[1]
        self.create_calendar()

    def show_days_diff(self, day):
        days_diff = (time.mktime((self.current_year, self.current_month, day, 0, 0, 0, 0, 0, 0)) - 
                     time.mktime((self.today[0], self.today[1], self.today[2], 0, 0, 0, 0, 0, 0))) // (24 * 60 * 60)
        tk.messagebox.showinfo("相隔天数", f"今天与{self.current_year}{self.current_month}{day}日相隔{days_diff}天")

if __name__ == "__main__":
    
    # 创建窗口:root是自己定义的窗口
    root = tk.Tk()
    
    # 界面优化---------------------------------
    # 调用api设置成由应用程序缩放
    ctypes.windll.shcore.SetProcessDpiAwareness(1)
    # 调用api获得当前的缩放因子
    ScaleFactor=ctypes.windll.shcore.GetScaleFactorForDevice(0)
    # 设置缩放因子
    root.tk.call('tk', 'scaling', ScaleFactor/75)
    #--------------------------------------------
    app = CalendarApp(root)
    root.mainloop()
  • 在上述代码中,我们使用了 tkinter 库创建 GUI 界面,使用 time 库获取当前时间,使用 calendar 库获取日历信息。
  • 在界面中,我们显示了当前时间。可以通过年份和月份选择来切换日历的显示,点击“回到今天”按钮可以回到当前日期所在的月份,点击某一天可以显示与“今天”相隔的天数。同时,我们也可以根据自己的需求对界面进行美化和功能的扩展。

二、效果展示

请添加图片描述

总结

Tkinter用来UI展示是一个不错的选择,最近也在学习中。📖

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: Python可以使用tkinter库来制作日历tkinter库是Python的标准GUI库,可以用来创建各种GUI应用程序,包括日历。在tkinter中,可以使用Calendar模块来创建日历。首先,需要导入Calendar模块,然后使用Calendar模块中的Calendar类来创建一个日历对象。接着,可以使用tkinter中的Label和Button等控件来显示日历和实现一些功能,比如翻页、选择日期等。最后,使用tkinter中的mainloop()函数来启动GUI应用程序,让用户可以与日历进行交互。 ### 回答2: Python是一种广泛应用于软件开发、数据分析和人工智能等领域的高级编程语言,而tkinterPython自带的标准GUI库,是Python编写图形用户界面应用程序的重要工具。在使用tkinter制作日历时,我们需要先了解tkinter的基础知识以及日历的逻辑实现。 首先,tkinter提供了很多GUI控件,如Label、Button、Entry等等,用于构建界面。通过这些控件我们可以创建窗口、添加文本、按钮和文本框等交互元素。 对于日历的实现,我们需要首先了解一些基础的日期时间计算。可以借助Python的datetime模块来计算当前时间、时间差和推算日期。同时,还需要了解日历的布局,考虑如何将日期、星期和节日等元素布局到界面上,以及如何对日期进行格式化和展示。 接下来,我们可以用tkinter来设计一个基本的日历界面,用于显示日期、星期和节假日等信息。具体实现可以按照以下步骤进行: 1. 创建一个窗口用于容纳日历主体部分,设置窗口大小和标题; 2. 添加文本标签和按钮控件,用于显示日期信息和操作界面; 3. 根据当前日期计算并展示当月日历,可以使用一个表格布局来显示日期和星期; 4. 添加鼠标事件响应,实现选中日期或切换月份的功能; 5. 格式化日历元素,高亮选中日期、展示节日等。 在以上基础上,还可以考虑一些额外的功能,如支持农历、添加假期和纪念日提醒等等。 总之,用tkinter制作日历需要掌握Pythontkinter的基础知识,同时需要对日期时间计算和布局等方面有一定的了解。通过以上实现步骤,可以完成简单日历界面制作,进一步的扩展则需要更深入的技术和知识储备。 ### 回答3: Python是一种高级编程语言,拥有许多强大的库和框架,其中之一是Tkinter,它是Python的标准GUI(图形用户界面)工具包之一。Tkinter库允许Python程序员创建各种GUI应用程序,其中包括应用程序如日历。 使用PythonTkinter制作日历需要以下步骤: 1. 导入Tkinter模块。使用下面的脚本进行导入: ``` from tkinter import * ``` 2. 创建一个Calendar类以存储交互式日历的相关信息,如最小日期、最大日期、当前日期等。下面是一个示例脚本来创建Calendar类: ``` class Calendar: def __init__(self, parent, values): self.values = values self.parent = parent self.cal = calendar.monthcalendar(self.values[2], self.values[0]) self.year = self.values[2] self.month = self.values[0] self.wid = [] self.day_selected = 1 self.month_selected = self.month self.year_selected = self.year self.day_name = '' self.setup(self.year, self.month) ``` 3.创建setup函数以在GUI中显示日历。以下是示例代码: ``` def setup(self, y, m): left = Button(self.parent, text='<', command=self.go_prev) self.wid.append(left) left.grid(row=0, column=1) header = Label(self.parent, height=2, text='{} {}'.format(calendar.month_abbr[m], str(y))) self.wid.append(header) header.grid(row=0, column=2, columnspan=3) right = Button(self.parent, text='>', command=self.go_next) self.wid.append(right) right.grid(row=0, column=5) days = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'] for num, name in enumerate(days): t = Label(self.parent, text=name[:3]) self.wid.append(t) t.grid(row=1, column=num) for row, week in enumerate(self.cal): for col, day in enumerate(week): if day: b = Button(self.parent, width=2, text=day, command=lambda day=day: self.selection(day)) self.wid.append(b) b.grid(row=row + 2, column=col) sel = Label(self.parent, height=2, text='Selected: none') self.wid.append(sel) sel.grid(row=row + 3, column=0, columnspan=7) ok = Button(self.parent, width=5, text='OK', command=self.kill_and_save) self.wid.append(ok) ok.grid(row=row + 4, column=2, columnspan=3, pady=10) ``` 4. 定义go_prev和go_next函数来根据当前月份的上一个月或下一个月更新GUI中的日历。以下是示例代码: ``` def go_prev(self): if self.month == 1: self.month = 12 self.year -= 1 else: self.month -= 1 self.cal = calendar.monthcalendar(self.year, self.month) self.setup(self.year, self.month) def go_next(self): if self.month == 12: self.month = 1 self.year += 1 else: self.month += 1 self.cal = calendar.monthcalendar(self.year, self.month) self.setup(self.year, self.month) ``` 5.定义selection函数来在GUI中选中日期。以下是示例代码: ``` def selection(self, day): self.day_selected = day self.month_selected = self.month self.year_selected = self.year self.day_name = calendar.day_name[calendar.weekday(self.year, self.month, day)] text = '{} {} {}'.format(self.day_name, calendar.month_name[self.month_selected], self.day_selected) self.sel.config(text=text) ``` 6.定义kill_and_save函数以关闭GUI并将所选日期返回给主程序。以下是示例代码: ``` def kill_and_save(self): self.parent.destroy() print('{} {} {} is selected.'.format(self.day_name, calendar.month_name[self.month_selected], self.day_selected)) ``` 在Calendar类中实现了这些代码后,创建GUI如下所示: ``` if __name__ == '__main__': root = Tk() root.title("Calendar") year = 2022 month = 11 values = [month, 1, year] Calendar(root, values) root.mainloop() ``` 这将在新的窗口中打开一个日历,你可以浏览前后的月份,选择日期,并将所选日期选择返回到主程序中。这就是使用PythonTkinter构建交互式日历的例子。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值