《用 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 的基本功能来打造一个有趣的小应用,希望你能从中获得启发,尝试自己去修改和拓展这个程序,比如改变弹出窗口的样式、文字内容或者调整弹出和关闭的时间间隔等,创造出更多有趣的效果。如果你在运行过程中遇到任何问题,欢迎随时在评论区留言提问哦!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/923004.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

JeecgBoot 实现Table列的动态加载

需要在vue文件中引入 render //这个是显示图片的,如果是文字不需要 import { render } from "//utils/common/renderUtils"; 注册table 时 //注册table时添加 getRawDataSource, setColumns const [registerTable, { reload, setProps, setLoading, u…

Python爬虫:获取1688店铺详情的实战指南

在当今这个信息爆炸的时代,数据的价值不言而喻。对于电商行业来说,了解竞争对手的店铺详情、产品信息、价格策略等,对于制定市场策略和优化自身产品至关重要。1688作为中国领先的B2B电子商务平台,拥有海量的商家和商品信息。本文将…

Leecode刷题C语言之网络延迟时间

执行结果:通过 执行用时和内存消耗如下: const int INF 0x3f3f3f3f;// function declaration void displayAdjMatrix(int*, int n); int dijkstra(const int*, const int, const int);int networkDelayTime(int** times, int timesSize, int* timesColSize, int n…

【大数据学习 | Spark-Core】Spark中的join原理

join是两个结果集之间的链接,需要进行数据的匹配。 演示一下join是否存在shuffle。 1. 如果两个rdd没有分区器,分区个数一致 ,会发生shuffle。但分区数量不变。 scala> val arr Array(("zhangsan",300),("lisi",…

vue图片导入的几种方式及优劣对比

1. 使用相对路径(静态资源) 直接在模板中使用图片的相对路径,例如: <img src="./assets/logo.png" alt="Logo"> 优点: 简单直观,无需额外的配置。适合使用固定的、本地图片。缺点: 对于大型项目,如果资源存储路径变动,维护成本较高。打包…

开发一套ERP 第三弹 前端构建

初步确定 差不多就套用 pnpm config set registry https://registry.npmmirror.com/ pnpm 配置国内镜像源

易语言学习-cnblog

易语言数据类型 数值转换命令&#xff08;自己学&#xff09; 数值到大写&#xff08;&#xff09;将一个数值转换到中文读法&#xff0c;第二个参数为是否为简体。 数值到大写&#xff08;123.44&#xff0c;假&#xff09; 猜测结果 数值到金额&#xff08;&#xff09;将双…

uni-app 蓝牙开发

一. 前言 Uni-App 是一个使用 Vue.js 开发&#xff08;所有&#xff09;前端应用的框架&#xff0c;能够编译到 iOS、Android、快应用以及各种小程序等多个平台。因此&#xff0c;如果你需要快速开发一款跨平台的应用&#xff0c;比如在 H5、小程序、iOS、Android 等多个平台上…

浏览器缓存与协商缓存

1. 强缓存&#xff08;Strong Cache&#xff09; 定义 强缓存是指在缓存的资源有效期内&#xff0c;浏览器会直接使用缓存中的数据&#xff0c;而不会发起网络请求。也就是说&#xff0c;浏览器会直接从本地缓存读取资源&#xff0c;不会与服务器进行任何交互。 如何控制强缓…

利用adb工具安装卸载安卓平板(手机)软件

参考链接&#xff1a; 1、ADB 操作命令详解及用法大全 2、全面掌握Android调试工具箱&#xff1a;ADB与实用程序实战 平时使用小米手机没有感觉&#xff0c;miui系统做的确实好。最近买了个水货学习系统平板&#xff08;主要看重硬件配置&#xff0c;性价比很高&#xff0c;但…

使用 OpenCV 进行视频中的行人检测

在计算机视觉领域&#xff0c;行人检测是一个重要的研究方向&#xff0c;它在视频监控、自动驾驶、人机交互等领域都有着广泛的应用。本文将介绍如何使用 OpenCV 库来实现视频中的行人检测。 环境准备 首先&#xff0c;我们需要安装 OpenCV 库。可以通过以下命令来安装&#…

小柴冲刺软考中级嵌入式系统设计师系列三、嵌入式硬件设计(1)嵌入式系统电源管理

越努力&#xff0c;越幸运&#xff01; 人生的意义在于体验&#xff01; 目录 越努力&#xff0c;越幸运&#xff01; 一、电源管理 (1)系统上电行为 (2)空闲模式 (3)断电 (4)电压与频率缩放 例如 具体实现如下: ① 12V 转8V ② 12V 转-8V ③ 12V 转5V ④ 5V 转3…

大语言模型---LoRA中损失值的计算

文章目录 概要损失计算流程小结 概要 Llama-7B模型的LoRA微调训练中&#xff0c;通过使用Cross-Entropy Loss来度量模型输出的预测分布和真实标签分布之间的距离&#xff0c;来衡量模型的准确性。 本文主要介绍LoRA中损失值的计算流程。 Cross-Entropy Loss作用&#xff1a;是…

使用redis-shake工具进行redis的数据同步

前言&#xff1a; 工作中将常遇到测试环境和正式环境的数据同步或者需要进行数据迁移&#xff0c;对于mysql数据库的方案倒是不少&#xff0c;但是redis中如何快速便捷的迁移呢&#xff1f;答案是阿里云提供的:redis-shake RedisShake是阿里云基于豌豆荚开源的redis-port进行…

人工智能之数学基础:向量的基本知识

本文重点 向量的基本性质是线性代数和向量空间理论的核心,它们为向量运算提供了坚实的基础,并在物理、工程、计算机图形学等领域有着广泛的应用。本文对向量的一些基本知识进行介绍,帮助大家快速理解向量。 向量的定义与表示 向量是一个既有大小又有方向的量,通常用带箭…

《数据结构》学习系列——图(中)

系列文章目录 目录 图的遍历深度优先遍历递归算法堆栈算法 广度优先搜索 拓扑排序定义定理算法思想伪代码 关键路径基本概念关键活动有关量数学公式伪代码时间复杂性 图的遍历 从给定连通图的某一顶点出发&#xff0c;沿着一些边访问遍图中所有的顶点&#xff0c;且使每个顶点…

STM32编程小工具FlyMcu和STLINK Utility 《通俗易懂》破解

FlyMcu FlyMcu 模拟仿真软件是一款用于 STM32 芯片 ISP 串口烧录程序的专用工具&#xff0c;免费&#xff0c;且较为非常容易下手&#xff0c;好用便捷。 注意&#xff1a;STM32 芯片的 ISP 下载&#xff0c;只能使用串口1&#xff08;USART1&#xff09;&#xff0c;对应的串口…

非递归遍历二叉树(数据结构)

我的博客主页 非递归遍历二叉树 前序遍历&#xff08;迭代&#xff09;中序遍历&#xff08;迭代&#xff09;后续遍历&#xff08;迭代&#xff09; 二叉树的遍历方式有&#xff1a;前序遍历、中序遍历、后续遍历&#xff0c;层序遍历&#xff0c;而树的大部分情况下都是通过递…

对于某些原型或UI软件的个人看法(2024/11)

由于我这几天&#xff0c;一边敲代码&#xff0c;一边进行页面布局设计与编码&#xff0c;发现可能就一个卡片&#xff0c;我都得调很久样式&#xff0c;觉得这样改很累也没效率&#xff0c;页面也不是很美观。所以我想到了ui设计&#xff0c;我可以先进行ui设计&#xff0c;然…

Rocky DEM tutorial4_SAG mill 半自磨机 -后处理

文章目录 3. 后处理3.1 磨损分析 - 3D3.2 磨损分析 - 2D3.3 导出磨损后的几何3.4颗粒轨迹3.5欧拉统计3.6 能谱分析介绍Enjoy!案例链接注:案例来自于Rocky官方教程3. 后处理 3.1 磨损分析 - 3D 点击Geometries --> Mill,点击Properties,选择 add new custom property …