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)、文本框…...
如何在看板中体现优先级变化
在看板中有效体现优先级变化的关键措施包括:采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中,设置任务排序规则尤其重要,因为它让看板视觉上直观地体…...
理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端
🌟 什么是 MCP? 模型控制协议 (MCP) 是一种创新的协议,旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议,它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...
基于Uniapp开发HarmonyOS 5.0旅游应用技术实践
一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架,支持"一次开发,多端部署",可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务,为旅游应用带来…...
sqlserver 根据指定字符 解析拼接字符串
DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...
Axios请求超时重发机制
Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式: 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...
HTML前端开发:JavaScript 常用事件详解
作为前端开发的核心,JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例: 1. onclick - 点击事件 当元素被单击时触发(左键点击) button.onclick function() {alert("按钮被点击了!&…...
IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)
文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...
学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2
每日一言 今天的每一份坚持,都是在为未来积攒底气。 案例:OLED显示一个A 这边观察到一个点,怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 : 如果代码里信号切换太快(比如 SDA 刚变,SCL 立刻变&#…...
React---day11
14.4 react-redux第三方库 提供connect、thunk之类的函数 以获取一个banner数据为例子 store: 我们在使用异步的时候理应是要使用中间件的,但是configureStore 已经自动集成了 redux-thunk,注意action里面要返回函数 import { configureS…...
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...
