Python tkinter创建小窗口

本文详细介绍了如何使用Python的Tkinter库创建GUI应用程序,包括根窗口的设置、添加各种控件如文本框、标签、图片(静态和动态),以及使用Button组件和回调函数。还展示了如何处理GIF图片的动态播放。
摘要由CSDN通过智能技术生成

一、根窗口使用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()

最终效果展示为动图

  • 21
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值