写这篇文章时,正式版的TinUI框架已经开源一年多(一点点)了,这里暂且写一下TinUI的发展历程,让tkinter爱好者了解一些TinUI的发展路线、主旨,同时更好地运用TinUI这一个工具。
这里就按时间顺序来写了。
好吧,TinUI对我来说就像是课余时间的一个玩具,写写得了。
进入正题。
tkinter原生控件的样式属实有点……,当然,ttk的样式虽然是系统样式,但是细心的就会发现,ttk的哪里是使用系统控件,分明是在原生控件的基础上贴图。就拿按钮来说,在windows11上使用ttk,按钮是圆角,但是仔细看,边框是方形的。而且,点击按钮后,按钮就会出现一个虚线方框。其它windows系统上亦如此。
所以贴图类控件的开发着实麻烦,而且性能会大下降。
那用画布会如何?
当时我在写TinUI的时候还不知道隔壁CustomTkinter(CTK),那是由专业人员带头发起的,使用画布重绘现代样式的tkinter控件。后来发现同行,原来CTK是一个“重型”框架,与TinUI有本质上的区别。主要内容详见TinUI和customtkinter的区别_Smart-Space的博客-程序员宅基地。
接着,就是尽可能使用一个画布,绘制出具有现代样式的控件元素,使其成为一个小的轻型框架。虽然有一些输入类控件(Canvas、Text、Entry)无法绘制,但是这仍然无法阻挡TinUI的元素样式渲染,以及超越tkinter原生控件的速度。
顺便提一下,TinUI的原型2019年就有了,那个时候是想写一个富文本排版器,但是觉得用文本框写更方便,所以就没有管它,这也是为什么TinUI有标题和段落控件。后来看不顺眼tkinter原生(毕竟ttk样式还要写style,很麻烦),就重启了这个小项目,命名为TinUI。
class TinUI(Canvas):
def __init__(self,master,...):
#...
实际上,在2019年末,TinUI的文件主体已经创建。
只不过当时不叫这个名称,而是“TinCanvas”。顾名思义,当时这仍然是一个画布控件,用来作为TinEngine内部的画布,封装更加简单的画布方法。后来发现,没必要,或者说没有什么实现意义。就好比我现在几乎不管TinEngine了。
在2020年的时候,曾经停止了对于TinCanvas的开发。
但是,在2021年初,就产生了上文谈到的建立一个现代化元素控件框架。接着,便将相关代码从TinEngine中脱离出来,建立了TinUI.py。
2021年中考完后,便开始了对TinUI的构建。
这是最早的TinUI正式版本,于2021年7月首次发布在PYPI。
很简陋。里面的输入框相当于原封不动地添加标准输入框,按钮还是win10风格,复选框真的是啥也不是,单选框又“新颖独特”。这就是TinUI-1.0.0,pypi上的最早版本。
后来又加入了超链接、等待框等元素控件,这些是完全由画布绘制出来的。
可以看到这样的控件风格有一点点像上世纪的Windows风格。若果说刚开始的TinUI1是从一个废弃的项目转向新的目标,那么,很快,TinUI1的最后几个版本也将进入一个快速的过渡阶段。
不过最开始作为文本排版器的构想,虽然废弃了,但是一些历史遗留问题还是有的,比如元素组件添加方法统一以add_
开头,仁者见仁智者见智。
tinui.add_title(...)
tinui.add_button(...)
随着表格元素(TinUI比较复杂地绘制的元素组件之一),以及使用新样式的输入框,TinUI已经完成了基础交互控件的创建。2021年10月,TinUI最后一个版本发布,接下来就是一个迅速完善的阶段了。
新的阶段,也是一个快速变化的阶段。
作为TinUI首个额外窗口元素控件,TinUI菜单补全了所有的窗口基本控件(虽然菜单比较简陋,但是后续会改进),也就是说,至此,TinUI提供的元素组件已经够用了,TinUI可以作为窗口唯一控件。其它还没有加入的控件,可以通过画布代码加入,以TreeView为例:
tv=Treeview(tinui)
tinui.create_window(pos,window=tv,width=300,height=300)
treeview在TinUI4中已提供。
接下来,就是2022年年初的TinUI更新,这次更新分离出来了TinUI和BasicTinUI两个类,开发重心也就转到了BasicTinUI,而TinUI则是在其基础上进行封装——可视滚动范围刷新、滚动条支持。而BasicTinUI则可以作为一个单独的TinUI元素渲染框架组件使用。
tu=TinUI(root)
#...
btu=BasicTinUI(root)
这也代表TinUI2的主要目标已经达成——一个稳定的元素控件渲染框架。不过,后面还是继续添加各种各样的控件,并且优化控件样式。比如输入框、复选框、按钮等等。
这是TinUI2的输入框,仿winui2。此后TinUI3的输入框则是仿winui3样式的圆角输入框。
TinUI2的最后一个重要使命,就是在过渡到TinUI3前,完成使用xml编写元素控件布局的功能,并且使其稳定。虽然是最后一个使命,但是前前后后囊括了很多个TinUI2的版本,从TinUI-2.6.0-开始到TinUI-2.20.0-。这里面包括很多更新:
xml结构设计
xml与Python内部的交互关系
Python代码编写规范(IDO)
xml的嵌套逻辑设计,本来的TinUIXml是没有打算嵌套的
……
tux=TinUIXml(tinui)
tux.loadxml(xml)
TinUI2的最后一个版本在2022年3月发布,完成了基本控件的支持和元素组件的体系化。
2022年4月,迎来了首个TinUI3版本,TinUIXml终于稳定了。
同时,TinUI使用了新的开源协议:GPL-v3。
TinUI3主要是元素控件样式优化,以及添加拓展控件,也就是tkinter中不存在的控件。
元素优化主要以WinUI3作参考。
以及动画设计,比如圆形等待框。
拓展空间则包括:多功能标签栏视图、支点标题、等待框、翻页视图等等。
此外,还有一个底层变化——FunctionList结构。
随着一些拓展元素组件的添加与完善,有一些组件必须要开放足够多的方法进行操作。然而,从TinUI2中继承的家底中,一直在使用列表结构作为方法总和的返回值,使用方法的写法如funcs[1]()
,看起来很不顺眼。所以后来一直都想使用如funcs.function()
的方法,加上标签栏视图(notebook)的加入,这个要求就变成了急需。所以,这也就使得标签栏视图可以如以下方法调用:
nt.addpage(title='title',flag='flag1')
nt.showpage(flag='flag1')
#nt.deletepage('flag1')
nt.getuis('flag1')
nt.gettitles('flag1')
nt.getvdic()
nt.gettbdict()
虽然TinUI3是一个很稳定的阶段,但是因为一些原因,TinUI3会有一段暂停维护阶段,见:TinUI暂停维护。
应该是TinUI4的时期会暂停维护。
以后会不会接续呢?我也不知道,毕竟我不是走这一条路的,或许有时间了会回过头来看一看。
关于申请为TinUI合作者,见信息公告。
终于,在2022年10月22日,送走了TinUI3最后一个版本-3.34.0-。本来以为TinUI3是一个长期稳定的版本,但是随着treeview元素在TinUI4中提上开发日程,TinUI3也结束属于它的一个稳定发展时期了。
NEXT……
4.0将等待treeview控件的加入……
TinUI4在2023年1月1日发布。
首次更新就包括了treeview和image控件的加入,所有基本控件已经创建完毕。此外,TinUI4的一个最大特点就是随包发布了 TinUI帮助手册 实用程序,为编写者提供了快捷的文档查询、功能更新说明以及拓展开发注意事项说明。
TinUI基本就一直保持在TinUI4阶段了,毕竟我将来几乎没时间管它了。
随后也更新了其它控件的样式。
看到这,相信读者已经了解了TinUI,是否使用、如何使用,也就看自己了。
【笔记】
文章浏览阅读1.6k次。安装配置gi、安装数据库软件、dbca建库见下:http://blog.csdn.net/kadwf123/article/details/784299611、检查集群节点及状态:[root@rac2 ~]# olsnodes -srac1 Activerac2 Activerac3 Activerac4 Active[root@rac2 ~]_12c查看crs状态
文章浏览阅读1.3w次,点赞45次,收藏99次。我个人用的是anaconda3的一个python集成环境,自带jupyter notebook,但在我打开jupyter notebook界面后,却找不到对应的虚拟环境,原来是jupyter notebook只是通用于下载anaconda时自带的环境,其他环境要想使用必须手动下载一些库:1.首先进入到自己创建的虚拟环境(pytorch是虚拟环境的名字)activate pytorch2.在该环境下下载这个库conda install ipykernelconda install nb__jupyter没有pytorch环境
文章浏览阅读5.2k次,点赞19次,收藏28次。选择scoop纯属意外,也是无奈,因为电脑用户被锁了管理员权限,所有exe安装程序都无法安装,只可以用绿色软件,最后被我发现scoop,省去了到处下载XXX绿色版的烦恼,当然scoop里需要管理员权限的软件也跟我无缘了(譬如everything)。推荐添加dorado这个bucket镜像,里面很多中文软件,但是部分国外的软件下载地址在github,可能无法下载。以上两个是官方bucket的国内镜像,所有软件建议优先从这里下载。上面可以看到很多bucket以及软件数。如果官网登陆不了可以试一下以下方式。_scoop-cn
文章浏览阅读4.5k次,点赞2次,收藏3次。首先要有一个color-picker组件 <el-color-picker v-model="headcolor"></el-color-picker>在data里面data() { return {headcolor: ’ #278add ’ //这里可以选择一个默认的颜色} }然后在你想要改变颜色的地方用v-bind绑定就好了,例如:这里的:sty..._vue el-color-picker
文章浏览阅读640次。基于芯片日益增长的问题,所以内核开发者们引入了新的方法,就是在内核中只保留函数,而数据则不包含,由用户(应用程序员)自己把数据按照规定的格式编写,并放在约定的地方,为了不占用过多的内存,还要求数据以根精简的方式编写。boot启动时,传参给内核,告诉内核设备树文件和kernel的位置,内核启动时根据地址去找到设备树文件,再利用专用的编译器去反编译dtb文件,将dtb还原成数据结构,以供驱动的函数去调用。firmware是三星的一个固件的设备信息,因为找不到固件,所以内核启动不成功。_exynos 4412 刷机
文章浏览阅读2w次,点赞24次,收藏42次。Linux系统配置jdkLinux学习教程,Linux入门教程(超详细)_linux配置jdk
文章浏览阅读3.3k次,点赞5次,收藏19次。xlabel('\delta');ylabel('AUC');具体符号的对照表参照下图:_matlab微米怎么输入
文章浏览阅读119次。顺序读写指的是按照文件中数据的顺序进行读取或写入。对于文本文件,可以使用fgets、fputs、fscanf、fprintf等函数进行顺序读写。在C语言中,对文件的操作通常涉及文件的打开、读写以及关闭。文件的打开使用fopen函数,而关闭则使用fclose函数。在C语言中,可以使用fread和fwrite函数进行二进制读写。 Biaoge 于2024-03-09 23:51发布 阅读量:7 ️文章类型:【 C语言程序设计 】在C语言中,用于打开文件的函数是____,用于关闭文件的函数是____。
文章浏览阅读3.4k次,点赞2次,收藏13次。跟随鼠标移动的粒子以grid(SOP)为partical(SOP)的资源模板,调整后连接【Geo组合+point spirit(MAT)】,在连接【feedback组合】适当调整。影响粒子动态的节点【metaball(SOP)+force(SOP)】添加mouse in(CHOP)鼠标位置到metaball的坐标,实现鼠标影响。..._touchdesigner怎么让一个模型跟着鼠标移动
文章浏览阅读178次。项目运行环境配置:Jdk1.8 + Tomcat7.0 + Mysql + HBuilderX(Webstorm也行)+ Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。项目技术:Springboot + mybatis + Maven +mysql5.7或8.0+html+css+js等等组成,B/S模式 + Maven管理等等。环境需要1.运行环境:最好是java jdk 1.8,我们在这个平台上运行的。其他版本理论上也可以。_基于java技术的停车场管理系统实现与设计
文章浏览阅读3.5k次。前言对于MediaPlayer播放器的源码分析内容相对来说比较多,会从Java-&amp;gt;Jni-&amp;gt;C/C++慢慢分析,后面会慢慢更新。另外,博客只作为自己学习记录的一种方式,对于其他的不过多的评论。MediaPlayerDemopublic class MainActivity extends AppCompatActivity implements SurfaceHolder.Cal..._android多媒体播放源码分析 时序图
文章浏览阅读2.4k次,点赞41次,收藏13次。java 数据结构与算法 ——快速排序法_快速排序法