python.tkinter设计标记语言(渲染4-图片)

@TOC

前言

本文只作为笔记记录。

无论是新旧TinML,都允许<img>的渲染如下情况:

  1. 只是用本地/data/imgs中的图片

  2. 只是用链接(文件标记位置为空即可)

  3. 优先使用本地,没有再通过链接获取

而只要从链接获取,就需要比本地直接读取花费更多的时间,这对于即时呈现的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

这样我们就能够在不阻碍解释渲染的情况下载入图片。

  • 20
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值