python tkinter自定义实现Expander控件

 更新时间:2023年08月16日 08:42:58   作者:微小冷  
和其他成熟的GUI库相比,tkinter的组件并不是太多,但在自定义组件这一点上,并不逊色于其他框架,下面小编就教大家如何自定义一个Expander控件吧

和其他成熟的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()

到此这篇关于python tkinter自定义实现Expander控件的文章就介绍到这了,更多相关tkinter自定义Expander控件内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python中DJANGO简单测试实例

    Python中DJANGO简单测试实例

    这篇文章主要介绍了Python中DJANGO简单测试,实例分析了DJANGO的用法,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-05-05
  • Python操作系统的6个自动化脚本小结

    Python操作系统的6个自动化脚本小结

    在Python中,实现操作系统自动化的脚本可以涵盖从文件操作、系统监控到网络任务等多种功能,下面我将详细介绍六个不同类别的Python自动化脚本示例,这些示例将帮助你理解如何用Python来自动化日常操作系统任务,需要的朋友可以参考下
    2024-10-10
  • python3使用迭代生成器实现减少内存占用

    python3使用迭代生成器实现减少内存占用

    这篇文章主要介绍了python3使用迭代生成器实现减少内存占用的相关资料,需要的朋友可以参考下
    2021-05-05
  • Python保存数据到文件的实现方式

    Python保存数据到文件的实现方式

    这篇文章主要介绍了Python保存数据到文件的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-11-11
  • Django 通过JS实现ajax过程详解

    Django 通过JS实现ajax过程详解

    这篇文章主要介绍了Django 通过JS实现ajax过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-07-07
  • python 密码加密与解密的实现

    python 密码加密与解密的实现

    本文主要介绍了python 密码加密与解密的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-02-02
  • Yolov5更换BiFPN的详细步骤总结

    Yolov5更换BiFPN的详细步骤总结

    将YOLOv5中的PANet层修改为EfficientDet-BiFPN,实现自上而下与自下而上的深浅层特征双向融合,明显提升YOLOv5算法检测精度,下面这篇文章主要给大家介绍了关于Yolov5更换BiFPN的详细步骤,需要的朋友可以参考下
    2022-12-12
  • python之pymysql模块简单应用示例代码

    python之pymysql模块简单应用示例代码

    这篇文章主要介绍了python之pymysql模块简单应用示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-12-12
  • 用Python获取摄像头并实时控制人脸的实现示例

    用Python获取摄像头并实时控制人脸的实现示例

    这篇文章主要介绍了用Python获取摄像头并实时控制人脸的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-07-07
  • 对python中两种列表元素去重函数性能的比较方法

    对python中两种列表元素去重函数性能的比较方法

    今天小编就为大家分享一篇对python中两种列表元素去重函数性能的比较方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-06-06

最新评论