@TOC
前言
本文只作为笔记记录。
无论是新旧TinML,都允许<img>
的渲染如下情况:
-
只是用本地
/data/imgs
中的图片 -
只是用链接(文件标记位置为空即可)
-
优先使用本地,没有再通过链接获取
而只要从链接获取,就需要比本地直接读取花费更多的时间,这对于即时呈现的TinML是必须优化的问题。
思路设计
渲染时机
什么时候渲染图片?那肯定是解析到<img>
标签的时候。那然后呢?
tkinter文本框的内容载入方法需要用到位置或mark标记,用于定位。当图片被呈现出来后再接着渲染,实在没有必要。
在新版TinML实现中,渲染器解释部分会先记录下当前的位置,并传递给渲染图片的方法,然后继续往下解释并渲染。渲染图片的方法中,等图片准备就绪后再根据事先记录的位置信息,在正确的位置插入图片。
图片下载方式
多线程下载,没有别的解释。
不过这样,干脆建立一个线程池,直接以调用渲染图片的方法为子线程入口。
代码实现
渲染时机
case '<img>'|'<image>':
#...
img_file=unit[2]
img_path_name,img_type=os.path.splitext(img_file)
img_mark='imgmark'+str(id(unit))
img_url=''
img_size=None
WEBIMAGE=False#是否为网络图片
#...
img_threading=self.img_thread_pool.submit(self.__render_image,img_mark,img_file,WEBIMAGE,img_url,img_size)
img_threadings.append(img_threading)
self.tinml.addtin('<img>',filename=img_file,url=img_url,size=img_size)
其中,self.img_thread_pool
是线程池
图片下载与载入
def __render_image(self,mark,img_file,need_download=True,url='',img_size=None):
if need_download:
# 下载图片
...
else:
img=Image.open('./data/imgs/'+img_file)
if img_size:
#缩放图片
...
self.images[mark]=ImageTk.PhotoImage(img)
self.image_create(mark,image=self.images[mark])
其中mark
就是来自于解释器部分中的img_mark
。
这样我们就能够在不阻碍解释渲染的情况下载入图片。