提交 37233338 编写于 作者: 小康2022's avatar 小康2022 👍

update README.md

上级 2916e320
......@@ -8,9 +8,11 @@
<img src="https://img.shields.io/badge/License-Mulan PSL v2-green" alt="License" />
</a>
<a href="./CHANGELOG.md">
<img src="https://img.shields.io/badge/ChangeLog-2.5.11-orange" alt="CHANGELOG" />
<img src="https://img.shields.io/badge/ChangeLog-2023/03/13-orange" alt="CHANGELOG" />
</a>
<a href="./TODO.md">
<img src="https://img.shields.io/badge/ToDo-6-yellow" alt="TODO" />
</a>
<img src="https://img.shields.io/badge/Python-3.10.0-yellow" alt="environment" />
<br>
<img src="https://img.shields.io/badge/Mail-2951256653@qq.com-purple" alt="Contact" />
<a href="https://xiaokang2022.blog.csdn.net">
......@@ -22,7 +24,7 @@
----------------------
`tkintertools` 是一个完全没有使用任何第三方模块和库的Python界面开发模块,同时,它也没有任何依赖包,它的功能完全由内置模块和函数实现。
`tkintertools` 是一款基于 `tkinter` 模块的二次开发的界面编程模块,它和 `tkinter` 最大的不同在于,`tkintertools` 的控件并非真实的控件,而是在 `tkinter` 模块中 `Canvas` 对象中绘制而成的,这就赋予了 `tkintertools` 控件一些特性,列举如下:
`tkintertools` 是一款基于 `tkinter` 模块的二次开发的界面编程模块,它和 `tkinter` 最大的不同在于,的控件并非真实的控件,而是在 `tkinter` 模块中 `Canvas` 对象中绘制而成的,这就赋予了 `tkintertools` 控件一些特性,列举如下:
1. 控件背景可以是透明的👍
2. 控件的样式可以是自定义的👍
......@@ -77,51 +79,81 @@ Each non internal class and function in the module will be described in detail h
1. `Label` : 标签控件
标签控件的功能和 tkinter.Label 的功能类似,但更加的多元化
下面是 Label 控件的外观:
标签控件的功能和 `tkinter.Label` 的功能类似,但更加的多元化
下面是 `Label` 控件的外观:
<img width="720px" src="https://gitcode.net/weixin_62651706/tkintertools/-/raw/master/docs/images/LabelTest.png" alt="LabelTest.png" />
> SourceCode : [test_label.py](./test_label.py)
> SourceCode/源代码 : [test_label.py](./test_label.py)
2. `Button` : 按钮控件
按钮控件相较于 tkinter.Button ,其自由度更高,tkinter.Button 只有在按下的时候才能触发绑定的关联事件,而 Button 却可以在鼠标移至按钮上方时、鼠标按下时、鼠标松开时都可以绑定关联事件
下面是 Button 控件的外观:
按钮控件相较于 `tkinter.Button` ,其自由度更高,`tkinter.Button` 只有在按下的时候才能触发绑定的关联事件,而 `Button` 却可以在鼠标移至按钮上方时、鼠标按下时、鼠标松开时都可以绑定关联事件
下面是 `Button` 控件的外观:
<img width="360px" src="https://gitcode.net/weixin_62651706/tkintertools/-/raw/master/docs/images/ButtonTest.png" alt="ButtonTest.png" />
> SourceCode : [test_button.py](./test_button.py)
> SourceCode/源代码 : [test_button.py](./test_button.py)
3. `Entry` : 输入框控件
输入框控件可以轻松地设置输入的文本位置(靠左、居中和靠右),同时,它可以在鼠标移至输入框上方、鼠标未在输入框上方两种状态显示不同的默认文本
下面是 Entry 控件的外观:
输入框控件可以轻松地设置输入的文本位置(靠左、居中和靠右),同时,它可以在鼠标移至输入框上方、鼠标未在输入框上方两种状态显示不同的默认文本
下面是 `Entry` 控件的外观:
<img width="360px" src="https://gitcode.net/weixin_62651706/tkintertools/-/raw/master/docs/images/EntryTest.png" alt="EntryTest.png" />
> SourceCode : [test_entry.py](./test_entry.py)
> SourceCode/源代码 : [test_entry.py](./test_entry.py)
4. `Text` : 文本框控件
文本框类似于输入框,这里就不再赘述
下面是 Text 控件的外观:
文本框类似于输入框,这里就不再赘述
下面是 `Text` 控件的外观:
<img width="720px" src="https://gitcode.net/weixin_62651706/tkintertools/-/raw/master/docs/images/TextTest.png" alt="TextTest.png" />
> SourceCode : [test_text.py](./test_text.py)
> SourceCode/源代码 : [test_text.py](./test_text.py)
5. `Progressbar` : 进度条控件
进度条控件相比 tkinter.ttk.Progressbar,外观上的自由度较大
下面是 Progressbar 控件的外观:
进度条控件相比 `tkinter.ttk.Progressbar`,外观上的自由度较大
下面是 `Progressbar` 控件的外观:
<img width="360px" src="https://gitcode.net/weixin_62651706/tkintertools/-/raw/master/docs/images/ProgressbarTest.png" alt="ProgressbarTest.png" />
> SourceCode : [test_progressbar.py](./test_progressbar.py)
> SourceCode/源代码 : [test_progressbar.py](./test_progressbar.py)
### ⭐Tool Class/工具类
1. `PhotoImage` : 图片类,继承于 `tkinter.PhotoImage`
2. `Singleton` : 单例模式类,用于继承
2. `Singleton` : 单例模式类
单例模式,不用介绍了吧?通过继承它来使用
### ⭐Tool Function/工具函数
1. `move` : 移动函数
移动函数可以轻松地按一定的规律、移动速度、移动时间去移动 `tkintertools` 模块内的所有对象,同时兼容了 `tkinter` 内的对象,即 `tkinter` 中的对象也可以很方便地移动,甚至它还可以移动窗口的位置!
<img width="720px" src="https://gitcode.net/weixin_62651706/tkintertools/-/raw/master/docs/images/MoveTest.gif" alt="MoveTest.gif" />
> SourceCode/源代码 : [test_move.py](./test_move.py)
2. `text` : 文本函数
可以快速并方便地得到一个参数长度的字符串,且字符串的内容可以指定位置
如:得到一个20长度的字符串“tkintertools”
`left` : "tkintertools "
`center` : " tkintertools "
`right` : " tkintertools"
3. `color` : 颜色函数
颜色函数可以轻松求出一个颜色到另外一个颜色的过渡颜色,因此可以轻松得到渐变色的效果,同时,改变传入的参数还可以得到传入颜色的对比色
第二张图是 test.py 在图像测试中绘制的图案
<img width="360px" src="https://gitcode.net/weixin_62651706/tkintertools/-/raw/master/docs/images/ColorTest.png" alt="ColorTest.png" />
<img width="360px" src="https://gitcode.net/weixin_62651706/tkintertools/-/raw/master/docs/images/Test_Draw.png" alt="Test_Draw.png" />
> SourceCode/源代码 : [test_color.py](./test_color.py)
4. `SetProcessDpiAwareness` : DPI 级别设置函数
这个函数实际上只是对函数 `ctypes.OleDLL('shcore').SetProcessDpiAwareness` 的一个简单包装,其值可为 0、1 和 2,分别代表程序 DPI 的不同级别,那么缩放效果也就不同,`tkintertools` 选择的值是 1,但程序默认值实际为 0
下面是执行了这个函数的效果
<img width="720px" src="https://gitcode.net/weixin_62651706/tkintertools/-/raw/master/docs/images/SetProcessDpiAwareness_0.png" alt="SetProcessDpiAwareness_0.png" />
下面是未执行这个函数的效果
<img width="720px" src="https://gitcode.net/weixin_62651706/tkintertools/-/raw/master/docs/images/SetProcessDpiAwareness_1.png" alt="SetProcessDpiAwareness_1.png" />
从上面的两张图中可以很明显的看出第一张很模糊,第二张很清晰,这就是 DPI 级别不同的原因,不过这一点在平面缩放比不是 100% 的时候才会出现
大家对上面的图肯定很熟悉,这不就是 IDLE 吗!?对,这个的问题的解决办法也是来自于 IDLE 的源代码 [pyshell.py line 18~20]
注意:该函数在程序的不同位置执行的效果不一样!一般用在 `mainloop` 前面
🚀More/更多
-----------
> GitCode:
......
因为 它太大了无法显示 image diff 。你可以改为 查看blob
......@@ -54,7 +54,7 @@ def shutdown() -> None:
root.quit() # 退出测试程序
root = tkt.Tk('tkintertools - 测试程序', 1280, 720, shutdown=shutdown)
root = tkt.Tk('tkintertools', 1280, 720, shutdown=shutdown)
root.minsize(640, 360)
menu = Menu(root, tearoff=False)
root.configure(menu=menu)
......@@ -69,11 +69,6 @@ canvas_graph.place(x=1280, y=0)
def sound(): return Beep(600, 100)
m = Menu(menu, tearoff=False)
menu.add_cascade(menu=m, label='帮助(H)')
m.add_command(label='关于', accelerator='Ctrl+A')
tkt.Button(
canvas_main, 10, 660, 200, 50, 0, '模块文档',
command=lambda: (tkt.move(root, canvas_main, 1280*canvas_main.rx, 0, 500, 'rebound'),
......
import tkintertools as tkt
root = tkt.Tk('ColorTest', 500, 500)
canvas = tkt.Canvas(root, 500, 500)
canvas.place(x=0, y=0)
def colorful(x: int, y: int, width: int, height: int) -> None:
""" 渐变色 """
for i in range(width):
color = tkt.color(('#FF0000', '#00FF00'), i/width)
color_2 = tkt.color(('#FFFFFF', '#000000'), i/width)
canvas.create_line(x+i, y, x+i, y+height, fill=color)
canvas.create_oval(250-i/3, 300-i/3, 250+i/3, 300 +
i/3, outline=color_2, width=2)
colorful(50, 50, 400, 100)
tkt.SetProcessDpiAwareness()
root.mainloop()
import tkintertools as tkt
root = tkt.Tk('MoveTest', 500, 500)
canvas = tkt.Canvas(root, 500, 500)
canvas.place(x=0, y=0)
rect = canvas.create_rectangle(50, 350, 150, 450)
def move_window(switch: list[bool] = [True]) -> None:
""" 移动窗口 """
tkt.move(root, None, 1000 if switch[0] else -1000, 0, 800, 'flat')
switch[0] = not switch[0]
def move_button(switch: list[bool] = [True]) -> None:
""" 移动按钮 """
tkt.move(canvas, button, 200 if switch[0] else -200, 0, 500, 'rebound')
switch[0] = not switch[0]
def move_rect(switch: list[bool] = [True]) -> None:
""" 移动画布绘制的矩形 """
tkt.move(canvas, rect, 200 if switch[0] else -200, 0, 500, 'smooth')
switch[0] = not switch[0]
tkt.Button(canvas, 50, 50, 200, 40, 10, 'MoveWindow', command=move_window)
tkt.Button(canvas, 50, 100, 200, 40, 10, 'MoveRect', command=move_rect)
button = tkt.Button(canvas, 50, 150, 200, 40, 10,
'MoveButton', command=move_button)
tkt.SetProcessDpiAwareness()
root.mainloop()
......@@ -1295,7 +1295,7 @@ class Singleton(object):
def move(
master: Tk | Canvas | tkinter.Misc | tkinter.BaseWidget,
master: Tk | Canvas | tkinter.Misc | tkinter.BaseWidget | None,
widget: Canvas | _BaseWidget | tkinter.BaseWidget,
dx: int,
dy: int,
......@@ -1332,9 +1332,9 @@ def move(
key = 1 / sum(dis)
dis = tuple((key*i*dx, key*i*dy) for i in dis)
if isinstance(widget, tkinter.Tk | tkinter.Toplevel): # 窗口
geometry, ox, oy = widget.geometry().split('+')
widget.geometry(
if widget is None: # 窗口
geometry, ox, oy = master.geometry().split('+')
master.geometry(
'%s+%d+%d' % (geometry, int(ox)+dis[_ind][0], int(oy)+dis[_ind][1]))
elif isinstance(master, tkinter.Misc) and isinstance(widget, tkinter.BaseWidget): # tkinter 的控件
place_info = widget.place_info()
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册