写在前面的话
Tkinter 模块(Tk 接口)是 Python 的标准 Tk GUI 工具包的接口。Tk 和 Tkinter 可以在大多数的 Unix 平台下使用,同样可以应用在 Windows 和 Macintosh 系统里。——摘自菜鸟教程
官网地址:https://docs.python.org/zh-cn/3.8/library/tkinter.html
本文参考:《程序设计导论:Python计算与应用开发实践》
今日目标:制作一个日历界面
动态效果如下
需要用到的组件:Label(显示文本)、gird(布局为网格)、Button(按钮)
具体拆分一下就是:
日历部分的数字,需要用Label来显示
日期怎么放置,由gird控制
Next
和Previous
需要由Button来控制
下面会详细介绍一下这三个组件。觉得麻烦的同学,可以直接拖到最后看日历代码~
1 GUI窗口
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 显示图像
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
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()
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
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:根据输入的年份和月份,自动生成日历
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
,显示当前时间
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 制作日历
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()