一、根窗口使用tkinter中的Tk方法创建
from tkinter import *
def callback():
print("你点了一下按钮")
root = Tk()
root.title("***") #引号中可以输入窗口命名
root.iconbitmap("bitbug_favicon.ico") # ico图标(自行下载合适尺寸的ico图标)
root.geometry("1200x600") # 窗体长度
root.config(bg="light blue") # 背景颜色
mainloop() #mainloop方法,可以让窗口循环显示,否则运行时窗口一闪就没了
运行结果展示
二、添加各种各样的控件,也称组件,比如文本输入框
加入各类标签,字体的元组后面还可以加上字体的特殊样式,一共有bold(加粗), italic(斜体),underline(下划线),overstrike(删除线)几种,可以叠加设置。
Label(root, text="加粗", font=("黑体", 20, "bold")).pack()
Label(root, text="斜体", font=("黑体", 20, "italic")).pack()
Label(root, text="下划线", font=("黑体", 20, "underline")).pack()
Label(root, text="删除线", font=("黑体", 20, "overstrike")).pack()
Label(root, text="叠加使用", font=("黑体", 20, "bold", "italic", "underline", "overstrike")).pack()
Lab = Label(root, text="Hello,Tkinter!", relief="sunken")
Lab.pack()
三、添加静图
1、这段代码建立了一个tk图片对象,现在需要把它传递给Label,这个图片是一个tk.PhotoImage对象,支持的格式只有*.gif, *.ppm, *.pgm
image = PhotoImage(file="D:\微信图片_20231221095457_gif.gif") #文件位置
Label(root, image=image, text="It's a monster.", compound="top").pack()
运行效果展示
2、对于gif图片,tkinter是可以解析它每一帧的图片的,让它动起来实际上是把gif图解析成多张图片,然后按一定的速度一张一张显示出来。因此,我们将每一帧都放到一个列表中,再按一定的速度播放即可
pic = PhotoImage(file='吃饭达人.gif', format='gif -index %i'% 111) # N为第几帧
giflis = []
for i in range(111):
giflis.append(PhotoImage(file='吃饭达人.gif', format='gif -index %i'% i))
image = PhotoImage(file="吃饭达人.gif", format='gif -index %i'% i)
Label(root, image=image, text="It's a monster.", compound="top").pack()
mainloop()
效果展示
三、Button
Button即按钮,可以绑定一个回调函数,用户点击时将会执行这个函数
完整代码
from tkinter import * def callback(): print("你点了一下按钮") root = Tk() root.title("***") root.iconbitmap("bitbug_favicon.ico") # ico图标1 root.geometry("1200x600") # 窗体长度 root.config(bg="light blue") # 背景颜色
def turn_on(): # 开始按钮
button1.config(state="disabled")
button2.config(state="active")
def turn_off(): # 关闭按钮
button1.config(state="active")
button2.config(state="disabled")
禁用按钮
所有组件都有state参数,表示组件的状态。一共有三个状态:normal, disabled, active。默认的state是normal,此时用户可以点击按钮。而处于disabled禁用的按钮,用户将无法点击。active则是激活状态。
button1 = Button(root, text="开启", command=turn_on, activeforeground="blue", activebackground="yellow")
button2 = Button(root, text="关闭", command=turn_off, activeforeground="blue", activebackground="yellow")
activeforeground和activebackground参数
如果鼠标长按按钮,那么按钮不会被触发,而是松开鼠标后触发。这时候,按钮处于一种激活状态。我们可以设置激活时按钮的前景和背景颜色
button1.pack()
button2.pack()
root.resizable(True, True)
mainloop()
效果展示
四、添加动图
完整代码如下:
# -*-coding:utf-8 -*-
"""
GIF 动画文件播放模块
能配合 tkinter.Label 组件播放动态图
实现原理:将gif 动太按帧数分解成独立临时图片,再分别显示
最后再删除临时图片
"""
import tkinter
from PIL import Image, ImageTk
from PIL import ImageSequence
import random # 随机模块
import os, sys # 系统模块
STR_FRAME_FILENAME = "frame{}.png" # 每帧图片的文件名格式
class playGif():
def __init__(self, file, temporary=""): # temporary 指临时目录路径,为空时则随机生成
self.__strPath = file
self.__index = 1 # 当前显示图片的帧数
if len(temporary) == 0:
self.strTemporaryFolder = self.crearteTemporaryFolder() # 随机得到临时目录
else:
self.strTemporaryFolder = temporary # 指定的临时目录
self.__intCount = 0 # gif 文件的帧数
self.decomposePics() # 开始分解
#
def crearteTemporaryFolder(self): # 生成临时目录名返回
# 获取当前调用模块主程序的运行目录
strSelfPath = str(os.path.dirname(os.path.realpath(sys.argv[0])))
if len(strSelfPath) == 0:
strSelfPath = os.path.join(os.getcwd())
def createRandomFolder(strSelfPath): # 内嵌方法,生成随机目录用
length = random.randint(5, 10) # 随机长度
path = ""
for i in range(length):
path = path + chr(random.randint(97, 122)) # 随机生成a-z字母
return os.path.join(strSelfPath, path)
#
# 获取当前软件目录
folder = createRandomFolder(strSelfPath)
while os.path.isdir(folder): # 已存在
folder = createRandomFolder(strSelfPath)
return folder
#
def decomposePics(self): # 分解 gif 文件的每一帧到独立的图片文件,存在临时目录中
i = 0
img = Image.open(self.__strPath)
self.__width, self.__height = img.size # 得到图片的尺寸
os.mkdir(self.strTemporaryFolder) # 创建临时目录
for frame in ImageSequence.Iterator(img): # 遍历每帧图片
frame.save(os.path.join(self.strTemporaryFolder, STR_FRAME_FILENAME.format(i + 1))) # 保存独立图片
i += 1
self.__intCount = i # 得到 gif 的帧数
#
def getPicture(self, frame=0): # 返回第 frame 帧的图片(width=0,height=0)
if frame == 0:
frame = self.__index
elif frame >= self.__intCount:
frame = self.__intCount # 最后一张
img = tkinter.PhotoImage(file=os.path.join(self.strTemporaryFolder, STR_FRAME_FILENAME.format(frame)))
self.__index = self.getNextFrameIndex()
return img # 返回图片
#
def getNextFrameIndex(self, frame=0): # 返回下一张的帧数序号
if frame == 0:
frame = self.__index # 按当前插入帧数
if frame == self.__intCount:
return 1 # 返回第1张,即从新开始播放
else:
return frame + 1 # 下一张
#
def playGif(self, tk, widget, time=100): # 开始调用自身实现播放,time 单位为毫秒
img = self.getPicture()
widget.config(image=img)
widget.image = img
tk.after(time, self.playGif, tk, widget, time) # 在 time 时间后调用自身
#
def close(self): # 关闭动画文件,删除临时文件及目录
files = os.listdir(self.strTemporaryFolder)
for file in files:
os.remove(os.path.join(self.strTemporaryFolder, file))
os.rmdir(self.strTemporaryFolder)
#
if __name__ == "__main__":
import tkinter
def delete(): # 删除临时图
root.destroy()
gif.close()
file = r"吃饭达人.gif"
root = tkinter.Tk()
label = tkinter.Label(root, text="11", bg="#FFFFFF")
label.pack(side=tkinter.LEFT)
button = tkinter.Button(root)
button.pack(side=tkinter.LEFT)
root.protocol('WM_DELETE_WINDOW', delete) #####【重要】关闭窗口后的事件:delete
gif = playGif(file)
# label.config(image=gif.getPicture())
gif.playGif(root, button) # 实现动态插放
root.mainloop()
最终效果展示为动图