当前位置: 首页 > article >正文

《用 Python 和 Tkinter 打造惊喜弹窗小应用教程》

        在日常使用电脑的过程中,偶尔来点小惊喜总是能让人心情愉悦。今天,我要和大家分享一段有趣的 Python 代码,它借助 Tkinter 库创建一系列随机位置弹出的温馨提示窗口,给人带来意想不到的惊喜效果。下面就让我们一起来深入了解这段代码吧!

结果展示(文末附完整代码):

Python 和 Tkinter 打造惊喜弹窗小应用

目录

结果展示:

一、代码概述

1. 导入必要的库

二、主要函数介绍

1. surprise函数

2. close_all_windows函数

3. create_next_window函数

三、程序运行流程

注意:

四、总结

完整代码:


一、代码概述

        这段代码主要实现了一个简单却充满趣味的功能:在屏幕上随机位置弹出多个带有特定温馨提示文字的小窗口,一段时间后再自动关闭所有弹出的窗口。整个程序基于 Python 的 Tkinter 库进行图形用户界面(GUI)的创建和操作。

1. 导入必要的库

        代码开头部分导入了三个必要的 Python 库:

import time
import tkinter as tk
import random
  • time:用于处理时间相关的操作,在本代码中主要用于在关闭所有窗口时添加一个短暂的延迟,确保窗口能够正常关闭。
  • tkinter(别名为 tk):这是 Python 内置的标准 GUI 库,用于创建各种窗口、控件以及处理用户交互等操作。我们将依靠它来构建弹出窗口并设置其属性。
  • random:用于生成随机数,在本代码中用于确定每个弹出窗口在屏幕上的随机位置。

二、主要函数介绍

1. surprise函数

def surprise(root):
    width = root.winfo_screenwidth()
    height = root.winfo_screenheight()
    a = random.randrange(0, width)
    b = random.randrange(0, height)

    window = tk.Toplevel(root)
    window.title('嘻嘻')
    window.geometry("240x50+" + str(a) + "+" + str(b))
    window.attributes("-topmost", True)  # 设置窗口为最上层
    tk.Label(window,
             # 更改文本内容
             text='LJH,天天开心啊!',
             # 更改文本颜色--字体--大小
             bg='pink',
             font=("楷体", 17),
             width=19,
             height=2,
             ).pack()
  • 这个函数的主要目的是创建一个具有特定样式和位置的弹出窗口。
  • 首先,它通过 root.winfo_screenwidth() 和 root.winfo_screenheight() 获取屏幕的宽度和高度信息,以便确定窗口可以出现的范围。
  • 然后,使用 random.randrange 函数在屏幕宽度和高度范围内分别生成随机的横坐标 a 和纵坐标 b,用于确定窗口在屏幕上的随机位置。
  • 接着,创建一个新的 tk.Toplevel 窗口对象 window,并设置其标题为 '嘻嘻',通过 geometry 方法设置窗口的大小为 240x50 像素,并根据生成的随机坐标 a 和 b 确定窗口的具体位置。
  • 最后,通过 window.attributes("-topmost", True) 将窗口设置为最上层显示,确保它能在其他窗口之上弹出。在窗口内部,创建了一个 tk.Label 控件,设置了文本内容为 'LJH,天天开心啊!',文本颜色背景为 pink,字体为 ("楷体", 17),并调整了宽度和高度等属性,然后使用 pack 方法将标签控件添加到窗口中。

2. close_all_windows函数

def close_all_windows(root):
    # 这是一个简化的关闭函数,它关闭所有顶层窗口。
    for child in root.winfo_children():
        child.destroy()
    # 如果所有窗口都已关闭,则结束程序
    if not root.winfo_children():
        time.sleep(0.05)
        root.destroy()
  • 此函数用于关闭所有由主窗口 root 创建的顶层子窗口。
  • 它通过遍历 root.winfo_children() 获取主窗口的所有子窗口对象,然后对每个子窗口调用 destroy 方法来关闭它们。
  • 在关闭所有子窗口后,再次检查主窗口是否还有子窗口(通过 not root.winfo_children() 判断),如果没有了,说明所有相关窗口都已关闭,此时先暂停 0.05 秒(使用 time.sleep),然后调用 root.destroy() 来结束整个程序,释放相关资源。

3. create_next_window函数

windows_left = 400  # 初始化打开窗口数量

def create_next_window(root):
    global windows_left
    if windows_left > 0:
        surprise(root)  # 创建一个新的窗口
        windows_left -= 1
        root.after(50, lambda: create_next_window(root))  # 递归调用以创建下一个窗口
    else:
        # 所有窗口都已创建,现在调用关闭函数--等待时间15秒
        root.after(15000, lambda: close_all_windows(root))  # 稍后关闭所有窗口
  • 这个函数是整个程序的核心控制函数,用于创建一系列的弹出窗口并安排它们的关闭时间。
  • 首先,它通过一个全局变量 windows_left 来记录还需要创建的窗口数量,初始值为 400
  • 在函数内部,每次调用时先检查 windows_left 是否大于 0,如果是,则调用 surprise 函数创建一个新的弹出窗口,然后将 windows_left 的值减 1,表示已经创建了一个窗口。
  • 接着,使用 root.after(50, lambda: create_next_window(root)) 进行递归调用,这意味着在 50 毫秒后会再次调用 create_next_window 函数自身,从而实现每隔 50 毫秒创建一个新的弹出窗口,直到 windows_left 的值变为 0
  • 当 windows_left 变为 0 时,即所有需要创建的窗口都已创建完成,此时通过 root.after(15000, lambda: close_all_windows(root)) 安排在 15000 毫秒(即 15 秒)后调用 close_all_windows 函数来关闭所有创建的弹出窗口。

三、程序运行流程

  1. 创建主窗口并隐藏
root = tk.Tk()
root.withdraw()  # 隐藏主窗口
  • 首先创建一个 tk.Tk 类型的主窗口对象 root,然后立即调用 root.withdraw() 方法将主窗口隐藏起来,因为我们主要关注的是弹出的子窗口,不需要主窗口显示在屏幕上。
  1. 开始创建弹出窗口
create_next_window(root)
  • 调用 create_next_window 函数开始创建一系列的弹出窗口,它会按照设定的逻辑每隔 50 毫秒创建一个新窗口,直到创建了 400 个窗口为止。
  1. 关闭弹出窗口
  • 在创建完所有 400 个窗口后,经过 15 秒的延迟(由 root.after(15000, lambda: close_all_windows(root)) 安排),会调用 close_all_windows 函数来关闭所有已经创建的弹出窗口,完成整个程序的运行过程。

注意:

  1. 确保环境配置正确
    • 由于代码使用了 Python 的内置 Tkinter 库,所以无需额外安装库,只要你安装了 Python 本身即可(一般 Python 版本在 3.x 及以上都支持 Tkinter)。
  2. 运行代码
    • 将上述代码保存为一个 .py 文件,比如 surprise_windows.py
    • 在命令行中切换到保存代码文件的目录,然后执行以下命令运行代码:python surprise_windows.py
    • 之后你就会看到屏幕上陆续弹出一系列带有温馨提示文字的粉色小窗口,它们会在随机位置出现,15 秒后所有这些弹出窗口会自动关闭。

四、总结

完整代码:

# -*- coding:utf-8 -*-
import time
import tkinter as tk
import random


def surprise(root):
    width = root.winfo_screenwidth()
    height = root.winfo_screenheight()
    a = random.randrange(0, width)
    b = random.randrange(0, height)

    window = tk.Toplevel(root)
    window.title('嘻嘻')
    window.geometry("240x50+" + str(a) + "+" + str(b))
    window.attributes("-topmost", True)  # 设置窗口为最上层
    tk.Label(window,
             # 更改文本内容
             text='LJH,天天开心啊!',
             # 更改文本颜色--字体--大小
             bg='pink',
             font=("楷体", 17),
             width=19,
             height=2,
             ).pack()


def close_all_windows(root):
    # 这是一个简化的关闭函数,它关闭所有顶层窗口。
    for child in root.winfo_children():
        child.destroy()
    # 如果所有窗口都已关闭,则结束程序
    if not root.winfo_children():
        time.sleep(0.05)
        root.destroy()

windows_left = 400  # 初始化打开窗口数量


def create_next_window(root):
    global windows_left
    if windows_left > 0:
        surprise(root)  # 创建一个新的窗口
        windows_left -= 1
        root.after(50, lambda: create_next_window(root))  # 递归调用以创建下一个窗口
    else:
        # 所有窗口都已创建,现在调用关闭函数--等待时间15秒
        root.after(15000, lambda: close_all_windows(root))  # 稍后关闭所有窗口


root = tk.Tk()
root.withdraw()  # 隐藏主窗口
create_next_window(root)  # 开始创建窗口
root.mainloop()

        通过以上详细的介绍,我们了解了这段 Python 代码是如何利用 Tkinter 库实现创建随机位置弹出窗口并自动关闭的功能的。它展示了如何通过简单的代码逻辑和 Tkinter 的基本功能来打造一个有趣的小应用,希望你能从中获得启发,尝试自己去修改和拓展这个程序,比如改变弹出窗口的样式、文字内容或者调整弹出和关闭的时间间隔等,创造出更多有趣的效果。如果你在运行过程中遇到任何问题,欢迎随时在评论区留言提问哦!


http://www.kler.cn/a/409590.html

相关文章:

  • C语言练习.if.else语句.strstr
  • 3349、检测相邻递增子数组 Ⅰ
  • python-MatchObject对象方法
  • 一文学习开源框架OkHttp
  • Swift 实现查找链表入环点:快慢指针法
  • CPU命名那些事
  • 【MySQL】数据库 Navicat 可视化工具与 MySQL 命令行基本操作
  • 【青牛科技】D3308 一块带有 ALC 的双通道前置放大器。它适用于立体声收录机和盒式录音机。
  • 小米C++ 面试题及参考答案下(120道面试题覆盖各种类型八股文)
  • 对象的大小
  • Paddle Inference部署推理(十二)
  • Flink Standalone 集群模式安装部署教程
  • 「Mac玩转仓颉内测版32」基础篇12 - Cangjie中的变量操作与类型管理
  • FileLink内外网文件共享系统与FTP对比:高效、安全的文件传输新选择
  • Js-对象-04-String
  • Leetcode 3366. Minimum Array Sum
  • 基于Vue+SpringBoot的考研学习分享平台设计与实现
  • 在Elasticsearch中,是怎么根据一个词找到对应的倒排索引的?
  • 使用JavaScript操作页面元素
  • Spring Boot整合Redis Stack构建本地向量数据库相似性查询
  • leetcode_160_相交链表
  • 微表情识别系统
  • 基于springboot的来访管理系统的设计与实现
  • H.265流媒体播放器EasyPlayer.js无插件H5播放器关于移动端(H5)切换网络的时候,播放器会触发什么事件
  • 【JSON】package.json与package-lock.json
  • 【可变参数,lambda,function,bind】