以前写过界面,但是没有记录下来,以至于现在得从头学习一次,论做好笔记的重要性。

现在学习的是怎么写一个tabview出来,也就是用tkinter做一个界面切换的效果。参考链接:https://blog.csdn.net/yingshukun/article/details/89150105

tabview.py

import tkinter as tk
import tkinter.ttk as ttk class TabView(tk.Frame):
_tabs = []
_tab_view = []
_tab_text = []
_current = 0 # 当前选中tab的索引
_generate_func = None
_select_listen = None
_remove_listen = None '''
select_listen: tab选中事件回调函数,回调函数包含一个index参数
remove_listen: tab删除事件回调函数,返回值必须是一个布尔值,True表示删除,反之不删除
generate_body: 生成body控件的回调函数,返回值应该是一个widget,用于添加到body中
''' def __init__(self, master=None, select_listen=None,
remove_listen=None, generate_body=None, cnf=None, **kw):
super().__init__(master, cnf, **kw)
# 选项卡
self._top = tk.Frame(self)
self._top.bind("<Double-Button-1>", self._tab_add)
self._top.pack(fill="x") # 分割线
ttk.Separator(self, orient=tk.HORIZONTAL).pack(fill="x") # 主体view
self._bottom = tk.Frame(self)
self._bottom.pack(fill="both", expand="yes")
self._photo = tk.PhotoImage(file="remove.gif") # 事件回调
if select_listen:
if callable(select_listen):
self._select_listen = select_listen
else:
raise Exception("select_action is not callable") if remove_listen:
if callable(remove_listen):
self._remove_listen = remove_listen
else:
raise Exception("remove_action is not callable") if generate_body:
if callable(generate_body):
self._generate_func = generate_body
else:
raise Exception("generate_body is not callable") # 添加选项卡
def add_tab(self, view, text):
self._add_body(view)
self._create_tab(text) # 删除选项卡
def remove_tab(self, index):
self._tab_text.pop(index) self._tabs[index].destroy()
self._tab_view[index].destroy() self._tabs.pop(index)
self._tab_view.pop(index) if index > 0:
self._current = index - 1
self._active() @property
def body(self):
return self._bottom def _create_tab(self, text):
# 选项卡单元
tab_container = tk.Frame(self._top, relief=tk.RAISED, bd=1) # 标题、删除按钮
_tab_text_view = tk.Label(tab_container, text=text, padx=8)
_tab_remove_view = tk.Label(tab_container, image=self._photo) _tab_text_view.bind("<Button-1>", self._tab_click)
_tab_remove_view.bind("<Button-1>", self._tab_remove) _tab_text_view.pack(side=tk.LEFT)
_tab_remove_view.pack(side=tk.LEFT)
tab_container.pack(side=tk.LEFT)
self._tab_text.append(_tab_text_view)
self._tabs.append(tab_container)
self._active() def _add_body(self, view):
self._tab_view.append(view)
view.place(relwidth=1.0, relheight=1.0) # 刷新当前激活状态
def _active(self):
for i, item in enumerate(self._tabs):
if i == self._current:
item.config(relief=tk.RAISED, bd=3)
# lift方法,让当前widget处于最顶层
self._tab_view[self._current].lift()
else:
item.config(bd=1) def _tab_add(self, event):
self._current = len(self._tabs)
if not self._generate_func:
self.add_tab(tk.Frame(self.body), "Untitled")
else:
self.add_tab(self._generate_func(), "Untitled") # 删除事件回调
def _tab_remove(self, event):
current_widget = event.widget.winfo_parent()
select_index = self._index(current_widget) is_remove = True
if self._remove_listen:
is_remove = self._remove_listen(select_index) if is_remove:
if select_index != -1:
self.remove_tab(select_index) # 选项卡点击事件回调
def _tab_click(self, event):
current_widget = event.widget.winfo_parent()
select_index = self._index(current_widget)
if select_index != -1:
self._current = select_index
self._active() if self._select_listen:
self._select_listen(select_index) # 返回当前选项卡的索引
def _index(self, el):
index = [i for i, x in enumerate(self._tabs) if str(x) == el]
return index[0] if index else -1

对于上面tabview的类,或许会有不太明白的地方,一一解析。

1. Frame

frame其实就像一个布局,一个一个的分区,然后分别往上面添加控件。

2. Bind

绑定事件,比如鼠标单击,双击时需要操作什么

这两个详细的可以参考:https://www.cnblogs.com/sunzebo/articles/9643620.html

3. callable()函数

callable() 函数用于检查一个对象是否是可调用的。如果返回 True,object 仍然可能调用失败;但如果返回 False,调用对象 object 绝对不会成功。链接:https://www.runoob.com/python/python-func-callable.html

Python基础之tabview的更多相关文章

  1. python之最强王者(2)——python基础语法

    背景介绍:由于本人一直做java开发,也是从txt开始写hello,world,使用javac命令编译,一直到使用myeclipse,其中的道理和辛酸都懂(请容许我擦干眼角的泪水),所以对于pytho ...

  2. Python开发【第二篇】:Python基础知识

    Python基础知识 一.初识基本数据类型 类型: int(整型) 在32位机器上,整数的位数为32位,取值范围为-2**31-2**31-1,即-2147483648-2147483647 在64位 ...

  3. Python小白的发展之路之Python基础(一)

    Python基础部分1: 1.Python简介 2.Python 2 or 3,两者的主要区别 3.Python解释器 4.安装Python 5.第一个Python程序 Hello World 6.P ...

  4. Python之路3【第一篇】Python基础

    本节内容 Python简介 Python安装 第一个Python程序 编程语言的分类 Python简介 1.Python的由来 python的创始人为吉多·范罗苏姆(Guido van Rossum) ...

  5. 进击的Python【第三章】:Python基础(三)

    Python基础(三) 本章内容 集合的概念与操作 文件的操作 函数的特点与用法 参数与局部变量 return返回值的概念 递归的基本含义 函数式编程介绍 高阶函数的概念 一.集合的概念与操作 集合( ...

  6. 进击的Python【第二章】:Python基础(二)

    Python基础(二) 本章内容 数据类型 数据运算 列表与元组的基本操作 字典的基本操作 字符编码与转码 模块初探 练习:购物车程序 一.数据类型 Python有五个标准的数据类型: Numbers ...

  7. Python之路【第一篇】python基础

    一.python开发 1.开发: 1)高级语言:python .Java .PHP. C#  Go ruby  c++  ===>字节码 2)低级语言:c .汇编 2.语言之间的对比: 1)py ...

  8. python基础之day1

    Python 简介 Python是著名的“龟叔”Guido van Rossum在1989年圣诞节期间,为了打发无聊的圣诞节而编写的一个编程语言. Python为我们提供了非常完善的基础代码库,覆盖了 ...

  9. python基础之文件读写

    python基础之文件读写 本节内容 os模块中文件以及目录的一些方法 文件的操作 目录的操作 1.os模块中文件以及目录的一些方法 python操作文件以及目录可以使用os模块的一些方法如下: 得到 ...

随机推荐

  1. H5播放需要解密的m3u8音频文件

    <audio ref="audio"></audio> import CryptoJS from "crypto-js"; import ...

  2. DOS命令行(9)——wmic-系统管理命令行工具

    wmic 介绍与语法 WMI(Windows Management Instrumentation,Windows 管理规范)是一项核心的 Windows 管理技术:用户可以使用 WMI 管理本地和远 ...

  3. Kubernetes使用Keda进行弹性伸缩,更合理利用资源

    我最新最全的文章都在南瓜慢说 www.pkslow.com,欢迎大家来喝茶! 1 简介 Kubernetes自带的HPA是只支持CPU/MEM的,很多时候我们并不根据这两项指标来进行伸缩资源.比如消费 ...

  4. excel替换函数substitute

    1.substitute(需要执行替换操作的单元格区域,旧文本,新文本,第N个旧内容) 例:substitute(A1,"a","b",2)    A1=aab ...

  5. excel VBA构造正则函数(双参数)

    Function zhengze(ze As String, Rng As Range)    Set regx = CreateObject("vbscript.regexp") ...

  6. Linux-远程服务ssh

    1.远程管理服务介绍 (1)SSH是(Secure Shell Protocol)的简写,由IETF网络工作小组制定:在进行数据传输之前,SSH先对联机数据包通过加密技术进行机密处理,加密后在进行文件 ...

  7. 21、nginx之ngx_http_proxy_module模块

    Nginx 的代理功能是通过 ngx_http_proxy_module 模块来实现的.默认在安装 Nginx 时已经安装了ngx_http_proxy_module模 块,因此可直接使用 ngx_h ...

  8. hdu 4686 Arc of Dream 自己推 矩阵快速幂

    A.mat[0][0] = 1, A.mat[0][1] = 1, A.mat[0][2] = 0, A.mat[0][3] = 0, A.mat[0][4] = 0; A.mat[1][0] = 0 ...

  9. Spring:Spring优势——分层架构简介

    Spring框架采用分层架构,根据不同的功能被划分成了多个模块,这些模块大体可分为 Data Access/Integration.Web.AOP.Aspects.Messaging.Instrume ...

  10. base64文件解码

    $str = str_replace(' ', '+', $str); //替换空字符串为+$str = str_replace('\n', '',$str); //置空换行符$str = str_r ...