python.tkinter设计标记语言(渲染2-渲染器)

news2024/12/28 4:19:58

@TOC

前言

本文仅作为笔记记录。

在前文中,我们通过标记意义解释生成了带有明确渲染要求的参数组,以<title>为例,我们获取了title, level两个明确的渲染标记,这一部分由Tin标记解释器完成,不需要编写者花费过多心思。

上一篇文章的代码片段中,出现了self.__render_title(...), self.__render_paragraph(...)两个方法,这就是TinText的渲染器部分。这篇文章将以这两个标签为例,解释新一版TinText的渲染器实现。

标题


    def __render_title(self,title,level):
        #标题
        self.insert('end',title,('title',f'title{level}'))
        self.insert('end','\n')

这就是逐个解释再即时渲染的好处,渲染器部分非常简介,因为所有渲染参数已经由解释器部分处理完毕。

在文本框的tag设定中,使用了f'title{level}'的样式命名,这是因为(见前文)我们已经将六种层级的标题样式在TinText初始化时就确定好了。

段落

语法

新一版Tin的标记段落一上来就是可多样化的。
在这里插入图片描述

旧版Tin标记语言的段落标记经过两个大版本更新才支持段落内部样式化,而且标记比较混乱,一个文本块最多使用一种样式。

先看语法定义:

<p>段落演示;
|*粗体
|/斜体
|-删除线
|_下划线
|![链接](https://.../)
|*-/这是粗体和删除线、斜体的组合文本块
| 第一个空格没有意义,这就是普通文本块
|  这才会显示一个空格
|*_![粗体下划线链接](https://.../)|

当然,这些都可以挤在同一行,而且我觉得那样更好,不必担心混乱,因为在新版TinText实现应用中,TinWriter是可以明显分隔“|”的。

若文本块中含有删除线,就需要在同一行(段落)中书写,这是强制设计的。否则会被当作注释(|-)

在这里插入图片描述

样式拼接渲染

<p>标记的渲染中,新一版TinText采用样式拼接的方法,使得不同样式可以作用于同一个文本块,这是旧版Tin标记语言做不到的。

    def __render_paragraph(self,text,newline=False):
        #普通文本,默认不自动换行
        if text=='':
            pass
        elif text[0]==' ':
            self.insert('end',text[1:],'paragraph')
        elif text[0] not in self.paragraph_mark:
            self.insert('end',text,'paragraph')
        else:
            head_mark=text[:5]
            head_num=0
            p_tags=[]
            if '*' in head_mark:
                head_num+=1
                p_tags.append('bold')
            if '/' in head_mark:
                head_num+=1
                p_tags.append('italic')
            if '_' in head_mark:
                head_num+=1
                p_tags.append('underline')
            if '-' in head_mark:
                head_num+=1
                p_tags.append('overstrike')
            if '!' in head_mark:
                # head_num+=1
                result=self.paragraph_link_re.match(text)
                if result==None:
                    #如果使用了!开头标记但没有遵循![text](url)格式
                    #按普通文本渲染
                    head_num+=1
                else:
                    text,url=result.groups()
                    if text=='':
                        text=url
                    index=self.index('end')
                    tag_name=f'"link-{index}"'
                    if 'underline' not in p_tags:
                        p_tags.append('underline')
                    self.tag_config(tag_name,font=(self.font_family,self.font_size,*p_tags))
                    self.tag_bind(tag_name,'<Button-1>',lambda e:webbrowser.open(url))
                    self.tag_bind(tag_name,'<Enter>',lambda e:self.balloon.show(e,url))
                    self.tag_bind(tag_name,'<Leave>',lambda e:self.balloon.hide(e))
                    self.insert('end',text,('link',tag_name))
                    if newline:
                        self.insert('end','\n')
                    return
            index=self.index('end-1c')
            tag_name=f'"paragraph-{index}"'
            self.tag_config(tag_name,font=(self.font_family,self.font_size,*p_tags))
            self.insert('end',text[head_num:],('paragraph',tag_name))
        if newline:
            self.insert('end','\n')

在粗体、斜体、下划线、删除线部分,存在开头标记就在样式列表p_tags中加入关键词,超链接这在最后进行判断。最后的渲染中,通过在font参数里使用*p_tags释放样式关键词,就完成了文本段的渲染。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1987984.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

亚马逊、eBay、沃尔玛等海外跨境电商测评自养号的技术解决方案

随着跨境电商的蓬勃发展&#xff0c;卖家们对于提升店铺流量、销量以及产品评价的需求日益迫切。在这一背景下&#xff0c;海外跨境电商测评成为了一个备受瞩目的领域。作为一家专注于此领域的技术型公司&#xff0c;凭借其深厚的技术积累和丰富的实战经验&#xff0c;为卖家们…

supermap制作发布二三维地图服务

一、下载安装 软件版本&#xff1a; SuperMap iDesktopX 11i(2023) SP1 for Windows SuperMap iServer 11i(2023) SP1 for Windows 下载地址&#xff1a; http://support.supermap.com.cn/DownloadCenter/ProductPlatform.aspx 二、运行 服务端&#xff1a;双击iserver的…

HTML学习笔记——用HTML记录学习过程4——非主体结构元素

非主体结构元素主要是为了表达逻辑结构或者附加信息的元素 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>非主体结构元素</title> </head> <body> <header><h1>head…

大模型落地应用架构的一种模式

经过几个月的实践和探索&#xff0c;看过也经历过一些成型的项目了&#xff0c;如果是奔着落地去的&#xff0c;我们的目光不能只盯着大模型本身&#xff0c;而应该放眼甚至是需要投入精力去建设很多我们别的工作上。 本文&#xff0c;着重讲的是&#xff0c;我的理解下现实成…

「实战应用」着色器对图表控件LightningChart的影响及应用

LightningChart完全由GPU加速&#xff0c;并且性能经过优化&#xff0c;可用于实时显示海量数据-超过10亿个数据点。 LightningChart包括广泛的2D&#xff0c;高级3D&#xff0c;Polar&#xff0c;Smith&#xff0c;3D饼/甜甜圈&#xff0c;地理地图和GIS图表以及适用于科学&am…

PySide入门实战之五 | 信号与槽函数之鼠标、键盘等事件

&#x1f680;&#x1f680;&#x1f680; Pyside6实战教程专栏目录入口&#xff1a;点击跳转 目录 一、前期准备二、鼠标触发事件鼠标拖动窗口 一、前期准备 我们采用Pyside入门实战之四中通过QTDesigner创建的界面&#xff0c;具体由两个Label和一个Button组件构成&#xff…

【图书推荐】《数据资产管理核心技术与应用》

内容简介 《数据资产管理核心技术与应用》深入探讨数据资产管理的核心技术与应用&#xff0c;融入作者在大数据领域多年的丰富经验。《数据资产管理核心技术与应用》为读者提供一套可以落地的数据资产管理框架&#xff0c;并详解两个基于该框架进行数据资产管理的应用案例&…

[米联客-安路飞龙DR1-FPSOC] UDP通信篇连载-09 ICMP层程序设计

软件版本&#xff1a;Anlogic -TD5.9.1-DR1_ES1.1 操作系统&#xff1a;WIN10 64bit 硬件平台&#xff1a;适用安路(Anlogic)FPGA 实验平台&#xff1a;米联客-MLK-L1-CZ06-DR1M90G开发板 板卡获取平台&#xff1a;https://milianke.tmall.com/ 登录“米联客”FPGA社区 ht…

github技巧和bug解决方法短篇收集

有一些几句话就可以说明白的观点或者解决的的问题&#xff0c;小虎单独收集到这里。 Commits没有算入每天的activity fork的仓库是不算的。 Commits made in a fork will not count toward your contributions. 参考&#xff1a; Contribution activity not shown for github…

win7一键修复所有dll缺失详细方法,7个dll修复方法深度解析(2024)

dll文件是一种包含函数和其他关键信息的文件&#xff0c;供 Windows 应用程序使用。虽然大多数普通用户对.dll 文件的具体工作原理并不熟悉&#xff0c;但这些文件对于系统应用来说是至关重要的。通常情况下&#xff0c;人们在遇到因 DLL 文件缺失或损坏而导致的错误时&#xf…

Vue3+Ts项目中经常遇到导入组件,vscode报无法找到模块xxx,xxx隐式拥有 “any“ 类型解决办法~

1、报错截图&#xff1a; 2、解决办法&#xff1a;在确保路径正确的情况下&#xff0c;你会在 src 目录下找到一个名为 env.d.ts 的文件&#xff08;或者类似的名称&#xff09;。在这个文件中&#xff0c;你可以声明 .vue 文件的模块类型。例如&#xff1a;(这告诉 TypeScript…

探索Cohere的Prompt Tuner:革新你的提示优化工具

在今天的文章中&#xff0c;我们将深入探讨Cohere的Prompt Tuner。这是一款在你指尖的提示优化工具&#xff0c;至少这是他们所宣称的。Prompt Tuner的主要理念是&#xff0c;它提供了一种最简化、最标准化的方式来生成你所需要的提示。而最棒的部分是&#xff0c;你不需要成为…

vtkConnectivityFilter提取连通区域中的问题

直接使用vtkConnectivityFilter提取连通区域&#xff0c;渲染上没问题&#xff0c;但是打印出polydata中的点数&#xff0c;发现跟原始数据是一致的。 for (int i 0; i < numRegions; i){vtkSmartPointer<vtkConnectivityFilter> connectivityFilter vtkSmartPointe…

嵌入式人工智能(树莓派4B基础实验代码等)

本专栏收录了近40个实验,含全部实验代码,都已经打包。 1、简介 本实验平台为树莓派4B,处理器4核ARMV8架构-A72,内存8G版本,SD卡容量为64G。操作系统版本lsb_release -a 操作系统内核为uname -a 本专栏收录了树莓派系统的基本知识,环境基本配置,常用Linux系统操作、基…

Ecovadis丨Ecovadis认证丨Ecovadis评估

EcoVadis 是以下这样的一个存在和具有以下这些特点等&#xff1a; 背景方面&#xff1a; 它源自法国 &#xff0c;前身由“携手实现可持续发展 - 全球化学联盟&#xff08;TFS - CI&#xff09;”、“联合国全球契约组织&#xff08;UN Global Compact&#xff09;”、IPE公众…

<数据集>腐烂水果识别数据集<目标检测>

数据集格式&#xff1a;VOCYOLO格式 图片数量&#xff1a;3304张 标注数量(xml文件个数)&#xff1a;3304 标注数量(txt文件个数)&#xff1a;3304 标注类别数&#xff1a;6 标注类别名称&#xff1a;[good apple, bad apple, good orange, bad orange, good banana, bad …

从“抠图”到“抠视频”,Meta上新AI工具SAM 2。

继2023年4月首次推出SAM&#xff0c;实现对图像的精准分割后&#xff0c;Meta于北京时间2024年7月30日推出了能够分割视频的新模型SAM 2&#xff08;Segment Anything Model 2&#xff09;。SAM 2将图像分割和视频分割功能整合到一个模型中。所谓“分割”&#xff0c;是指区别视…

Python 如何处理命令行参数(argparse)?

在Python编程中&#xff0c;处理命令行参数是一项非常重要的技能&#xff0c;特别是在编写可执行脚本或工具时。Python的标准库提供了一个强大的模块来处理命令行参数&#xff0c;即argparse模块。 一、argparse模块简介 argparse模块是Python标准库中用于解析命令行参数的模…

达梦数据库的系统视图v$mem_pool

达梦数据库的系统视图v$mem_pool 达梦数据库的V$MEM_POOL视图主要用于显示所有内存池的信息。通过查询这个视图&#xff0c;用户可以监控数据库中各个内存组件的使用状况&#xff0c;包括内存池的大小、使用情况等。这有助于用户判断内存池是否空闲或紧张&#xff0c;从而进行…

使用消息队列完成两个进程之间相互通信

/*执行两个程序&#xff0c;程序间通过一个消息队列实现同时收发消息*/ #include <myhead.h>// 消息队列的大小 #define SIZE (sizeof(struct msgbuf) - sizeof(long)) // 消息队列结构体 struct msgbuf {long mtype; // 消息类型char mtext[1024]; // 消息内容 };…