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

Python tkinter 初探Toplevel控件搭建父子窗口

目录

Toplevel控件搭建父子窗口

最简明的父子窗口框架

改进一:屏蔽和开放按钮

改进二:子窗口始终在主窗口之上

改进三:增加子窗口的关闭协议

改进四:使子窗口长获焦点

总结


Toplevel控件搭建父子窗口

最近,用Python给单位里用的“智慧食堂”系统编制了一个餐卡充值文件生成器,自动匹配餐卡号并快速生成导入数据用的Excel表格,截图如下:

使用tkinter Toplevel控件弹出子窗口,用作设置备注的子窗口。在编程过程中,边学边写探索到不少新知识,简单介绍如下:

最简明的父子窗口框架

创建一个主窗口、一个子窗口,各放一个按钮,代码如下:

import win32api, tkinter as tkdef _toplevel():top = tk.Toplevel(root)top.title("Toplevel Window")W,H=400,300top.geometry(f'{W}x{H}+{(X-W)//2}+{(Y-H)//2}')btn_Close = tk.Button(top, text="Close", command=top.destroy)btn_Close.pack()  if __name__=='__main__':# 创建主窗口root = tk.Tk()root.title("Main Window")# 获取windows系统桌面分辨率X,Y=win32api.GetSystemMetrics(0),win32api.GetSystemMetrics(1)W,H=600,480root.geometry(f'{W}x{H}+{(X-W)//2}+{(Y-H)//2}')# 创建一个打开Toplevel窗口的按钮btn_Open = tk.Button(root, text="Open Toplevel", command=_toplevel)btn_Open.pack()# 运行Tkinter事件循环root.mainloop()

上述代码的缺点是主窗口上的Open按钮可以反复点击打开多个子窗口,要想办法按需要来屏蔽它的点击功能。

改进一:屏蔽和开放按钮

以下代码可以调整按钮的使用状态:tk.DISABLED、tk.NORMAL

button.config(state=tk.DISABLED)
button.config(state=tk.NORMAL)

打开子窗口时,Open按钮的状态改为tk.DISABLED,此时已无法点击了。

import win32api, tkinter as tk  class TopWindow:def __init__(self, parent):  top = self.top = tk.Toplevel(parent)top.title("Toplevel Window")W,H=400,300top.geometry(f'{W}x{H}+{(X-W)//2}+{(Y-H)//2}')btn_Close = tk.Button(top, text="Close", command=self.on_close)btn_Close.pack()def on_close(self):btn_Open.config(state=tk.NORMAL)self.top.destroy()def on_open():TopWindow(root)btn_Open.config(state=tk.DISABLED)if __name__=='__main__':  root = tk.Tk()  root.title("Main Window")  X,Y=win32api.GetSystemMetrics(0),win32api.GetSystemMetrics(1)W,H=600,480root.geometry(f'{W}x{H}+{(X-W)//2}+{(Y-H)//2}')btn_Open = tk.Button(root, text="Open Toplevel", command=on_open)btn_Open.pack()root.mainloop()

改进二:子窗口始终在主窗口之上

top.transient(root)  # 设置Toplevel窗口始终在主窗口root的上方

import win32api, tkinter as tk  class TopWindow:def __init__(self, parent):  top = self.top = tk.Toplevel(parent)top.title("Toplevel Window")W,H=400,300top.geometry(f'{W}x{H}+{(X-W)//2}+{(Y-H)//2}')top.transient(root) # 设置Toplevel窗口始终在主窗口上方btn_Close = tk.Button(top, text="Close", command=self.on_close)btn_Close.pack()def on_close(self):btn_Open.config(state=tk.NORMAL)self.top.destroy()def on_open():TopWindow(root)btn_Open.config(state=tk.DISABLED)if __name__=='__main__':  root = tk.Tk()  root.title("Main Window")  X,Y=win32api.GetSystemMetrics(0),win32api.GetSystemMetrics(1)W,H=600,480root.geometry(f'{W}x{H}+{(X-W)//2}+{(Y-H)//2}')btn_Open = tk.Button(root, text="Open Toplevel", command=on_open)btn_Open.pack()root.mainloop()

另外一种方法也能设置子窗口永远在前:

top.wm_attributes('-topmost', True)  # 设置Toplevel窗口在所有窗口的上方

两种方法的区别在于后者是全局的设置,它使得子窗口在操作系统中所有窗口的上面,包括其它应用程序的窗口。

如下图,请比较一下与上一张截图的效果有啥区别:

改进三:增加子窗口的关闭协议

如下图,直接点击子窗口右上关闭按钮,只触发窗口默认的top.destroy事件。这样关闭子窗口后,主窗口的按钮状态并不能恢复;以下代码使得子窗口的"WM_DELETE_WINDOW"关闭协议绑定了自定义的关闭事件self.onclose:

top.protocol("WM_DELETE_WINDOW", self.on_close)

完整代码如下:

import win32api, tkinter as tk  class TopWindow:def __init__(self, parent):  top = self.top = tk.Toplevel(parent)top.title("Toplevel Window")W,H=400,300top.geometry(f'{W}x{H}+{(X-W)//2}+{(Y-H)//2}')top.transient(root)top.protocol("WM_DELETE_WINDOW", self.on_close)btn_Close = tk.Button(top, text="Close", command=self.on_close)btn_Close.pack()def on_close(self):btn_Open.config(state=tk.NORMAL)self.top.destroy()def on_open():TopWindow(root)btn_Open.config(state=tk.DISABLED)if __name__=='__main__':  root = tk.Tk()  root.title("Main Window")  X,Y=win32api.GetSystemMetrics(0),win32api.GetSystemMetrics(1)W,H=600,480root.geometry(f'{W}x{H}+{(X-W)//2}+{(Y-H)//2}')btn_Open = tk.Button(root, text="Open Toplevel", command=on_open)btn_Open.pack()root.mainloop()

改进四:使子窗口长获焦点

top.grab_set()  # 确保Toplevel窗口长获焦点

使用这个方法,前面提到的按钮状态的切换以及子窗口绑定关闭协议的代码都不需要了,非常简洁。top.grab_set() 配合 top.transient(root) 共同使用(如下标注红色部分),效果最佳:

import win32api, tkinter as tk 

class TopWindow:
    def __init__(self, parent):  
        top = self.top = tk.Toplevel(parent)
        top.title("Toplevel Window")
        W,H=400,300
        top.geometry(f'{W}x{H}+{(X-W)//2}+{(Y-H)//2}')
        top.grab_set()
        top.transient(root)

        btn_Close = tk.Button(top, text="Close", command=top.destroy)
        btn_Close.pack()

def on_open():
    TopWindow(root)

if __name__=='__main__':  

    root = tk.Tk()  
    root.title("Main Window")  
    X,Y=win32api.GetSystemMetrics(0),win32api.GetSystemMetrics(1)
    W,H=600,480
    root.geometry(f'{W}x{H}+{(X-W)//2}+{(Y-H)//2}')

    btn_Open = tk.Button(root, text="Open Toplevel", command=on_open)
    btn_Open.pack()
    root.mainloop()


源代码复制框如下:

import win32api, tkinter as tk  class TopWindow:def __init__(self, parent):  top = self.top = tk.Toplevel(parent)top.title("Toplevel Window")W,H=400,300top.geometry(f'{W}x{H}+{(X-W)//2}+{(Y-H)//2}')top.grab_set()top.transient(root)btn_Close = tk.Button(top, text="Close", command=top.destroy)btn_Close.pack()def on_open():TopWindow(root)if __name__=='__main__':  root = tk.Tk()  root.title("Main Window")  X,Y=win32api.GetSystemMetrics(0),win32api.GetSystemMetrics(1)W,H=600,480root.geometry(f'{W}x{H}+{(X-W)//2}+{(Y-H)//2}')btn_Open = tk.Button(root, text="Open Toplevel", command=on_open)btn_Open.pack()root.mainloop()

总结

通过对toplevel控件的编程操练,掌握了tkinter子窗口的调用方法,了解了topleve的多种特殊方法、响应事件以及绑定协议。

相关文章:

Python tkinter 初探Toplevel控件搭建父子窗口

目录 Toplevel控件搭建父子窗口 最简明的父子窗口框架 改进一:屏蔽和开放按钮 改进二:子窗口始终在主窗口之上 改进三:增加子窗口的关闭协议 改进四:使子窗口长获焦点 总结 Toplevel控件搭建父子窗口 最近,用P…...

SpringCloud源码探析(十二)-基于SpringBoot开发自定义中间件

1.概述 中间件是一种介于操作系统和应用软件之间,为应用软件提供服务功能的软件,按功能划分有消息中间件(Kafka、RocketMQ)、通信中间件(RPC通信中间件,dubbo等),应用服务器等。中间…...

基于CNN+数据增强+残差网络Resnet50的少样本高准确度猫咪种类识别—深度学习算法应用(含全部工程源码)+数据集+模型(一)

系列文章目录 基于CNN数据增强残差网络Resnet50的少样本高准确度猫咪种类识别—深度学习算法应用(含全部工程源码)数据集模型(一) 基于CNN数据增强残差网络Resnet50的少样本高准确度猫咪种类识别—深度学习算法应用(含全部工程源码)数据集模型&#xf…...

python实现贪吃蛇游戏

文章目录 1、项目说明2、项目预览3、开发必备4、贪吃蛇代码实现4.1、窗口和基本参数实现4.2、绘制背景4.3、绘制墙壁4.4、绘制贪吃蛇4.5、绘制食物4.6、实现长度信息显示4.7、定义游戏暂停界面4.8、定义贪吃蛇死亡界面4.9、实现贪吃蛇碰撞效果4.10、实现添加食物功能4.11、实现…...

ios备忘录怎么导入华为 方法介绍

作为一个常常需要在不同设备间切换的人,我深知备忘录的重要性。那些突如其来的灵感、重要的会议提醒、甚至是生活中的琐碎小事,我们都习惯性地记录在备忘录里。但当我决定从iPhone转向华为时,一个问题困扰了我:如何将那些珍贵的备…...

electron与cesium组件入门应用功能

electron与cesium组件入门应用功能 运行应用效果图: electron应用目录,需要包括三个文件: index.html main.js package.json (一)、创建一个新项目 目录名称:project_helloWolrd (二)、生成package.json文件 npm init --yes(三&#x…...

Jenkins Docker Cloud在Linux应用开发CI中的实践

Jenkins Docker Cloud在Linux应用开发CI中的实践 背景 通过代码提交自动触发CI自动构建、编译、打包是任何软件开发组织必不可少的基建,可以最大程度保证产物的一致性,方便跨组跨部门协作,代码MR等。 Docker在流水线中越来越重要&#xff…...

502 Bad Gateway with nginx + apache + subversion + ssl

svn commit的时候返回 unexpected http status 502 bad gateway on解决方法,参考:https://stackoverflow.com/questions/2479346/502-bad-gateway-with-nginx-apache-subversion-ssl-svn-copy 在nginx中代理svn中添加 location /svn {set $fixed_dest…...

【PostgreSQL内核学习(十八)—— 存储管理(存储管理的体系结构)】

存储管理 概述存储管理器的体系结构存储管理器的主要任务读写元组过程 声明:本文的部分内容参考了他人的文章。在编写过程中,我们尊重他人的知识产权和学术成果,力求遵循合理使用原则,并在适用的情况下注明引用来源。 本文主要参考…...

Android的组件、布局学习

介绍 公司组织架构调整,项目组需要承接其他项目组的android项目,负责维护和开发新需求,故学习下基础语法和项目开发。 组件学习 Toolbarheader布局部分 就是app最顶部的部分 他的显示与否,是与F:\androidProject\android_lear…...

【离散数学】——期末刷题题库(树其一)

🎃个人专栏: 🐬 算法设计与分析:算法设计与分析_IT闫的博客-CSDN博客 🐳Java基础:Java基础_IT闫的博客-CSDN博客 🐋c语言:c语言_IT闫的博客-CSDN博客 🐟MySQL&#xff1a…...

光模块市场分析与发展趋势预测

光模块是光通信领域的重要组成部分,随着数字经济,大数据,云计算,人工智能等行业的兴起,光模块市场经历了快速发展,逐渐在数据中心、无线回传、电信传输等应用场景中得到广泛应用。本文将基于当前光模块全球…...

Python轴承故障诊断 (八)基于EMD-CNN-GRU并行模型的故障分类

目录 前言 1 经验模态分解EMD的Python示例 2 轴承故障数据的预处理 2.1 导入数据 2.2 制作数据集和对应标签 2.3 故障数据的EMD分解可视化 2.4 故障数据的EMD分解预处理 3 基于EMD-CNN-GRU并行模型的轴承故障诊断分类 3.1 训练数据、测试数据分组,数据分ba…...

鸿蒙实现年月日十分选择框,支持年月日、月日、日、年月日时分、时分切换

import DateTimeUtils from ./DateTimeUtils;CustomDialog export default struct RQPickerDialog {controller: CustomDialogControllertitle: string 这是标题TAG: string RQPickerDialog// 0 - 日期类型(年月日) 1 - 时间类型(时分&a…...

IntelliJ IDE 插件开发 | (三)消息通知与事件监听

系列文章 IntelliJ IDE 插件开发 |(一)快速入门IntelliJ IDE 插件开发 |(二)UI 界面与数据持久化IntelliJ IDE 插件开发 |(三)消息通知与事件监听 前言 在前两篇文章中讲解了关于插件开发的基础知识&…...

VUE小知识点

Vue 是一款用于构建用户界面的 JavaScript 框架。它基于标准 HTML、CSS 和 JavaScript 构建,并提供了一套声明式的、组件化的编程模型,帮助你高效地开发用户界面。 Vue 的主要作用是帮助开发者构建现代 Web 应用程序。它允许前端开发人员专注于应用程序…...

深入了解常见的应用层网络协议

目录 1. HTTP协议 1.1. 工作原理 1.2. 应用场景 1.3. 安全性考虑 2. SMTP协议 2.1. 工作原理 2.2. 应用场景 2.3. 安全性考虑 3. FTP协议 3.1. 工作原理 3.2. 应用场景 3.3. 安全性考虑 4. DNS协议 4.1. 工作原理 4.2. 应用场景 4.3. 安全性考虑 5. 安全性考虑…...

网络爬虫 多任务采集

一、JSON文件存储 JSON,全称为 JavaScript 0bject Notation,也就是JavaSript 对象标记,它通过对象和数组的组合来表示数据,构造简洁但是结构化程度非常高,是一种轻量级的数据交换格式。本节中,我们就来了解如何利用 P…...

真实并发编程问题-1.钉钉面试题

👏作者简介:大家好,我是爱吃芝士的土豆倪,24届校招生Java选手,很高兴认识大家📕系列专栏:Spring源码、JUC源码、Kafka原理、分布式技术原理、数据库技术🔥如果感觉博主的文章还不错的…...

基于vue+element-plus+echarts制作动态绘图页面(柱状图,饼图和折线图)

前言 我们知道echarts是一个非常强大的绘图库,基于这个库,我们可以绘制出精美的图表。对于一张图来说,其实比较重要的就是配置项,填入不同的配置内容就可以呈现出不同的效果。 当然配置项中除了样式之外,最重要的就是…...

深入解析SD卡CMD指令集:从寄存器操作到数据传输实战

1. SD卡基础寄存器全解析 当你把一张SD卡插入读卡器时,系统瞬间就能识别出容量和型号,这个过程背后其实是SD卡内部寄存器的功劳。这些寄存器就像SD卡的"身份证"和"体检报告",存储着所有关键信息。我刚开始接触嵌入式开发…...

LFM2.5-1.2B-Thinking多模态扩展展示:结合视觉模型的图文理解能力

LFM2.5-1.2B-Thinking多模态扩展展示:结合视觉模型的图文理解能力 1. 多模态能力惊艳亮相 LFM2.5-1.2B-Thinking最近在多模态领域展现出了令人惊喜的表现。这个原本专注于文本推理的模型,通过与视觉模型的结合,实现了从纯文本到图文理解的跨…...

昇腾910B+MindIE实战:从零部署DeepSeek-R1-Distill-Qwen-32B推理服务

1. 昇腾910B与MindIE环境准备 在Atlas 800I A2服务器上部署DeepSeek-R1-Distill-Qwen-32B模型,首先需要搭建好基础运行环境。我最近刚完成了一个类似项目的部署,整个过程虽然有些复杂,但只要按照步骤操作,2-3小时就能搞定。 操作系…...

前端HTML精讲01:别再乱 div 一把抓,吃透语义化标签才是进阶第一步

前端HTML精讲01:别再乱 div 一把抓,吃透语义化标签才是进阶第一步 文章目录前端HTML精讲01:别再乱 div 一把抓,吃透语义化标签才是进阶第一步一、什么是HTML语义化?二、为什么要做HTML语义化?1\. 提升代码可…...

跨平台文件同步方案:OpenClaw+Qwen3-32B智能归档系统

跨平台文件同步方案:OpenClawQwen3-32B智能归档系统 1. 为什么需要智能文件同步 作为一个长期在多台设备间切换工作的开发者,我深受文件管理混乱的困扰。Mac上的设计稿、Windows里的开发文档、Linux服务器上的日志文件——这些散落在各处的数据就像一座…...

STM32CubeMX配置EXTI中断,别再在HAL_GPIO_EXTI_Callback里用HAL_Delay了!

STM32外部中断实战:避开HAL_Delay陷阱的三种解决方案 第一次在STM32项目中使用外部中断时,我遇到了一个令人困惑的问题——按下按键后程序突然卡死。经过反复排查,最终发现问题出在中断回调函数中的HAL_Delay调用上。这个看似简单的延时函数&…...

操作系统原理与LiuJuan20260223Zimage性能优化深度解析

操作系统原理与LiuJuan20260223Zimage性能优化深度解析 1. 引言 在AI模型部署和推理过程中,很多人只关注算法本身的优化,却忽略了底层操作系统对性能的关键影响。实际上,操作系统的资源管理策略、内存分配机制和进程调度方式,直…...

3大突破!Linux硬件控制工具彻底解决ASUS ROG笔记本性能释放难题

3大突破!Linux硬件控制工具彻底解决ASUS ROG笔记本性能释放难题 【免费下载链接】asusctl Daemon and tools to control your ASUS ROG laptop. Supersedes rog-core. 项目地址: https://gitcode.com/gh_mirrors/as/asusctl 一、用户痛点场景:Lin…...

AI 模型量化精度与推理速度平衡

AI模型量化精度与推理速度平衡:智能时代的效率与质量博弈 在人工智能技术快速发展的今天,AI模型的部署效率成为关键挑战。模型量化技术通过降低计算精度来提升推理速度,但如何在精度损失与速度提升之间找到平衡,成为开发者关注的…...

从零开始掌握KLayout版图设计:5个步骤打造专业集成电路设计流程

从零开始掌握KLayout版图设计:5个步骤打造专业集成电路设计流程 【免费下载链接】klayout KLayout Main Sources 项目地址: https://gitcode.com/gh_mirrors/kl/klayout KLayout版图设计工具是开源EDA领域的明星产品,为集成电路设计工程师提供了一…...