Python tkintertools 模块介绍(新版)(上)

简介: Python tkintertools 模块介绍(新版)

Installation/模块安装

Stable version/稳定版本

  • Version/版本 : 2.6.1
  • Release Date/发布日期 : 2023/05/21
pip install tkintertools==2.6.1

或者

pip install tkintertools
• 1

这个是目前的最新版,比较稳定,bug 没有那么多,推荐使用这个。

稳定版有文档可以查看,有 issue 我会去查看并尝试解决 issue。

Development version/开发版本

  • Version/版本 : 2.6.1
  • Release Date/发布日期 : 2023/05/21
pip install tkintertools-dev==2.6.1

这个是作者正在开发的版本,有新功能,但不能保证稳定,bug 可能会比较多。

开发版本没有对应的文档,大家可以在 issue 中提出建议,我会适当采纳一些并在开发版本中更改或实现。

Description/模块说明

tkintertools 是一款基于 tkinter 模块的二次开发的界面编程模块,它完全没有使用任何第三方模块和库的,同时,它也没有任何依赖包,它的功能完全由内置模块和函数实现,而且,它还是跨平台的!它和 tkinter 最大的不同在于,它的控件并非真实的控件,而是在 tkinter 模块中 Canvas 对象中绘制而成的,这就赋予了 tkintertools 控件一些在 tkinter 中没有的特性,列举如下:


控件背景可以是透明的(实际上是没有背景颜色)

控件的样式可以是自定义的(比如按钮有圆角)

控件的创建速度远大于 tkinter 的控件(除了 Canvas 控件)

但同时也产生了一些缺点:


虚拟的控件无法获取焦点

虚拟的控件在文本输入和显示的功能上存在一些缺陷(这个缺陷不是很明显,但强迫症就有点难受了,比如我)

tkintertools 模块还具有一些特色的功能:


利用 tkinter 和 tkintertools 创建的程序,在高分辨率的情况下,tkintertools 的会更加清晰(这点对于笔记本用户很友好,比如我)

可以迅速实现渐变色的效果

窗口缩放,所有的控件的大小跟着缩放(当然,也可以设置为不跟随缩放)

注意:需要 Python3.7 及更高版本才能运行 tkintertools!

Provides/模块功能

Here, only the more distinctive features will be listed

这里只会列举出比较具有特色的功能

Customizable widgets/可自定义的控件

tkintertools 模块的控件拥有许多参数供我们设置,比如圆角的半径、文本和边框以及控件内部的颜色,关联事件等等。

这里要说明的是,每个控件可以设置的关联事件不止一种,在鼠标经过控件时可以绑定事件,鼠标点击控件也可以,鼠标点击后松开也行等等。

文本和边框以及控件的填充色也是类似的,在鼠标经过控件、点击控件、点击后松开都可以设定颜色。

文本类控件还能够从右边逐步输入文本,文本输入提示符也可以不是单调无趣的竖线,可以是其他的,比如下划线等。

最后,大家可以看一下 test.py 文件里面的示例,这个示例展示了 tkintertools 模块的绝大部分功能,示例中更有隐藏的 “多彩变幻” 彩蛋哦!

Automatically control size/自动控制大小

tkintertools 中的控件,其大小和形状可以随着窗口的变化而成比例地变化,不仅仅是控件中的文本,Canvas 绘制的图形也会随之变动,更让人兴奋的是,png 类型的图片也会随之成比例地缩放!当然,你也可以设定参数让其不随之变动,也可以设定参数使其在缩放的时候保持横纵方向的比例。

总之,很方便,很舒适!

Easily move widgets/轻松移动控件

移动函数

Gradient colors/渐变色

颜色函数

Automatically adapt to DPI/自动适应DPI

DPI 级别设置函数

Detailed type hints/详细的类型提示

参考 PEP 526PEP 586PEP 604PEP 612,我采用了最兼容的方式去实现详细的类型提示,可适用 IDE 有 VScode、Pycharm 等。

那什么是类型提示呢?话不多说,直接看图就行:

在 VSCode 编辑器中,当鼠标移至类或者函数的名字上面时,会自动显示该类或者函数的注释文档。通过这种方式,不需要看太多的帮助文档和资料就能熟练地使用 tkintertools 模块!

Across Platforms/跨平台

test.py 在 Windows 系统(Windows10)上运行的界面如下:

test.py 在 Linux 系统(Ubuntu22.04)上运行的界面如下:

Contents/模块内容

Each non internal class and function in the module will be described in detail here

这里会详细说明模块中的每个非内部类和函数

Container Widget/容器控件

  1. Tk: 窗口类


继承于tkinter.Tk,在继承了tkinter模块内Tk的基础上,又加入了对tkintertools模块中的Canvas对象的支持,并加入了检测窗口大小是否缩放的机制,以使得其子Canvas均能正确地进行缩放


Toplevel: 顶级窗口类


继承于tkinter.Toplevel和Tk,加入了对tkintertools模块中的Canvas对象的支持,其余均与Tk一样


Canvas: 画布类


继承于tkinter.Canvas,加入了对画布虚拟控件的支持,同时是各类响应事件、缩放控制的管理者,也对tkinter.Canvas的实例方法有一定的兼容性

Virtual Canvas Widget/虚拟画布控件

Label: 标签控件

标签控件的功能和tkinter.Label的功能类似,但更加的多元化

下面是Label控件的外观:


  1. 源代码
import tkintertools as tkt
root = tkt.Tk('LabelTest', 1000, 400)
canvas = tkt.Canvas(root, 1000, 400, 0, 0)
def colorful(x, y, width, height):  # type: (int, int, int, int) -> None
    """ Gradient colors """
    for i in range(width):
        color = tkt.color(('#FF0000', '#0000FF'), i/width)
        canvas.create_line(x+i, y, x+i, y+height, fill=color)
colorful(510, 175, 480, 150)
tkt.Label(canvas, 50, 50, 400, 100, text='NormalLabel\nHere is the text')
tkt.Label(canvas, 50, 200, 400, 100, radius=20, text='RoundCornerLabel')
tkt.Label(canvas, 550, 50, 400, 100, text='DisableLabel').set_live(False)
tkt.Label(canvas, 550, 200, 400, 100, radius=20,
        text='TransparentLabel', color_fill=tkt.COLOR_NONE)
root.mainloop()

Button: 按钮控件

按钮控件相较于tkinter.Button,其自由度更高,tkinter.Button只有在按下的时候才能触发绑定的关联事件,而Button却可以在鼠标移至按钮上方时、鼠标按下时、鼠标松开时都可以绑定关联事件

下面是Button控件的外观:

源代码

import tkintertools as tkt
root = tkt.Tk('ButtonTest', 500, 500)
canvas = tkt.Canvas(root, 500, 500, 0, 0)
def colorful(x, y, width, height):  # type: (int, int, int, int) -> None
    """ Gradient colors """
    for i in range(width):
        color = tkt.color(('#FF0000', '#0000FF'), i/width)
        canvas.create_line(x+i, y, x+i, y+height, fill=color)
colorful(50, 280, 400, 100)
tkt.Button(canvas, 150, 135, 200, 50, text='NormalButton')
tkt.Button(canvas, 100, 195, 300, 50, radius=10, text='RoundCornerButton')
tkt.Button(canvas, 150, 255, 200, 50, text='DisableButton').set_live(False)
tkt.Button(canvas, 100, 315, 300, 50, radius=10,
        text='TransparentButton', color_fill=tkt.COLOR_NONE)
root.mainloop()

CheckButton: 复选框控件

复选框控件相对于tkinter原生的tkinter.CheckButton在使用方面更加地简单,同时颜值也上升了不少

下面是CheckButton控件的外观:

源代码

import tkintertools as tkt
root = tkt.Tk('CheckButtonTest', 500, 300)
canvas = tkt.Canvas(root, 500, 300, 0, 0)
def colorful(x, y, width, height):  # type: (int, int, int, int) -> None
    """ Gradient colors """
    for i in range(width):
        color = tkt.color(('#FF0000', '#0000FF'), i/width)
        canvas.create_line(x+i, y, x+i, y+height, fill=color)
colorful(40, 190, 420, 50)
tkt.CheckButton(canvas, 50, 50, 30, text='NormalCheckButton', value=True)
tkt.CheckButton(canvas, 50, 100, 30, text='DisableCheckButton',
                value=True).set_live(False)
tkt.CheckButton(canvas, 50, 150, 30, radius=10, text='RoundCornerCheckButton')
tkt.CheckButton(canvas, 50, 200, 30, radius=15,
                text='TransparentCheckButton', color_fill=tkt.COLOR_NONE)
root.mainloop()

Entry: 输入框控件

输入框控件可以轻松地设置输入的文本位置(靠左、居中和靠右),同时,它可以在鼠标移至输入框上方、鼠标未在输入框上方两种状态显示不同的默认文本

下面是Entry控件的外观:

源代码

import tkintertools as tkt
root = tkt.Tk('EntryTest', 500, 400)
canvas = tkt.Canvas(root, 500, 400, 0, 0)
def colorful(x, y, width, height):  # type: (int, int, int, int) -> None
    """ Gradient colors """
    for i in range(width):
        color = tkt.color(('#FF0000', '#0000FF'), i/width)
        canvas.create_line(x+i, y, x+i, y+height, fill=color)
colorful(50, 193, 400, 100)
tkt.Entry(canvas, 20, 20, 200, 30, text=('LeftEntry', 'Enter'))
tkt.Entry(canvas, 20, 55, 200, 30, text=(
    'CenterEntry', 'Enter'), justify='center')
tkt.Entry(canvas, 20, 90, 200, 30, text=(
    'RightEntry', 'Enter'), justify='right')
tkt.Entry(canvas, 270, 20, 200, 30, radius=8, text='LeftEntry')
tkt.Entry(canvas, 270, 55, 200, 30, radius=8,
        text='CenterEntry', justify='center')
tkt.Entry(canvas, 270, 90, 200, 30, radius=8,
        text='RightEntry', justify='right')
tkt.Entry(canvas, 100, 150, 300, 35, text=('PasswordEntry',
        'Click To Enter'), justify='center', show='●')
tkt.Entry(canvas, 100, 200, 300, 35, text='DisableEntry',
        justify='center').set_live(False)
tkt.Entry(canvas, 100, 250, 300, 35, text='TransparentEntry',
        justify='center', color_fill=tkt.COLOR_NONE)
root.mainloop()

Text: 文本框控件

文本框类似于输入框,这里就不再赘述

下面是Text控件的外观:

源代码

import tkintertools as tkt
root = tkt.Tk('TextTest', 1000, 400)
canvas = tkt.Canvas(root, 1000, 400, 0, 0)
def colorful(x, y, width, height) -> None:  # type: (int, int, int, int) -> None
    """ Gradient colors """
    for i in range(width):
        color = tkt.color(('#FF0000', '#0000FF'), i/width)
        canvas.create_line(x+i, y, x+i, y+height, fill=color)
colorful(510, 175, 480, 150)
tkt.Text(canvas, 50, 50, 400, 100, text=('NormalText(Left)', 'Click To Enter'))
tkt.Text(canvas, 50, 200, 400, 100, radius=20,
        text='RoundCornerText(Center)', justify='center')
tkt.Text(canvas, 550, 50, 400, 100, text='DisableText').set_live(False)
tkt.Text(canvas, 550, 200, 400, 100, radius=20,
        text='TransparentText(Right)', justify='right', color_fill=tkt.COLOR_NONE)
root.mainloop()

Progressbar: 进度条控件

进度条控件相比tkinter.ttk.Progressbar,外观上的自由度较大

下面是Progressbar控件的外观:

源代码

import tkintertools as tkt
root = tkt.Tk('ProgressbarTest', 500, 500)
canvas = tkt.Canvas(root, 500, 500, 0, 0)
def colorful(x, y, width, height) -> None:  # type: (int, int, int, int) -> None
    """ Gradient colors """
    for i in range(width):
        color = tkt.color(('#FF0000', '#0000FF'), i/width)
        canvas.create_line(x+i, y, x+i, y+height, fill=color)
colorful(30, 290, 440, 50)
tkt.Progressbar(canvas, 50, 50, 400, 30)
tkt.Progressbar(canvas, 50, 100, 400, 30).load(.6667)
tkt.Progressbar(canvas, 50, 150, 400, 30, borderwidth=5).load(1)
(_ := tkt.Progressbar(canvas, 50, 200, 400, 30)).load(0.3333)
_.set_live(False)
tkt.Progressbar(canvas, 50, 250, 400, 30, color_bar=(
    'lightyellow', 'skyblue')).load(.5)
tkt.Progressbar(canvas, 50, 300, 400, 30, color_bar=('', 'orange')).load(.1667)
progressbar = tkt.Progressbar(canvas, 50, 375, 400, 30)
progressbar_2 = tkt.Progressbar(canvas, 50, 425, 400, 30)
def load(total, count=0):  # type: (int, int) -> None
    """ load progressbar """
    progressbar.load(count/total)
    progressbar_2.load(1-count/total)
    if count < total:
        root.after(3, load, total, count+1)
load(10000)
root.mainloop()
目录
相关文章
|
8天前
|
Python
在Python中,可以使用内置的`re`模块来处理正则表达式
在Python中,可以使用内置的`re`模块来处理正则表达式
20 5
|
18天前
|
Java 程序员 开发者
Python的gc模块
Python的gc模块
|
21天前
|
数据采集 Web App开发 JavaScript
python-selenium模块详解!!!
Selenium 是一个强大的自动化测试工具,支持 Python 调用浏览器进行网页抓取。本文介绍了 Selenium 的安装、基本使用、元素定位、高级操作等内容。主要内容包括:发送请求、加载网页、元素定位、处理 Cookie、无头浏览器设置、页面等待、窗口和 iframe 切换等。通过示例代码帮助读者快速掌握 Selenium 的核心功能。
62 5
|
21天前
|
Python
SciPy 教程 之 SciPy 模块列表 13
SciPy教程之SciPy模块列表13:单位类型。常量模块包含多种单位,如公制、二进制(字节)、质量、角度、时间、长度、压强、体积、速度、温度、能量、功率和力学单位。示例代码展示了如何使用`constants`模块获取零摄氏度对应的开尔文值(273.15)和华氏度与摄氏度的转换系数(0.5556)。
17 1
|
22天前
|
XML 前端开发 数据格式
超级详细的python中bs4模块详解
Beautiful Soup 是一个用于从网页中抓取数据的 Python 库,提供了简单易用的函数来处理导航、搜索和修改分析树。支持多种解析器,如 Python 标准库中的 HTML 解析器和更强大的 lxml 解析器。通过简单的代码即可实现复杂的数据抓取任务。本文介绍了 Beautiful Soup 的安装、基本使用、对象类型、文档树遍历和搜索方法,以及 CSS 选择器的使用。
53 1
|
19天前
|
Python
SciPy 教程 之 SciPy 模块列表 16
SciPy教程之SciPy模块列表16 - 单位类型。常量模块包含多种单位,如公制、质量、角度、时间、长度、压强、体积、速度、温度、能量、功率和力学单位。示例代码展示了力学单位的使用,如牛顿、磅力和千克力等。
15 0
|
20天前
|
JavaScript Python
SciPy 教程 之 SciPy 模块列表 15
SciPy 教程之 SciPy 模块列表 15 - 功率单位。常量模块包含多种单位,如公制、质量、时间等。功率单位中,1 瓦特定义为 1 焦耳/秒,表示每秒转换或耗散的能量速率。示例代码展示了如何使用 `constants` 模块获取马力值(745.6998715822701)。
15 0
|
20天前
|
JavaScript Python
SciPy 教程 之 SciPy 模块列表 15
SciPy教程之SciPy模块列表15:单位类型。常量模块包含多种单位,如公制、质量、角度、时间、长度、压强、体积、速度、温度、能量、功率和力学单位。功率单位以瓦特(W)表示,1W=1J/s。示例代码展示了如何使用`constants`模块获取马力(hp)的值,结果为745.6998715822701。
16 0
|
21天前
|
Python
SciPy 教程 之 SciPy 模块列表 13
SciPy 教程之 SciPy 模块列表 13 - 单位类型。常量模块包含多种单位:公制、二进制(字节)、质量、角度、时间、长度、压强、体积、速度、温度、能量、功率和力学单位。示例:`constants.zero_Celsius` 返回 273.15 开尔文,`constants.degree_Fahrenheit` 返回 0.5555555555555556。
14 0
|
22天前
|
Python
SciPy 教程 之 SciPy 模块列表 11
SciPy教程之SciPy模块列表11:单位类型。常量模块包含公制单位、质量单位、角度换算、时间单位、长度单位、压强单位、体积单位、速度单位、温度单位、能量单位、功率单位、力学单位等。体积单位示例展示了不同体积单位的换算,如升、加仑、流体盎司、桶等。
18 0