Package: tkfly
tkfly基于tkintertcl / tkpythonnet / winforms扩展的中型组件库tkfly指tkinter插上翅膀飞翔，意为借助扩展的功能翱翔。(tklib -大小约3.7MB)(twapi -大小约2.0MB)(blend2d -大小约7.6MB)(telerik)帮助你开发大型高级的程序教程开始# 暂时处于预览版python-mpipinstalltkfly--pre工具提示tkfly通过tkinter调用tcl导入tklib实现，可以实现tklib库所能实现的各种功能。
让我来运行一个最简单工具提示吧！
(基于tklib/tooltip)fromtkinterimportTk,ttkfromtkflyimportFlyToolTiproot=Tk()tooltip=FlyToolTip()button=ttk.Button()tooltip.tooltip(button,"button1")button.pack()root.mainloop()输入框小组件的历史记录功能输入框没有历史记录功能一直是个遗憾，但是可以通过扩展组件实现
(基于tklib/history)fromtkinterimportTk,Entry,ttkfromtkflyimportFlyHistoryroot=Tk()entry=ttk.Entry()entry.pack()history=FlyHistory(entry)history.add(114514)history.add(3.1415926)history.up()root.mainloop()你可以通过按键盘上下键切换历史记录文本。初始化history.init()初始化时会有一个必选参数widget和一个可选参数len，widget是目标组件，len是设定的长度。初始化完成后，就可以通过上下键来切换了添加记录history.add()添加需要一行字串符参数，添加后可以用上下键切换找到记录获取历史记录列表history.get()你将会得到一个元组日期输入框可以通过上下键调整日期fromtkinterimportTkfromtkflyimportFlyDateFieldroot=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组件设置图片显示下面有个示例fromtkinterimport*fromtkflyimport*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))fromtkfly.coreimportfly_local,fly_chdirwithfly_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这是类似多文档窗口类的组件，只是暂时布局没想到好的方案，会空下大部分的空间fromtkinterimport*fromtkinterimportttkfromtkflyimport*root=Tk()document=FlyMkDocument()button=ttk.Button(document)button.pack(fill="both",expand="yes")document.config(title="这是多文档窗口")root.mainloop()ToolBar工具栏组件fromtkinterimport*fromtkflyimport*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设置水平滚动条的模式。可选值为staticdynamicnone。默认none。static为常驻滚动条；dynamic为自动滚动条；none为没有滚动条yscrollbarmode设置垂直滚动条的模式。可选值为staticdynamicnone。默认static。static为常驻滚动条；dynamic为自动滚动条；none为没有滚动条方法setwidget设置具有滚动条属性的组件，使组件快速设置滚动条。示例fromtkinterimportTk,Listboxfromtkfly.tkscrollutilimportScrollAreaWindow=Tk()Area=ScrollArea(Window)List=Listbox(Area)forIteminrange(50):List.insert(Item+1,Item+1)Area.setwidget(List)Area.pack(fill="both",expand="yes")Window.mainloop()ttkScrollArea见上方。与ScrollArea不同的是，ttkScrollArea具有ttk组件的属性，并且ScrollArea和ttkScrollArea不能同时使用。示例fromtkinterimportTk,Listboxfromtkfly.tkscrollutilimportttkScrollAreaWindow=Tk()Area=ttkScrollArea(Window)List=Listbox(Area)forIteminrange(50):List.insert(Item+1,Item+1)Area.setwidget(List)Area.pack(fill="both",expand="yes")Window.mainloop()ScrollSync同步滚动条，当其中一个滚动时，另一个也会跟随着移动起来。方法setwidgets设置同步滚动的组件。需输入列表，如 [widget1, widget2] 。widgets获取同步滚动的组件。示例fromtkinterimportTk,Listbox,Framefromtkfly.tkscrollutilimportScrollArea,ScrollSyncWindow=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")forIteminrange(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不能同时使用。示例fromtkinterimportTk,Listbox,Framefromtkfly.tkscrollutilimportttkScrollArea,ttkScrollSyncWindow=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")forIteminrange(300):List1.insert(Item,Item)List2.insert(Item,Item)Sync.setwidgets([List1,List2])Frame.pack(fill="both",expand="yes")Window.mainloop()ttkScrolledNoteBookscrollutil本身不提供ScrolledNoteBook，只有ttk能够提供。fromtkinterimportTk,Framefromtkfly.tkscrollutilimportttkScrolledNoteBook,addclosetabWindow=Tk()NoteBook=ttkScrolledNoteBook(Window)addclosetab("TNotebook")NoteBook.add(Frame(NoteBook),text="Hello World")NoteBook.pack(fill="both",expand="yes")Window.mainloop()简易树视图ttree是我从tcl的官方论坛中找到的我将它添加进了tkflyFlyTTreeView快速示例importtkflyimporttkinterastkroot=tk.Tk()ttree=tkfly.FlyTTreeView()ttree.test()root.mainloop()添加项``ttree.add()