当前位置: 首页 > news >正文

python.tkinter设计标记语言(渲染6-暂停与跳过渲染)

@TOC

前言

一个流式渲染呈现的标记语言,就需要有能够控制渲染呈现流程的标签。

TinML中(以TinText1.4版本为例),控制渲染呈现流程的标签主要有<stop>, <part>, <wait>,这三种标签分别对应以下流程控制:

  1. 暂停一段时间

  2. 划定一段内容,由读者决定是否显示并阅读

  3. 暂停渲染,等待读者确认继续阅读

为了使整个程序不会因为渲染暂停而被阻塞,TinText的渲染操作在子线程中进行。


暂停一段时间

这个很简单,由<stop>标签确定。

<stop>3
|-暂停三秒

在TinText中,由线程等待事件实现:

#t为暂停的时间,单位为秒
self.render_flag.clear()
self.render_flag.wait(t)
self.render_flag.set()

self.render_flag的定义如下:

self.render_flag=threading.Event()#渲染线程标志

划定可选阅读内容

TinML允许划定可选的阅读内容,由读者选择是否进行渲染呈现并阅读。

比如:

<p>接下来将介绍TinText的各个组成部分<pt>dev
<p>开发介绍。。。
</pt>dev<pt>apps
<p>TinText由TinReader、TinWriter、TinMaker等组成<pt>reader
<p>TinReader是TinText的阅读器
</pt>reader<pt>writer
<p>TinWriter是TinText的编辑器
</pt>writer<pt>maker
<p>TinMaker是TinText的加密与集成TIN文件生成器
</pt>maker
</pt>apps|-......

在新版TinML规范中,可选呈现内容标签允许嵌套,如果上级内容未被选择阅读,则下级所有内容,包括下级可选呈现内容,均会被跳过,所以尽量不要半嵌套

这就划定了两大可选内容,第二个可选内容下又分三个可选内容,这些内容都可以允许读者选择是否阅读,同来减少不必要的阅读信息。

在TinText的实现中,会在阅读框底部询问是否进行阅读某一个内容。内部实现由内容块名称记录表完成。

class PartTag:"""TinText <part> <pt> </part> </pt>"""def __init__(self):self.names={'':True}def named(self,name):if name in self.names:return Trueelse:return Falsedef edit(self,name,state:bool):self.names[name]=statedef delete(self,name):del self.names[name]def check(self):return self.names[tuple(self.names.keys())[-1]]def now(self):return tuple(self.names.keys())[-1]def clear(self):#删除除了''以外的所有值self.names.clear()self.names['']=True

具体记录实现:

ttpaf=TinTextPartAskFrame(self,name)
result=ttpaf.initial()
self.parttag.edit(name,result)

TinTextPartAskFrame为TinText自身实现的询问对话框,result为对话结果

每一个开头标签都会在TinText的内容名称表末尾添加一个元素,TinText对于接下来内容是否渲染的判定依据,就是名称表最后一个元素的值。

if not self.parttag.check():#<part>未被允许阅读if unit[1] not in ('</part>','</pt>'):#不是<part>结束标签continueif unit[2] != self.parttag.now():#不是当前忽略层级(名称)continue

当碰到结束标签时(显然,必须是同一个名称,毕竟是否渲染就取决于当前名称内容),则在名称表中删除这个元素:

self.parttag.delete(name)

暂停渲染并等待

暂停渲染肯定不能退出渲染,然后再进去,这对一个流式呈现的内容是不合理,因为会丢失上文信息。好在,TinText子线程渲染能够实现线程的暂停。

另外,这个和是否继续阅读不同,这个不要求读者立刻做出决定,所以不适合锁死整个GUI,我们只是想让渲染线程停止。

先看一个TinML例子:

|-......
<p>这就是今天学的全部内容和总结,接下来会布置作业。<wait>作业要求
<p>今天的作业是……

当TinText渲染器读到<wait>时,会触发以下操作:

ttwf=TinTextWaitFrame(self,content)
ttwf.initial()
self.render_flag.clear()
self.render_flag.wait()

TinTextWaitFrame用来显示“继续阅读”按钮

这样,我们就在这个线程里暂停了这个线程,那等读者按下继续阅读的按钮之后,又怎么恢复线程呢?

TinText的实现如下。

绑定恢复渲染的虚拟事件:

        self.bind('<<ResumeRender>>', lambda e:self.resume_thread_render())def resume_thread_render(self):#恢复渲染self.render_flag.set()

然后在TinTextWaitFrame获得读者确定后触发TinText的<<ResumeRender>>即可。

相关文章:

  • Arweave 出块流程详解
  • 【优选算法】(第十一篇)
  • 排水系统C++
  • 对象存储极简理解(对象、存储桶)
  • kubeadm部署k8s集群,版本1.23.6;并设置calico网络BGP模式通信,版本v3.25--未完待续
  • Java基础 3. 面向对象
  • DevExpress WinForms中文教程:Data Grid - 如何添加或删除行?
  • 浏览器插件的标准项目结构通常包括以下几个目录和文件
  • c语言手撕内存池组件
  • 利用Puppeteer-Har记录与分析网页抓取中的性能数据
  • 网络安全 DVWA通关指南 DVWA Weak Session IDs(弱会话)
  • C++中数据类型的大小
  • 【spring中event】事件简单使用
  • 【MySQL】数据目录迁移
  • 前端 vue3 对接科大讯飞的语音在线合成API
  • 《Javascript高级程序设计 (第三版)》第五章 引用类型
  • 【MySQL经典案例分析】 Waiting for table metadata lock
  • android 一些 utils
  • Apache Spark Streaming 使用实例
  • crontab执行失败的多种原因
  • Facebook AccountKit 接入的坑点
  • Fastjson的基本使用方法大全
  • git 常用命令
  • Java读取Properties文件的六种方法
  • Java多线程(4):使用线程池执行定时任务
  • java概述
  • JS数组方法汇总
  • laravel5.5 视图共享数据
  • orm2 中文文档 3.1 模型属性
  • PaddlePaddle-GitHub的正确打开姿势
  • python学习笔记 - ThreadLocal
  • python学习笔记-类对象的信息
  • SpiderData 2019年2月23日 DApp数据排行榜
  • Theano - 导数
  • vue脚手架vue-cli
  • WinRAR存在严重的安全漏洞影响5亿用户
  • WordPress 获取当前文章下的所有附件/获取指定ID文章的附件(图片、文件、视频)...
  • 分享几个不错的工具
  • 规范化安全开发 KOA 手脚架
  • 前端面试之闭包
  • 删除表内多余的重复数据
  • 物联网链路协议
  • 责任链模式的两种实现
  • 策略 : 一文教你成为人工智能(AI)领域专家
  • 国内唯一,阿里云入选全球区块链云服务报告,领先AWS、Google ...
  • ​【原创】基于SSM的酒店预约管理系统(酒店管理系统毕业设计)
  • ​云纳万物 · 数皆有言|2021 七牛云战略发布会启幕,邀您赴约
  • # 再次尝试 连接失败_无线WiFi无法连接到网络怎么办【解决方法】
  • #git 撤消对文件的更改
  • #laravel 通过手动安装依赖PHPExcel#
  • $(document).ready(function(){}), $().ready(function(){})和$(function(){})三者区别
  • (1)svelte 教程:hello world
  • (19)夹钳(用于送货)
  • (2024,RWKV-5/6,RNN,矩阵值注意力状态,数据依赖线性插值,LoRA,多语言分词器)Eagle 和 Finch
  • (Matlab)基于蝙蝠算法实现电力系统经济调度