Tkinter入门:制作一个日历

写在前面的话

Tkinter 模块(Tk 接口)是 Python 的标准 Tk GUI 工具包的接口。Tk 和 Tkinter 可以在大多数的 Unix 平台下使用,同样可以应用在 Windows 和 Macintosh 系统里。——摘自菜鸟教程
官网地址:https://docs.python.org/zh-cn/3.8/library/tkinter.html
本文参考:《程序设计导论:Python计算与应用开发实践》

原文链接:https://blog.zhaojingyi0126.com/#/Python/28

今日目标:制作一个日历界面

Tkinter入门:制作一个日历_第1张图片

动态效果如下

Tkinter入门:制作一个日历_第2张图片

需要用到的组件:Label(显示文本)、gird(布局为网格)、Button(按钮)

具体拆分一下就是:
日历部分的数字,需要用Label来显示
日期怎么放置,由gird控制
NextPrevious需要由Button来控制

下面会详细介绍一下这三个组件。觉得麻烦的同学,可以直接拖到最后看日历代码~

1 GUI窗口

Tkinter入门:制作一个日历_第3张图片
image
from tkinter import * # 导入类,Python标准库,无需安装
root = Tk() # 实例化对象
root.mainloop() # 显示窗口

2 Label组件

2.1 显示文本

from tkinter import *
root = Tk()
hello = Label(master = root, text = "Hello GUI world!") # 创建Label对象
hello.pack() # 放置于父组件的顶部中心
root.mainloop()

2.2 显示图像

Tkinter入门:制作一个日历_第4张图片
from tkinter import *
root = Tk()
photo = PhotoImage(file='cake.png') # 将图片转化为tkinter可以显示的格式
hello = Label(master=root,
              image=photo,
              width=300, # 标签宽度,以像素为单位
              height=180) # 标签高度,以像素为单位
hello.pack()
root.mainloop()

3 布局组件

3.1 pack

Tkinter入门:制作一个日历_第5张图片
from tkinter import *
root = Tk()
text = Label(root,
             font=('Helvetica',16,'bold italic'), # 设置字体,加粗、斜体、大小16点
             width=20,             
             foreground='white', # 字体颜色
             background='black', # 背景颜色
             padx=25, # 标签左右扩展25像素
             pady=10, # 标签上下扩展10像素
             text='This is my painting.')
text.pack(side=BOTTOM) # 标签放在下方

cake = PhotoImage(file='cake.png')
cakeLabel = Label(root,
                  image=cake, 
                  background='white', 
                  width=150,
                  height=150,
                  borderwidth=3, # 设置标签边框宽度
                  relief=RIDGE) # 设置标签边框样式:隆起
cakeLabel.pack(side=LEFT) # 标签放在左侧

melon = PhotoImage(file='watermelon.png')
melonLabel = Label(root,
                   background='white', 
                   width=150,
                   height=150,
                   image=melon)
melonLabel.pack(side=RIGHT) # 标签放在右侧

root.mainloop()
Tkinter入门:制作一个日历_第6张图片
from tkinter import *
root = Tk()
text = Label(root,
             font=('Helvetica',16,'bold italic'), # 设置字体,加粗、斜体、大小16点                
             foreground='white', # 字体颜色
             background='black', # 背景颜色
             padx=25, # 标签左右扩展25像素
             pady=50, # 标签上下扩展10像素
             text='This is my painting.\n It is a cake.')
text.pack(side=LEFT) # 标签放在下方

cake = PhotoImage(file='cake.png')
cakeLabel = Label(root,
                  image=cake, 
                  background='white', 
                  width=150,
                  height=150,
                  borderwidth=3, # 设置标签边框宽度
                  relief=RIDGE) # 设置标签边框样式:隆起
cakeLabel.pack(side=RIGHT) # 标签放在左侧

root.mainloop()

3.2 grid

grid将组件布局为表格

电话拨号盘GUI

Tkinter入门:制作一个日历_第7张图片
from tkinter import *
root = Tk()
labels = [['1','2','3'], # 文本,布局为网格
          ['4','5','6'],
          ['7','8','9'],
          ['*','0','#']]

for r in range(4): # 行循环
    for c in range(3): # 列循环
        label = Label(root,
                      relief=RAISED, # 设置边框格式
                      padx=10, # 加宽标签
                      text=labels[r][c]) # 标签文本
        label.grid(row=r, column=c) # 将标签放置在r行c列

root.mainloop()

GUI:根据输入的年份和月份,自动生成日历

Tkinter入门:制作一个日历_第8张图片
import calendar 
from tkinter import *
root = Tk()
labels = [['Mon','Tue','Wed','Thu','Fri','Sat','Sun']]
MonthCal = calendar.monthcalendar(2020, 3)
for i in range(len(MonthCal)):
    labels.append(MonthCal[i])
for r in range(len(MonthCal)+1):
    for c in range(7):
        if labels[r][c] == 0:
            labels[r][c] = ' '
        label = Label(root,          
                      padx=5,
                      pady=5,
                      text=str(labels[r][c]))        
        label.grid(row=r,column=c)
root.mainloop()

4 Button组件

GUI:点击Click it,显示当前时间

Tkinter入门:制作一个日历_第9张图片
from tkinter import *
from tkinter.messagebox import showinfo
import datetime

def clicked():
    day = datetime.datetime.now().strftime('%d %b %Y')
    time = datetime.datetime.now().strftime('%H:%M:%S %p')
    text = 'Day:'+day+'\n'+'Time:'+time+'\n'
    showinfo(message=text)

root = Tk()

botton = Button(root,
                text='Click it',
                command=clicked)
botton.pack()
root.mainloop()

5 制作日历

Tkinter入门:制作一个日历_第10张图片
import calendar 
from tkinter import *
root = Tk()

def LabelCal(Year, Month):
    # 首行放置“年、月”的位置
    label = Label(root,text=str(Year)+"年")
    label.grid(row=0,column=2)
    label = Label(root,text=str(Month)+"月")
    label.grid(row=0,column=4)
    # labels列表:放置“星期”的标题
    labels = [['Mon','Tue','Wed','Thu','Fri','Sat','Sun']]
    # 用calendar库计算日历
    MonthCal = calendar.monthcalendar(Year, Month)
    # 先把界面清空
    for r in range(7):
        for c in range(7):            
            label = Label(root,
                          width =5,
                          padx=5,
                          pady=5,
                          text=' ')        
            label.grid(row=r+1,column=c)
    # 把日历加到labels列表中     
    for i in range(len(MonthCal)):
        labels.append(MonthCal[i])
    # 放置日历
    for r in range(len(MonthCal)+1):
        for c in range(7):
            if labels[r][c] == 0:
                labels[r][c] = ' '
            label = Label(root,
                          width =5,
                          padx=5,
                          pady=5,
                          text=str(labels[r][c]))        
            label.grid(row=r+1,column=c) # 网格布局

# 默认日期
Year, Month = 2020,3
LabelCal(Year, Month)

# button:Enter
def ButtonPrevious():
    global Year, Month
    Month = Month-1
    if Month<1:
        Month = Month+12
        Year = Year-1
    LabelCal(Year, Month)

button1 = Button(root, text='Previous', command=ButtonPrevious)
button1.grid(row=len(MonthCal)+2, column=0)

# button:Clear
def ButtonNext():
    global Year, Month
    Month = Month+1
    if Month>12:
        Month = Month-12
        Year = Year+1 
    LabelCal(Year, Month)

button2 = Button(root, text='Next', command=ButtonNext)
button2.grid(row=len(MonthCal)+2, column=6)

root.mainloop()

你可能感兴趣的:(Tkinter入门:制作一个日历)