Name | tkfly JSON |
Version |
0.1.0b3
JSON |
| download |
home_page | |
Summary | |
upload_time | 2023-05-28 09:57:26 |
maintainer | |
docs_url | None |
author | XiangQinxi |
requires_python | >=3.7,<4.0 |
license | |
keywords |
|
VCS |
|
bugtrack_url |
|
requirements |
No requirements were recorded.
|
Travis-CI |
No Travis.
|
coveralls test coverage |
No coveralls.
|
# tkfly
基于`tkinter` `tcl / tk` `pythonnet / winforms`扩展的中型组件库
`tkfly`指`tkinter`插上翅膀飞翔,意为借助扩展的功能翱翔。
([tklib -大小约3.7MB](https://core.tcl-lang.org/tklib))
([twapi -大小约2.0MB](https://twapi.magicsplat.com/))
([blend2d -大小约7.6MB](https://wiki.tcl-lang.org/page/Blend2d))
([telerik]())
帮助你开发大型高级的程序
## 教程
### 开始
```bash
# 暂时处于预览版
python -m pip install tkfly --pre
```
### 工具提示
`tkfly`通过`tkinter`调用`tcl`导入`tklib`实现,可以实现`tklib`库所能实现的各种功能。
让我来运行一个最简单工具提示吧!
(基于[tklib/tooltip](https://core.tcl-lang.org/tklib/doc/trunk/embedded/md/tklib/files/modules/tooltip/tooltip.md))
```python
from tkinter import Tk, ttk
from tkfly import FlyToolTip
root = Tk()
tooltip = FlyToolTip()
button = ttk.Button()
tooltip.tooltip(button, "button1")
button.pack()
root.mainloop()
```
### 输入框小组件的历史记录功能
输入框没有历史记录功能一直是个遗憾,但是可以通过扩展组件实现
(基于[tklib/history](https://core.tcl-lang.org/tklib/doc/trunk/embedded/md/tklib/files/modules/history/tklib_history.md))
```python
from tkinter import Tk, Entry, ttk
from tkfly import FlyHistory
root = Tk()
entry = ttk.Entry()
entry.pack()
history = FlyHistory(entry)
history.add(114514)
history.add(3.1415926)
history.up()
root.mainloop()
```
你可以通过按键盘上下键切换历史记录文本。
#### 初始化
```python
history.init()
```
初始化时会有一个必选参数`widget`和一个可选参数`len`,`widget`是目标组件,`len`是设定的长度。
初始化完成后,就可以通过上下键来切换了
#### 添加记录
```python
history.add()
```
添加需要一行字串符参数,添加后可以用上下键切换找到记录
#### 获取历史记录列表
```python
history.get()
```
你将会得到一个`元组`
### 日期输入框
可以通过上下键调整日期
```python
from tkinter import Tk
from tkfly import FlyDateField
root = Tk()
datefield = FlyDateField()
datefield.pack()
datefield2 = FlyDateField(format="%Y-%m-%d")
datefield2.pack()
root.mainloop()
```
#### 日期格式
可以通过`format`参数修改格式,示例`"%Y-%m-%d"`,其中%Y是年号,%m是月份,%d是天。
### 2D渲染
Blend2D是一个高性能的2D矢量图形引擎,通过调用可以生成图片为label组件设置图片显示
下面有个示例
```python
from tkinter import *
from tkfly import *
root = Tk()
blend2D = Fly2D()
surface = blend2D.create_image_surface(
size=(500, 500)
)
print("Create ImageSurface", surface.image_name)
surface.surface.fill(
blend2D.create_circle((150, 150), 50),
blend2D.get_color("lightblue", alpha=0.5)
)
surface.surface.fill(
blend2D.create_circle((250, 250), 60),
blend2D.get_color("lightblue", alpha=1.0)
)
surface.surface.fill(
blend2D.create_circle((350, 350), 55),
blend2D.get_color("lightblue", alpha=0.75)
)
from tkfly.core import fly_local, fly_chdir
with fly_chdir(fly_local() + "\\blend2d"):
fontface = blend2D.create_fontface(fontfile="HarmonyOS_Sans_Medium.ttf")
font = blend2D.create_font(fontface=fontface, fontsize=20)
print("Create FontFace", fontface._name)
print("Create Font", font._name)
surface.surface.fill(
blend2D.create_text((225, 257), string="Fly2D", font=font),
blend2D.get_color("black")
)
surface.pack()
surface.surface.save("fly2d.png")
root.mainloop()
```
### 扩展组件
#### Document
这是类似`多文档窗口`类的组件,只是暂时布局没想到好的方案,会空下大部分的空间
```python
from tkinter import *
from tkinter import ttk
from tkfly import *
root = Tk()
document = FlyMkDocument()
button = ttk.Button(document)
button.pack(fill="both", expand="yes")
document.config(title="这是多文档窗口")
root.mainloop()
```
#### ToolBar
工具栏组件
```python
from tkinter import *
from tkfly import *
root = Tk()
toolbar = FlyMkToolBar()
button1 = toolbar.add(
"button",
command=lambda:
print(f"toolbutton is {toolbar.get(button1)}")
)
button2 = toolbar.add("button", command=lambda: toolbar.delete(button2))
toolbar.pack(fill="x", side="top")
root.mainloop()
```
## tkscrollutil
实际上这就是作者我以前做过的一个项目。
### ScrolllArea
可以快速地为水平滚动、垂直滚动组件设置滚动条
#### 属性
`autohidescrollbars` 设置组件是否自动隐藏滚动条。布尔数值。默认`False`。也就是说,当你把鼠标指针放到滚动条上时,滚动条才会显示。
`lockinterval` 设置组件滚动条地锁定间隔。整数数值。默认`300`.
`respectheader` 仅当将嵌入到组件内地`tablelist`版本为6.5及以上版本时才能使用,后续等开发出`tablelist`的扩展库时补充
`respecttitlecolumns` 仅当将嵌入到组件内地`tablelist`版本为6.5及以上版本时才能使用,后续等开发出`tablelist`的扩展库时补充
`xscrollbarmode` 设置水平滚动条的模式。可选值为`static` `dynamic` `none`。默认`none`。`static`为常驻滚动条;`dynamic`为自动滚动条;`none`为没有滚动条
`yscrollbarmode` 设置垂直滚动条的模式。可选值为`static` `dynamic` `none`。默认`static`。`static`为常驻滚动条;`dynamic`为自动滚动条;`none`为没有滚动条
#### 方法
`setwidget` 设置具有滚动条属性的组件,使组件快速设置滚动条。
#### 示例
```python
from tkinter import Tk, Listbox
from tkfly.tkscrollutil import ScrollArea
Window = Tk()
Area = ScrollArea(Window)
List = Listbox(Area)
for Item in range(50):
List.insert(Item+1, Item+1)
Area.setwidget(List)
Area.pack(fill="both", expand="yes")
Window.mainloop()
```
#### ttkScrollArea
见上方。与`ScrollArea`不同的是,`ttkScrollArea`具有ttk组件的属性,并且`ScrollArea`和`ttkScrollArea`不能同时使用。
#### 示例
```python
from tkinter import Tk, Listbox
from tkfly.tkscrollutil import ttkScrollArea
Window = Tk()
Area = ttkScrollArea(Window)
List = Listbox(Area)
for Item in range(50):
List.insert(Item+1, Item+1)
Area.setwidget(List)
Area.pack(fill="both", expand="yes")
Window.mainloop()
```
#### ScrollSync
同步滚动条,当其中一个滚动时,另一个也会跟随着移动起来。
#### 方法
`setwidgets` 设置同步滚动的组件。需输入列表,如 [widget1, widget2] 。
`widgets` 获取同步滚动的组件。
#### 示例
```python
from tkinter import Tk, Listbox, Frame
from tkfly.tkscrollutil import ScrollArea, ScrollSync
Window = Tk()
Frame = Frame()
Area = ScrollArea(Frame, yscrollbarmode="static")
Sync = ScrollSync(Area)
Area.setwidget(Sync)
Area.pack(fill="y", side="right")
List1 = Listbox()
List1.pack(fill="both", side="left", expand="yes")
List2 = Listbox()
List2.pack(fill="both", side="right", expand="yes")
for Item in range(300):
List1.insert(Item, Item)
List2.insert(Item, Item)
Sync.setwidgets([List1, List2])
Frame.pack(fill="both", expand="yes")
Window.mainloop()
```
#### ttkScrollSync
见上方。与`ScrollSync`不同的是,`ttkScrollSync`具有ttk组件的属性,并且`ScrollSync`和`ttkScrollSync`不能同时使用。
#### 示例
```python
from tkinter import Tk, Listbox, Frame
from tkfly.tkscrollutil import ttkScrollArea, ttkScrollSync
Window = Tk()
Frame = Frame()
Area = ttkScrollArea(Frame, yscrollbarmode="static")
Sync = ttkScrollSync(Area)
Area.setwidget(Sync)
Area.pack(fill="y", side="right")
List1 = Listbox()
List1.pack(fill="both", side="left", expand="yes")
List2 = Listbox()
List2.pack(fill="both", side="right", expand="yes")
for Item in range(300):
List1.insert(Item, Item)
List2.insert(Item, Item)
Sync.setwidgets([List1, List2])
Frame.pack(fill="both", expand="yes")
Window.mainloop()
```
#### ttkScrolledNoteBook
scrollutil本身不提供ScrolledNoteBook,只有ttk能够提供。
```python
from tkinter import Tk, Frame
from tkfly.tkscrollutil import ttkScrolledNoteBook, addclosetab
Window = Tk()
NoteBook = ttkScrolledNoteBook(Window)
addclosetab("TNotebook")
NoteBook.add(Frame(NoteBook), text="Hello World")
NoteBook.pack(fill="both", expand="yes")
Window.mainloop()
```
## 简易树视图
[ttree](https://wiki.tcl-lang.org/page/A+Minimal+Tree+Widget)是我从[tcl](https://wiki.tcl-lang.org/)的官方论坛中找到的
我将它添加进了`tkfly` `FlyTTreeView`
### 快速示例
```python
import tkfly
import tkinter as tk
root = tk.Tk()
ttree = tkfly.FlyTTreeView()
ttree.test()
root.mainloop()
```
### 添加项
``
```python
ttree.add()
```
Raw data
{
"_id": null,
"home_page": "",
"name": "tkfly",
"maintainer": "",
"docs_url": null,
"requires_python": ">=3.7,<4.0",
"maintainer_email": "",
"keywords": "",
"author": "XiangQinxi",
"author_email": "1379773753@qq.com",
"download_url": "https://files.pythonhosted.org/packages/4b/03/9649580a36a87235469784852b6b2aed6afd8e351f9166f9898c20a8233c/tkfly-0.1.0b3.tar.gz",
"platform": null,
"description": "# tkfly\n\u57fa\u4e8e`tkinter` `tcl / tk` `pythonnet / winforms`\u6269\u5c55\u7684\u4e2d\u578b\u7ec4\u4ef6\u5e93\n\n`tkfly`\u6307`tkinter`\u63d2\u4e0a\u7fc5\u8180\u98de\u7fd4\uff0c\u610f\u4e3a\u501f\u52a9\u6269\u5c55\u7684\u529f\u80fd\u7ff1\u7fd4\u3002\n\n([tklib -\u5927\u5c0f\u7ea63.7MB](https://core.tcl-lang.org/tklib))\n\n([twapi -\u5927\u5c0f\u7ea62.0MB](https://twapi.magicsplat.com/))\n\n([blend2d -\u5927\u5c0f\u7ea67.6MB](https://wiki.tcl-lang.org/page/Blend2d))\n\n([telerik]())\n\n\u5e2e\u52a9\u4f60\u5f00\u53d1\u5927\u578b\u9ad8\u7ea7\u7684\u7a0b\u5e8f\n\n## \u6559\u7a0b\n\n### \u5f00\u59cb\n```bash\n# \u6682\u65f6\u5904\u4e8e\u9884\u89c8\u7248\npython -m pip install tkfly --pre\n```\n\n### \u5de5\u5177\u63d0\u793a\n`tkfly`\u901a\u8fc7`tkinter`\u8c03\u7528`tcl`\u5bfc\u5165`tklib`\u5b9e\u73b0\uff0c\u53ef\u4ee5\u5b9e\u73b0`tklib`\u5e93\u6240\u80fd\u5b9e\u73b0\u7684\u5404\u79cd\u529f\u80fd\u3002\n\u8ba9\u6211\u6765\u8fd0\u884c\u4e00\u4e2a\u6700\u7b80\u5355\u5de5\u5177\u63d0\u793a\u5427\uff01\n(\u57fa\u4e8e[tklib/tooltip](https://core.tcl-lang.org/tklib/doc/trunk/embedded/md/tklib/files/modules/tooltip/tooltip.md))\n```python\nfrom tkinter import Tk, ttk\nfrom tkfly import FlyToolTip\n\nroot = Tk()\n\ntooltip = FlyToolTip()\n\nbutton = ttk.Button()\ntooltip.tooltip(button, \"button1\")\nbutton.pack()\n\nroot.mainloop()\n```\n\n### \u8f93\u5165\u6846\u5c0f\u7ec4\u4ef6\u7684\u5386\u53f2\u8bb0\u5f55\u529f\u80fd\n\u8f93\u5165\u6846\u6ca1\u6709\u5386\u53f2\u8bb0\u5f55\u529f\u80fd\u4e00\u76f4\u662f\u4e2a\u9057\u61be\uff0c\u4f46\u662f\u53ef\u4ee5\u901a\u8fc7\u6269\u5c55\u7ec4\u4ef6\u5b9e\u73b0\n(\u57fa\u4e8e[tklib/history](https://core.tcl-lang.org/tklib/doc/trunk/embedded/md/tklib/files/modules/history/tklib_history.md))\n```python\nfrom tkinter import Tk, Entry, ttk\nfrom tkfly import FlyHistory\n\nroot = Tk()\n\nentry = ttk.Entry()\nentry.pack()\n\nhistory = FlyHistory(entry)\nhistory.add(114514)\nhistory.add(3.1415926)\nhistory.up()\n\nroot.mainloop()\n```\n\u4f60\u53ef\u4ee5\u901a\u8fc7\u6309\u952e\u76d8\u4e0a\u4e0b\u952e\u5207\u6362\u5386\u53f2\u8bb0\u5f55\u6587\u672c\u3002\n\n#### \u521d\u59cb\u5316\n```python\nhistory.init() \n```\n\u521d\u59cb\u5316\u65f6\u4f1a\u6709\u4e00\u4e2a\u5fc5\u9009\u53c2\u6570`widget`\u548c\u4e00\u4e2a\u53ef\u9009\u53c2\u6570`len`\uff0c`widget`\u662f\u76ee\u6807\u7ec4\u4ef6\uff0c`len`\u662f\u8bbe\u5b9a\u7684\u957f\u5ea6\u3002\n\n\u521d\u59cb\u5316\u5b8c\u6210\u540e\uff0c\u5c31\u53ef\u4ee5\u901a\u8fc7\u4e0a\u4e0b\u952e\u6765\u5207\u6362\u4e86\n\n#### \u6dfb\u52a0\u8bb0\u5f55\n```python\nhistory.add() \n```\n\u6dfb\u52a0\u9700\u8981\u4e00\u884c\u5b57\u4e32\u7b26\u53c2\u6570\uff0c\u6dfb\u52a0\u540e\u53ef\u4ee5\u7528\u4e0a\u4e0b\u952e\u5207\u6362\u627e\u5230\u8bb0\u5f55\n\n#### \u83b7\u53d6\u5386\u53f2\u8bb0\u5f55\u5217\u8868\n```python\nhistory.get() \n```\n\u4f60\u5c06\u4f1a\u5f97\u5230\u4e00\u4e2a`\u5143\u7ec4`\n\n### \u65e5\u671f\u8f93\u5165\u6846\n\u53ef\u4ee5\u901a\u8fc7\u4e0a\u4e0b\u952e\u8c03\u6574\u65e5\u671f\n```python\nfrom tkinter import Tk\nfrom tkfly import FlyDateField\n\nroot = Tk()\n\ndatefield = FlyDateField()\ndatefield.pack()\n\ndatefield2 = FlyDateField(format=\"%Y-%m-%d\")\ndatefield2.pack()\n\nroot.mainloop()\n```\n#### \u65e5\u671f\u683c\u5f0f\n\u53ef\u4ee5\u901a\u8fc7`format`\u53c2\u6570\u4fee\u6539\u683c\u5f0f\uff0c\u793a\u4f8b`\"%Y-%m-%d\"`\uff0c\u5176\u4e2d%Y\u662f\u5e74\u53f7\uff0c%m\u662f\u6708\u4efd\uff0c%d\u662f\u5929\u3002\n\n### 2D\u6e32\u67d3\nBlend2D\u662f\u4e00\u4e2a\u9ad8\u6027\u80fd\u76842D\u77e2\u91cf\u56fe\u5f62\u5f15\u64ce\uff0c\u901a\u8fc7\u8c03\u7528\u53ef\u4ee5\u751f\u6210\u56fe\u7247\u4e3alabel\u7ec4\u4ef6\u8bbe\u7f6e\u56fe\u7247\u663e\u793a\n\n\u4e0b\u9762\u6709\u4e2a\u793a\u4f8b\n```python\nfrom tkinter import *\nfrom tkfly import *\n\nroot = Tk()\nblend2D = Fly2D()\nsurface = blend2D.create_image_surface(\n size=(500, 500)\n)\n\nprint(\"Create ImageSurface\", surface.image_name)\n\nsurface.surface.fill(\n blend2D.create_circle((150, 150), 50),\n blend2D.get_color(\"lightblue\", alpha=0.5)\n)\n\nsurface.surface.fill(\n blend2D.create_circle((250, 250), 60),\n blend2D.get_color(\"lightblue\", alpha=1.0)\n)\n\nsurface.surface.fill(\n blend2D.create_circle((350, 350), 55),\n blend2D.get_color(\"lightblue\", alpha=0.75)\n)\n\nfrom tkfly.core import fly_local, fly_chdir\n\nwith fly_chdir(fly_local() + \"\\\\blend2d\"):\n fontface = blend2D.create_fontface(fontfile=\"HarmonyOS_Sans_Medium.ttf\")\n font = blend2D.create_font(fontface=fontface, fontsize=20)\n\nprint(\"Create FontFace\", fontface._name)\nprint(\"Create Font\", font._name)\n\nsurface.surface.fill(\n blend2D.create_text((225, 257), string=\"Fly2D\", font=font),\n blend2D.get_color(\"black\")\n)\n\nsurface.pack()\n\nsurface.surface.save(\"fly2d.png\")\n\nroot.mainloop()\n```\n\n### \u6269\u5c55\u7ec4\u4ef6\n#### Document\n\u8fd9\u662f\u7c7b\u4f3c`\u591a\u6587\u6863\u7a97\u53e3`\u7c7b\u7684\u7ec4\u4ef6\uff0c\u53ea\u662f\u6682\u65f6\u5e03\u5c40\u6ca1\u60f3\u5230\u597d\u7684\u65b9\u6848\uff0c\u4f1a\u7a7a\u4e0b\u5927\u90e8\u5206\u7684\u7a7a\u95f4\n```python\nfrom tkinter import *\nfrom tkinter import ttk\nfrom tkfly import *\n\nroot = Tk()\n\ndocument = FlyMkDocument()\n\nbutton = ttk.Button(document)\nbutton.pack(fill=\"both\", expand=\"yes\")\n\ndocument.config(title=\"\u8fd9\u662f\u591a\u6587\u6863\u7a97\u53e3\")\n\nroot.mainloop()\n```\n\n#### ToolBar\n\u5de5\u5177\u680f\u7ec4\u4ef6\n```python\nfrom tkinter import *\nfrom tkfly import *\n\nroot = Tk()\n\ntoolbar = FlyMkToolBar()\n\nbutton1 = toolbar.add(\n \"button\",\n command=lambda:\n print(f\"toolbutton is {toolbar.get(button1)}\")\n)\nbutton2 = toolbar.add(\"button\", command=lambda: toolbar.delete(button2))\n\n\ntoolbar.pack(fill=\"x\", side=\"top\")\n\nroot.mainloop()\n```\n\n\n## tkscrollutil\n\u5b9e\u9645\u4e0a\u8fd9\u5c31\u662f\u4f5c\u8005\u6211\u4ee5\u524d\u505a\u8fc7\u7684\u4e00\u4e2a\u9879\u76ee\u3002\n\n### ScrolllArea\n\u53ef\u4ee5\u5feb\u901f\u5730\u4e3a\u6c34\u5e73\u6eda\u52a8\u3001\u5782\u76f4\u6eda\u52a8\u7ec4\u4ef6\u8bbe\u7f6e\u6eda\u52a8\u6761\n\n#### \u5c5e\u6027\n`autohidescrollbars` \u8bbe\u7f6e\u7ec4\u4ef6\u662f\u5426\u81ea\u52a8\u9690\u85cf\u6eda\u52a8\u6761\u3002\u5e03\u5c14\u6570\u503c\u3002\u9ed8\u8ba4`False`\u3002\u4e5f\u5c31\u662f\u8bf4\uff0c\u5f53\u4f60\u628a\u9f20\u6807\u6307\u9488\u653e\u5230\u6eda\u52a8\u6761\u4e0a\u65f6\uff0c\u6eda\u52a8\u6761\u624d\u4f1a\u663e\u793a\u3002 \n\n`lockinterval` \u8bbe\u7f6e\u7ec4\u4ef6\u6eda\u52a8\u6761\u5730\u9501\u5b9a\u95f4\u9694\u3002\u6574\u6570\u6570\u503c\u3002\u9ed8\u8ba4`300`.\n\n`respectheader` \u4ec5\u5f53\u5c06\u5d4c\u5165\u5230\u7ec4\u4ef6\u5185\u5730`tablelist`\u7248\u672c\u4e3a6.5\u53ca\u4ee5\u4e0a\u7248\u672c\u65f6\u624d\u80fd\u4f7f\u7528\uff0c\u540e\u7eed\u7b49\u5f00\u53d1\u51fa`tablelist`\u7684\u6269\u5c55\u5e93\u65f6\u8865\u5145\n\n`respecttitlecolumns` \u4ec5\u5f53\u5c06\u5d4c\u5165\u5230\u7ec4\u4ef6\u5185\u5730`tablelist`\u7248\u672c\u4e3a6.5\u53ca\u4ee5\u4e0a\u7248\u672c\u65f6\u624d\u80fd\u4f7f\u7528\uff0c\u540e\u7eed\u7b49\u5f00\u53d1\u51fa`tablelist`\u7684\u6269\u5c55\u5e93\u65f6\u8865\u5145\n\n`xscrollbarmode` \u8bbe\u7f6e\u6c34\u5e73\u6eda\u52a8\u6761\u7684\u6a21\u5f0f\u3002\u53ef\u9009\u503c\u4e3a`static` `dynamic` `none`\u3002\u9ed8\u8ba4`none`\u3002`static`\u4e3a\u5e38\u9a7b\u6eda\u52a8\u6761\uff1b`dynamic`\u4e3a\u81ea\u52a8\u6eda\u52a8\u6761\uff1b`none`\u4e3a\u6ca1\u6709\u6eda\u52a8\u6761\n\n`yscrollbarmode` \u8bbe\u7f6e\u5782\u76f4\u6eda\u52a8\u6761\u7684\u6a21\u5f0f\u3002\u53ef\u9009\u503c\u4e3a`static` `dynamic` `none`\u3002\u9ed8\u8ba4`static`\u3002`static`\u4e3a\u5e38\u9a7b\u6eda\u52a8\u6761\uff1b`dynamic`\u4e3a\u81ea\u52a8\u6eda\u52a8\u6761\uff1b`none`\u4e3a\u6ca1\u6709\u6eda\u52a8\u6761\n\n#### \u65b9\u6cd5\n`setwidget` \u8bbe\u7f6e\u5177\u6709\u6eda\u52a8\u6761\u5c5e\u6027\u7684\u7ec4\u4ef6\uff0c\u4f7f\u7ec4\u4ef6\u5feb\u901f\u8bbe\u7f6e\u6eda\u52a8\u6761\u3002\n\n#### \u793a\u4f8b\n```python\nfrom tkinter import Tk, Listbox\nfrom tkfly.tkscrollutil import ScrollArea\n\nWindow = Tk()\n\nArea = ScrollArea(Window)\nList = Listbox(Area)\nfor Item in range(50):\n List.insert(Item+1, Item+1)\nArea.setwidget(List)\nArea.pack(fill=\"both\", expand=\"yes\")\n\nWindow.mainloop()\n```\n\n#### ttkScrollArea\n\u89c1\u4e0a\u65b9\u3002\u4e0e`ScrollArea`\u4e0d\u540c\u7684\u662f\uff0c`ttkScrollArea`\u5177\u6709ttk\u7ec4\u4ef6\u7684\u5c5e\u6027\uff0c\u5e76\u4e14`ScrollArea`\u548c`ttkScrollArea`\u4e0d\u80fd\u540c\u65f6\u4f7f\u7528\u3002\n\n#### \u793a\u4f8b\n```python\nfrom tkinter import Tk, Listbox\nfrom tkfly.tkscrollutil import ttkScrollArea\n\nWindow = Tk()\n\nArea = ttkScrollArea(Window)\nList = Listbox(Area)\nfor Item in range(50):\n List.insert(Item+1, Item+1)\nArea.setwidget(List)\nArea.pack(fill=\"both\", expand=\"yes\")\n\nWindow.mainloop()\n```\n\n#### ScrollSync\n\u540c\u6b65\u6eda\u52a8\u6761\uff0c\u5f53\u5176\u4e2d\u4e00\u4e2a\u6eda\u52a8\u65f6\uff0c\u53e6\u4e00\u4e2a\u4e5f\u4f1a\u8ddf\u968f\u7740\u79fb\u52a8\u8d77\u6765\u3002\n\n#### \u65b9\u6cd5\n`setwidgets` \u8bbe\u7f6e\u540c\u6b65\u6eda\u52a8\u7684\u7ec4\u4ef6\u3002\u9700\u8f93\u5165\u5217\u8868\uff0c\u5982 [widget1, widget2] \u3002\n\n`widgets` \u83b7\u53d6\u540c\u6b65\u6eda\u52a8\u7684\u7ec4\u4ef6\u3002\n\n#### \u793a\u4f8b\n```python\nfrom tkinter import Tk, Listbox, Frame\nfrom tkfly.tkscrollutil import ScrollArea, ScrollSync\nWindow = Tk()\n\nFrame = Frame()\n\nArea = ScrollArea(Frame, yscrollbarmode=\"static\")\nSync = ScrollSync(Area)\nArea.setwidget(Sync)\n\nArea.pack(fill=\"y\", side=\"right\")\n\nList1 = Listbox()\nList1.pack(fill=\"both\", side=\"left\", expand=\"yes\")\nList2 = Listbox()\nList2.pack(fill=\"both\", side=\"right\", expand=\"yes\")\n\nfor Item in range(300):\n List1.insert(Item, Item)\n List2.insert(Item, Item)\n\nSync.setwidgets([List1, List2])\n\nFrame.pack(fill=\"both\", expand=\"yes\")\n\nWindow.mainloop()\n```\n\n#### ttkScrollSync\n\u89c1\u4e0a\u65b9\u3002\u4e0e`ScrollSync`\u4e0d\u540c\u7684\u662f\uff0c`ttkScrollSync`\u5177\u6709ttk\u7ec4\u4ef6\u7684\u5c5e\u6027\uff0c\u5e76\u4e14`ScrollSync`\u548c`ttkScrollSync`\u4e0d\u80fd\u540c\u65f6\u4f7f\u7528\u3002\n\n#### \u793a\u4f8b\n```python\nfrom tkinter import Tk, Listbox, Frame\nfrom tkfly.tkscrollutil import ttkScrollArea, ttkScrollSync\nWindow = Tk()\n\nFrame = Frame()\n\nArea = ttkScrollArea(Frame, yscrollbarmode=\"static\")\nSync = ttkScrollSync(Area)\nArea.setwidget(Sync)\n\nArea.pack(fill=\"y\", side=\"right\")\n\nList1 = Listbox()\nList1.pack(fill=\"both\", side=\"left\", expand=\"yes\")\nList2 = Listbox()\nList2.pack(fill=\"both\", side=\"right\", expand=\"yes\")\n\nfor Item in range(300):\n List1.insert(Item, Item)\n List2.insert(Item, Item)\n\nSync.setwidgets([List1, List2])\n\nFrame.pack(fill=\"both\", expand=\"yes\")\n\nWindow.mainloop()\n```\n\n#### ttkScrolledNoteBook\nscrollutil\u672c\u8eab\u4e0d\u63d0\u4f9bScrolledNoteBook\uff0c\u53ea\u6709ttk\u80fd\u591f\u63d0\u4f9b\u3002\n```python\nfrom tkinter import Tk, Frame\nfrom tkfly.tkscrollutil import ttkScrolledNoteBook, addclosetab\nWindow = Tk()\n\nNoteBook = ttkScrolledNoteBook(Window)\n\naddclosetab(\"TNotebook\")\n\nNoteBook.add(Frame(NoteBook), text=\"Hello World\")\nNoteBook.pack(fill=\"both\", expand=\"yes\")\n\nWindow.mainloop()\n```\n\n## \u7b80\u6613\u6811\u89c6\u56fe\n[ttree](https://wiki.tcl-lang.org/page/A+Minimal+Tree+Widget)\u662f\u6211\u4ece[tcl](https://wiki.tcl-lang.org/)\u7684\u5b98\u65b9\u8bba\u575b\u4e2d\u627e\u5230\u7684\n\n\u6211\u5c06\u5b83\u6dfb\u52a0\u8fdb\u4e86`tkfly` `FlyTTreeView`\n\n### \u5feb\u901f\u793a\u4f8b\n```python\nimport tkfly\nimport tkinter as tk\nroot = tk.Tk()\nttree = tkfly.FlyTTreeView()\nttree.test()\nroot.mainloop()\n```\n\n### \u6dfb\u52a0\u9879\n``\n```python\nttree.add()\n```",
"bugtrack_url": null,
"license": "",
"summary": "",
"version": "0.1.0b3",
"project_urls": null,
"split_keywords": [],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "503663f868279141560f3bbe3204334a923116944b4ee332bafbf93b4db315ae",
"md5": "2df09e85fb48a97ec5859d68e1f73b69",
"sha256": "6482cc64bc1f5cfb5078b2133117774c9260b8ad4671db5cce97d8142f9678e0"
},
"downloads": -1,
"filename": "tkfly-0.1.0b3-py3-none-any.whl",
"has_sig": false,
"md5_digest": "2df09e85fb48a97ec5859d68e1f73b69",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.7,<4.0",
"size": 21624517,
"upload_time": "2023-05-28T09:55:48",
"upload_time_iso_8601": "2023-05-28T09:55:48.056908Z",
"url": "https://files.pythonhosted.org/packages/50/36/63f868279141560f3bbe3204334a923116944b4ee332bafbf93b4db315ae/tkfly-0.1.0b3-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "4b039649580a36a87235469784852b6b2aed6afd8e351f9166f9898c20a8233c",
"md5": "06b493a2cd629e2f322ff75ce1b48037",
"sha256": "438ac5d98632b5d0e1c5e60ae82ce76b99c38a4e35fc89a3f0156fa6c038f1ab"
},
"downloads": -1,
"filename": "tkfly-0.1.0b3.tar.gz",
"has_sig": false,
"md5_digest": "06b493a2cd629e2f322ff75ce1b48037",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.7,<4.0",
"size": 27649166,
"upload_time": "2023-05-28T09:57:26",
"upload_time_iso_8601": "2023-05-28T09:57:26.298223Z",
"url": "https://files.pythonhosted.org/packages/4b/03/9649580a36a87235469784852b6b2aed6afd8e351f9166f9898c20a8233c/tkfly-0.1.0b3.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2023-05-28 09:57:26",
"github": false,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"lcname": "tkfly"
}