tkinter自定义控件:通过继承Frame实现Expander

文章目录

    • 继承Frame
    • 点击事件
    • Add函数

tkinter系列:

  • GUI初步💎布局💎绑定变量💎绑定事件💎消息框💎文件对话框
  • Frame控件💎PanedWindow和notebook控件
  • 扫雷小游戏💎强行表白神器

和其他成熟的GUI库相比,tkinter的组件并不是太多,但在自定义组件这一点上,并不逊色于其他框架,接下来就自定义一个Expander控件。

继承Frame

Expander控件说穿了也很简单,就是一个长条形的按钮,按钮下装着一个普通的Frame就可以。为了实现这个功能,新建一个Frame的子类,像下面这样

import tkinter as tk
import tkinter.ttk as ttk

class Expander(ttk.Frame):
    def __init__(self, master, title, **options):
        super().__init__(master, **options)
        self.pack()
        self.initWidgets(title)

    def initWidgets(self, title):
        self.btn = ttk.Button(self, text=title, command=self.Click)
        self.btn.pack(side=tk.TOP, fill=tk.X, expand=tk.YES)
        self.content = ttk.Frame(self)
        self.content.pack(side=tk.TOP, fill=tk.BOTH, expand=tk.YES)

    def Click(self):
        pass

其中,initWidgets用于初始化控件,上面是一个长条形的按钮,下面是一个Frame,用于添加新组件。Click是点击按钮时的响应函数,目前还没有完成。

下面稍微演示一下

root = tk.Tk()
ex = Expander(root, "expander")
ex.pack(side=tk.TOP, fill=tk.BOTH, expand=tk.YES)
root.mainloop()

效果如下

在这里插入图片描述

点击事件

接下来就实现Expander的核心功能,点击按钮改变内容的可见情况。众所周知,在tkinter中,可以通过pack来把某个控件塞到父控件里。那么如果想把这个控件隐藏,只要将其从父控件中拿出来就可以了,用到的函数是pack_forget,非常形象。

而内容Frame的显隐,则需要一个标记,记作self.collapsed,那么Click函数可以写为

def Click(self):
    if self.collapsed:
        self.content.pack(side=tk.TOP, fill=tk.BOTH, expand=tk.YES)            
    else:
        self.content.pack_forget()
    self.collapsed = not self.collapsed

即如果已经折叠了,那就打开content,否则就关闭。然后折叠标记取反。

由于新增了一个全局变量self.collapsed,故而需要修改initWidgets函数

def initWidgets(self, title):
    self.btn = ttk.Button(self, text=title, command=self.Click)
    self.btn.pack(side=tk.TOP, fill=tk.X, expand=tk.YES)
    self.content = ttk.Frame(self)
    self.collapsed = True
    self.Click()

至此,理论上就实现了一个Expander,下面演示一下

root = tk.Tk()
ex = Expander(root, "expander")
ex.pack(side=tk.TOP, fill=tk.X)
tk.Label(ex.content, text="Label").pack(side=tk.TOP, fill=tk.BOTH, expand=tk.YES)
root.mainloop()

需要注意的是,tk.Label的父控件并不是ex,而是ex.content。效果如下

在这里插入图片描述

Add函数

ex.content毕竟是内部变量,给暴露出去并不太好,所以最好构造一个Add函数,用来添加新控件,这种东西对于函数式编程来说可谓手到擒来

def Add(self, Child, **options):
    return Child(self.content, **options)

然后测试函数可写为

root = tk.Tk()
ex = Expander(root, "expander")
ex.pack(side=tk.TOP, fill=tk.X)
L = ex.Add(tk.Label, text="Label")
L.pack(side=tk.TOP, fill=tk.BOTH, expand=tk.YES)
root.mainloop()

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

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

相关文章

【广州华锐视点】VR警务教育实训系统模拟真实场景进行实践训练

随着科技的发展,虚拟现实技术在教育领域得到了广泛的应用。VR警务教育实训系统就是其中的一种应用,该系统由广州华锐互动开发,可以模拟真实的警务场景,让学生通过虚拟现实技术进行实践训练,提高学生的实践能力和技能水…

如何让CSDN学习成就个人能力六边形全是100分:解析个人能力雷达图的窍门

🌷🍁 博主猫头虎 带您 Go to New World.✨🍁 🦄 博客首页——猫头虎的博客🎐 🐳《面试题大全专栏》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺 &a…

【STM32】利用CubeMX对FreeRTOS用按键控制任务

对于FreeRTOS中的操作,最常用的就是创建、删除、暂停和恢复任务。 此次实验目标: 1.创建任务一:LED1每间隔1秒闪烁一次,并通过串口打印 2.创建任务二:LED2每间隔0.5秒闪烁一次,并通过串口打印 3.创建任…

阿里云FRP内网穿透挂载多台服务器

1. FRP介绍 FRP (Fast Reverse Proxy) 是比较流行的一款。FRP 是一个免费开源的用于内网穿透的反向代理应用,它支持 TCP、UDP 协议, 也为 http 和 https 协议提供了额外的支持。你可以粗略理解它是一个中转站, 帮你实现 公网 ←→ FRP(服务器…

Office doc training

1. Wordy文档: step 1.1 格式刷,字体(大小,下划线,背景色,字体颜色),排版(对齐方式,标题,序号,行距离) step 1.2 插入表格,表格单元格的CRUD 操作例子: 2. Excel: step 2.1: 单元格格式( 文本,数值,边框,…

MySQL卸载并重装指定版本

MySQL卸载并重装制定版本 学习新的项目,发现之前的Navicat已经失去了与现有MySQL的链接,而且版本也不适合,为了少走弯路,准备直接重装相应版本的MySQL 卸载现有MySQL 停止windows的MySQL服务,【windowsR】打开运行框…

SpringBoot请求响应

简单参数 1. 原始方式获取请求参数 Controller方法形参中声明httpServletRequest对象 调用对象的getParameter参数名 RestController public class RequestController {RequestMapping("/simpleParam")public String simpleParam(HttpServletRequest request){Strin…

SpringBoot概述及项目的创建使用

文章目录 一. Spring Boot概述1. 什么是Spring Boot?2. Spring Boot的优点 二. Spring Boot项目的创建1. 使用IDEA创建1.1. 准备工作1.2. 创建运行Spring Boot项目1.3. 进行Web交互1.4. 目录工程介绍1.5. 项目快速添加依赖1.6. 防止配置文件乱码所需的配置1.7. Spri…

Arcgis中POI找到建筑面内距离最近的标准地址通过模型构建器来实现

背景 之前写过一篇文章 Arcgis通过矢量建筑面找到POI对应的标准地址 这里面的大致思路跟本篇文章是类似的,不过上一篇文章有部分有瑕疵,就是在POI去找建筑面内的标准地址时,找到的虽然是建筑面内的,但是不一定是距离最近的&#…

C#__事件event的简单使用:工具人下楼问题

// 工具人类 namespace DownStair {delegate void DownStairDelegate(); // 定义了一个下楼委托class ToolMan{public string Name { get; set; } // 声明工具人的名字属性// public DownStairDelegate downStairDelegate null; // 初始化委托downStair为空委托// 解决方案pu…

【BASH】回顾与知识点梳理(二十七)

【BASH】回顾与知识点梳理 二十七 二十七. 磁盘配额(Quota)27.1 磁盘配额 (Quota) 的应用与实作什么是 QuotaQuota 的一般用途Quota 的使用限制Quota 的规范设定项目 27.2 一个 XFS 文件系统的 Quota 实作范例实作 Quota 流程:设定账号实作 Quota 流程-1&#xff1a…

iTOP-i.MX8M开发板添加USB网络设备驱动

选中支持 USB 网络设备驱动,如下图所示: [*] Device Drivers→ *- Network device support → USB Network Adapters→ {*} Multi-purpose USB Networking Framework 将光标移动到 save 保存,如下图所示: 保存到 arch/arm64/c…

springboot工程集成前端编译包,用于uni-app webView工程,解决其需独立部署带来的麻烦,场景如页面->画布->图片->pdf

前端工程 访问方式 http://127.0.0.1:8080/context/frontEnd/index放行 public class SecurityConfig extends WebSecurityConfigurerAdapter { "/frontEnd/**",SysFrontEndController import lombok.extern.slf4j.Slf4j; import nl.basjes.shaded.org.springfram…

Sentinel使用实例

不说了,直接上官方文档 https://github.com/alibaba/spring-cloud-alibaba/blob/master/spring-cloud-alibaba-examples/sentinel-example/sentinel-core-example/readme-zh.md Sentinel Example 项目说明 本项目演示如何使用 Sentinel starter 完成 Spring Clo…

试岗第一天问题

1、公司的一个项目拉下来 ,npm i 不管用显示 后面百度 使用了一个方法 虽然解决 但是在增加别的依赖不行,后面发现是node版本过高,更换node版本解决。 2、使用插件动态的使数字从0到100(vue-animate-number插件) 第一…

C++ 继承

1.继承的概念及定义 定义 定义格式 继承关系和访问限定符 继承基类成员访问方式的变化 1. 基类private成员在派生类中无论以什么方式继承都是不可见的。这里的不可见是指基类的私有成员还是 被继承到了派生类对象中,但是语法上限制派生类对象不管在类里面还是类外面…

JavaFx基础学习【四】:UI控件的通用属性

目录 前言 一、介绍 二、继承关系 三、常用通用属性 四、属性Properties 五、属性绑定 六、属性监听 七、事件驱动 八、其他章节 前言 如果你还没有看过前面的文章,可以通过以下链接快速前往学习: JavaFx基础学习【一】:基本认识_明…

探讨uniapp的生命周期问题

在uniapp中,生命周期函数分为应用生命周期函数、页面生命周期函数和组件生命周期函数. 1应用声明周期 应用生命周期函数只能在 App.vue 中监听有效,在其他页监听无效。 onLaunch:当uni-app 初始化完成时触发(全局只触发一次)on…

Jmeter性能测试系列-性能测试需求分析

性能测试需求分析 性能测试需求分析与传统的功能测试需求有所不同,功能测试需求分析重点在于从用户层面分析被测对象的功能性、易用性等质量特性,性能测试则需要从终端用户应用、系统架构设计、硬件配置等多个纬度分析系统可能存在性能瓶颈的业务。 性…

线上售楼vr全景看房成为企业数字化营销工具

在房地产业中,VR全景拍摄为买家提供了虚拟看房的全新体验。买家可以通过相关设备,远程参观各个楼盘的样板间和实景,感受房屋的空间布局和环境氛围,极大地提高了购房决策的准确性。对于房地产开发商和中介机构来说,VR全…