tkinter富文本tkr(2)格式生成

引言

前一篇文章讲述了TKR格式文件的含义。tkr文件是通过tkinter.Text自身的富文本描述,经过解析和删改后得出来的文本信息,能够保留Text文本框中一定的富文本内容。

那么,本篇文章将讲述如何从tkinter.Text生成tkr文件。


TKR格式

复习一遍,tkr的格式如下:

=tagon=
tagname1 {'background':'','bd':'0','cursor':'hand2',...}
tagname2 {...}
...
=tagoff=

=texton=
[('tagon','tagname1','1.0'),('text','words use tagname1','1.0'),('tagoff','tagname1','1.17'),...]
=textoff=

如果忘记了其中每个模块的含义,可以自行查看前一篇文章。


text部分

相比tag部分,text部分更好解决。

含义

text部分是tkr文件的主体部分,其中对Text该如何渲染富文本进行了详细的描述。

该部分是一个列表,也只能有一行列表,列表中的每个元素都是元组,其中有三个子元素:

(type,content,insert)

type是该内容的种类,有text,tag,window,image,mark等等。其中,因为tag是涵盖一定范围的,所以存在tagon,tagoff等标记。

content是该元素内容。

insert就是在文本框中的位置。

生成

Text本身自带了描述自身富文本的函数:dump函数。

为了方便演示,我使用Tin作为展示和转化平台。(下载Tin

从TinReader按<Alt-c>打开检测窗口,输入:

<title>TITLE;;orange
<sp>2
<main>这是位于中间的main;center;red
<sp>
<main>这是不加修饰的main
<sp>4

<tkinter>
insert('end',str(self.dump(1.0,'end')))
</tkinter>

可以看到:
在这里插入图片描述

其中,下方存在的列表就是我们需要的text部分。但是因为目前tkr规范还处于版本1,所以目前我们只能够也只支持渲染纯文本。那么我们将<tkinter>标签的内容改为:insert(‘end’,str(self.dump(1.0,‘end’,text=True,tag=True)))。

获得以下列表:

[('tagon', 'title_centerorange0宋体', '1.0'), ('text', 'TITLE\n', '1.0'), ('tagoff', 'title_centerorange0宋体', '2.0'), ('text', '\n', '2.0'), ('text', '\n', '3.0'), ('tagon', 'msg_centerred', '4.0'), ('text', '这是位于中间的main\n', '4.0'), ('tagoff', 'msg_centerred', '5.0'), ('text', '\n', '5.0'), ('tagon', 'msg_#626D79-white', '6.0'), ('text', '    这是不加修饰的main\n', '6.0'), ('tagoff', 'msg_#626D79-white', '7.0'), ('text', '\n', '7.0'), ('text', '\n', '8.0'), ('text', '\n', '9.0'), ('text', '\n', '10.0'), ('text', '\n', '11.0')]

tag部分

tag是tkinter.Text富文本的样式,类似于HTML中的css。

含义

tag部分的每一行,实际上是由一个tag的名称、一个空格、一个字典构成的。

tag名称对应了text部分描述渲染中的tag名称。

字典就是这个样式的具体设置。

生成

在Text中,使用tag_config(tagname)可以获取该tag的样式字典。

在Tin检测窗口输入:

<title>TITLE;;orange
<sp>2
<main>这是位于中间的main;center;red
<sp>
<main>这是不加修饰的main
<sp>4

<tkinter>
insert('end',str(self.tag_config('title_centerorange0宋体')))
</tkinter>

可以看到:

在这里插入图片描述

但是,我们发现这并不是一个我们希望看到的字典,因为每个值都是一个元组而不是字符串。我们同时也发现,每个元组中,只有第五个子元素是我们需要得到的值。因此,我们需要进行以下操作,新生成一个符合我们要求的字典:

def get_tag_dict(tagname):
    new_dict={}
    old_dict=tkrt.tag_config(tagname)
    for item in old_dict.keys():
        new_dict[item]=old_dict[item][4]
    return new_dict

最终得到类似如下的字典:

title_center#8CFEFA-grey0华文彩云 {'background': 'grey', 'bgstipple': '', 'borderwidth': '', 'elide': '', 'fgstipple': '', 'font': '华文彩云 23', 'foreground': '#8CFEFA', 'justify': 'center', 'lmargin1': '', 'lmargin2': '', 'lmargincolor': '', 'offset': '', 'overstrike': '', 'overstrikefg': '', 'relief': 'groove', 'rmargin': '', 'rmargincolor': '', 'selectbackground': '', 'selectforeground': '', 'spacing1': '', 'spacing2': '', 'spacing3': '', 'tabs': '', 'tabstyle': '', 'underline': '1', 'underlinefg': '', 'wrap': ''}

完整代码

通过以上的探究,我们得出了生成tkr文件内容的完整代码:

#解析导出
def text2tkr(tkrt:tk.Text,fname):
    '''
    tkrt::tkinter文本框
    fname::生成文件的位置和文件全称
    '''
    def get_tag_dict(tagname):
        new_dict={}
        old_dict=tkrt.tag_config(tagname)
        for item in old_dict.keys():
            new_dict[item]=old_dict[item][4]
        return new_dict
    tkr_ver=1
    #开始格式化数据
    acon=tkrt.dump(1.0,'end',text=True,tag=True)
    tag_on='\n=tagon=\n'
    tag_name_list=[]
    #第一部分
    for i in acon:
        tag_name=i[1]
        if i[0]=='tagon' and tag_name not in tag_name_list:
            tag_name_list.append(tag_name)
            tag_dict=get_tag_dict(tag_name)
            tag_on+=tag_name+' '+str(tag_dict)+'\n'
    tag_on+='\n=tagoff=\n'
    #第二部分完成
    text_on='\n=texton=\n'+str(acon)+'\n=textoff=\n'
    with open(fname,mode='w',encoding='utf-8') as tkrf:
        tkrf.write(tag_on)
        tkrf.write(text_on)
    return True

很简单吧。


结语

TKR在github地址

目前,我们已经完成了tkr文件的格式生成——当然,以后会丰富允许的文本内容——接下来,我们会将描述文件重新渲染的Text中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值