python.tkinter设计标记语言(渲染2-渲染器)
@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>段落演示;
|*粗体
|/斜体
|-删除线
|_下划线
|
|*-/这是粗体和删除线、斜体的组合文本块
| 第一个空格没有意义,这就是普通文本块
| 这才会显示一个空格
|*_|
当然,这些都可以挤在同一行,而且我觉得那样更好,不必担心混乱,因为在新版TinText实现应用中,TinWriter是可以明显分隔“|”的。
若文本块中含有删除线,就需要在同一行(段落)中书写,这是强制设计的。否则会被当作注释(|-)
样式拼接渲染
在<p>
标记的渲染中,新一版TinText采用样式拼接的方法,使得不同样式可以作用于同一个文本块,这是旧版Tin标记语言做不到的。
def __render_paragraph(self,text,newline=False):#普通文本,默认不自动换行if text=='':passelif 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=0p_tags=[]if '*' in head_mark:head_num+=1p_tags.append('bold')if '/' in head_mark:head_num+=1p_tags.append('italic')if '_' in head_mark:head_num+=1p_tags.append('underline')if '-' in head_mark:head_num+=1p_tags.append('overstrike')if '!' in head_mark:# head_num+=1result=self.paragraph_link_re.match(text)if result==None:#如果使用了!开头标记但没有遵循格式#按普通文本渲染head_num+=1else:text,url=result.groups()if text=='':text=urlindex=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')returnindex=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
释放样式关键词,就完成了文本段的渲染。
相关文章:

python.tkinter设计标记语言(渲染2-渲染器)
TOC 前言 本文仅作为笔记记录。 在前文中,我们通过标记意义解释生成了带有明确渲染要求的参数组,以<title>为例,我们获取了title, level两个明确的渲染标记,这一部分由Tin标记解释器完成,不需要编写者花费过多…...

Cadence学习笔记 Day0 Cadence17.4环境安装
当然是选择“吴法安装” 直接跟着吴川斌博客的方法来就可以了,这里大致记录一下我的安装步骤: 安装许可证管理器破解许可证管理器安装软件以及补丁破解软件 获取 直接放出链接:吴川斌的博客 下载得到: 一、安装许可证管理器&am…...

k8s创建secret并在container中获取secret
k8s创建secret并在container中获取secret 本文使用的deployment和service与我的上一篇文章一样。link也放在下面了,如果不懂什么事deployment和service,可以先看我的上一篇文章。 k8s使用kustomize来部署应用 下面我们将通过创建secret开始。secret是我…...

Leetcode每日一题之仅仅反转字母(C++)
在学习之余对于知识的巩固也尤为重要,不论难度高低,都会对代码的理解有所加深,下面我们开始练习 思路解析 关于本题的核心思路就是如何判断字符串中元素是否为字母以及如何遍历字符串以达到仅反转的目的,这里用到的知识就是关于 s…...

PDF预览:利用vue3-pdf-app实现前端PDF在线展示
目录 PDF预览:利用vue3-pdf-app实现前端PDF在线展示 一、vue3-pdf-app组件介绍及其优点 1、vue3-pdf-app是什么 2、作用与场景 3、类似的插件 二、项目初始化与依赖安装 1、初始化Vue3项目 2、安装依赖 三、集成vue3-pdf-app插件 1、引入插件 2、配置组件…...

【OpenCV C++20 学习笔记】拉普拉斯(Laplace)二阶求导-边缘检测
拉普拉斯二阶求导 原理拉普拉斯算子(Laplacian Operator) API实例 原理 在OpenCV中,Sobel算法可以对图片中的值求一阶导数,从而计算出图片中的边缘线。其原理如下面的示意图: 那么,如果再求一次导数的,即求二阶导数&…...

MySQL的下载和安装步骤
一、数据库概述 我们先来了解三个概念:数据库、数据库管理系统、SQL。 名称全称简称数据库存储数据的仓库,数据是有组织的进行存储DataBase(DB)数据库管理系统操纵和管理数据库的大型软件DataBase Management System (DBMS)SQL操…...

Java国际版同城服务美容美发到店服务上门服务系统
🌍全球美妆新风尚!国际版同城服务,美容美发一键享 🏙️【国际视野,同城便捷】🏙️ 在这个全球化的时代,美丽不再受地域限制!国际版同城服务系统,将全球顶尖的美容美发资…...

硬件模拟的基本原理
具体来说,这种设计方法减少了集成电路 (IC) 设计和开发的设计迭代次数,并且广泛适用于所有电力电子设计。我详细介绍了我在快速上市 IC 开发方面的经验,并将该方法与其他旨在缩短产品开发时间的技术进行了对比。 产品开发流程 图 1ÿ…...

WPF学习(8)- Button按钮
1. 用法解析 Button因为继承了ButtonBase,而ButtonBase又继承了ContentControl,所以,Button可以通过设置Content属性来设置要显示的内容。例如 <Button Content"确定"/>我们使用Button的时机,通常是鼠标点击事件…...

Flutter GPU 是什么?为什么它对 Flutter 有跨时代的意义?
Flutter 3.24 版本引入了 Flutter GPU 概念的新底层图形 API flutter_gpu ,还有 flutter_scene 的 3D 渲染支持库,它们目前都是预览阶段,只能在 main channel 上体验,并且依赖 Impeller 的实现。 Flutter GPU 是 Flutter 内置的底…...

第6章>>实验7:PS(ARM)端Linux RT与PL端FPGA之间(通过Memory存储器进行通信和交互)《LabVIEW ZYNQ FPGA宝典》
1、实验内容 上一节实验里面介绍的Reg寄存器通道比较适合在PS端和PL端之间传递标量数据,也就是单个元素,如果要传递多个元素的数组或者连续数据流的话,Reg寄存器通道就不是很合适了。 本节实验我们向大家讲解如何借助Memory存储器通道在PS&am…...
通用前端的学习
通用前端的概念 通用前端的概念是我自创的,也是我多年开发全栈时的个人理解,结合自己对各种语言的比较,发现前端都具有几个特征,而这几个特征,很多人只能用具体的表象来描述,比如用安卓方式来说明…...
git本地仓库关联多个远程仓库时git pull失败问题
目录 问题描述 原因 解决办法 1.多个远程仓库需有继承关系 2.一句命令实现创建本地分支且与远程分支关联 问题描述 今天操作本地仓库时,关联了两个远程仓库,欲在本地仓库创建一个分支,与第二个远程仓库的某个分支关联,然后将…...
人工智能(AI)、Web 3.0和元宇宙三者联系、应用及未来发展趋势的详细分析
人工智能(AI)、Web 3.0和元宇宙作为当前科技领域的热门话题,它们之间存在着紧密的联系,并在各自领域内展现出广泛的应用和未来的发展趋势。以下是对这三者联系、应用及未来发展趋势的详细分析: 一、人工智能ÿ…...

【IEEE出版 | 高校主办】第三届人工智能、物联网和云计算技术国际会议(AIoTC 2024)
第三届人工智能、物联网和云计算技术国际会议(AIoTC 2024) 2024 3rd International Conference on Artificial Intelligence, Internet of Things and Cloud Computing Technology 2024年9月13-15日 | 中国武汉 重要信息 大会官网:www.ic…...
PTA 7-4 BCD解密
7-4 BCD解密(10分) BCD数是用一个字节来表达两位十进制的数,每四个比特表示一位。所以如果一个BCD数的十六进制是0x12,它表达的就是十进制的12。但是小明没学过BCD,把所有的BCD数都当作二进制数转换成十进制输出了。于…...

计算机网络中拥塞控制的门限值怎么设置
拥塞避免的门限值设置主要涉及到加权随机早期检测(WRED)技术,这是一种拥塞避免机制,通过为每个队列设定一对低门限和高门限值来实现。具体来说,当队列长度小于低门限时,不丢弃报文࿰…...

解锁肥胖焦虑的枷锁:拥抱自我,健康前行
在这个颜值经济盛行、信息爆炸的时代,肥胖似乎成了许多人心中难以言说的痛。社交媒体上满屏的“A4腰”、“锁骨养鱼”,无形中给大众套上了一层名为“肥胖焦虑”的沉重枷锁。但请相信,真正的美丽与幸福,从不以体重秤上的数字为衡量…...

WPF学习(7)- Control基类+ContentControl类(内容控件)+ButtonBase基类
前面给大家介绍完了WPF所有的布局控件,属性以及使用案例,从这里咱们就开始学下内容控件。 Control基类 Control是许多控件的基类。比如最常见的按钮(Button)、单选(RadioButton)、复选(CheckBox)、文本框…...

智慧医疗能源事业线深度画像分析(上)
引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...
IGP(Interior Gateway Protocol,内部网关协议)
IGP(Interior Gateway Protocol,内部网关协议) 是一种用于在一个自治系统(AS)内部传递路由信息的路由协议,主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...

CentOS下的分布式内存计算Spark环境部署
一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架,相比 MapReduce 具有以下核心优势: 内存计算:数据可常驻内存,迭代计算性能提升 10-100 倍(文档段落:3-79…...

什么是库存周转?如何用进销存系统提高库存周转率?
你可能听说过这样一句话: “利润不是赚出来的,是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业,很多企业看着销售不错,账上却没钱、利润也不见了,一翻库存才发现: 一堆卖不动的旧货…...

视觉slam十四讲实践部分记录——ch2、ch3
ch2 一、使用g++编译.cpp为可执行文件并运行(P30) g++ helloSLAM.cpp ./a.out运行 二、使用cmake编译 mkdir build cd build cmake .. makeCMakeCache.txt 文件仍然指向旧的目录。这表明在源代码目录中可能还存在旧的 CMakeCache.txt 文件,或者在构建过程中仍然引用了旧的路…...

基于Java+MySQL实现(GUI)客户管理系统
客户资料管理系统的设计与实现 第一章 需求分析 1.1 需求总体介绍 本项目为了方便维护客户信息为了方便维护客户信息,对客户进行统一管理,可以把所有客户信息录入系统,进行维护和统计功能。可通过文件的方式保存相关录入数据,对…...
C++.OpenGL (20/64)混合(Blending)
混合(Blending) 透明效果核心原理 #mermaid-svg-SWG0UzVfJms7Sm3e {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-icon{fill:#552222;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-text{fill…...
CRMEB 中 PHP 短信扩展开发:涵盖一号通、阿里云、腾讯云、创蓝
目前已有一号通短信、阿里云短信、腾讯云短信扩展 扩展入口文件 文件目录 crmeb\services\sms\Sms.php 默认驱动类型为:一号通 namespace crmeb\services\sms;use crmeb\basic\BaseManager; use crmeb\services\AccessTokenServeService; use crmeb\services\sms\…...

【MATLAB代码】基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),附源代码|订阅专栏后可直接查看
文章所述的代码实现了基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),针对传感器观测数据中存在的脉冲型异常噪声问题,通过非线性加权机制提升滤波器的抗干扰能力。代码通过对比传统KF与MCC-KF在含异常值场景下的表现,验证了后者在状态估计鲁棒性方面的显著优…...

从“安全密码”到测试体系:Gitee Test 赋能关键领域软件质量保障
关键领域软件测试的"安全密码":Gitee Test如何破解行业痛点 在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的"神经中枢"。从国防军工到能源电力,从金融交易到交通管控,这些关乎国计民生的关键领域…...