tkinter文本框小功能(5):长截图

该博客介绍了如何使用tkinter结合PIL库,通过长截图的方式来解决文本分页显示不完整的问题。文章提供了一个Text2Image类,用于将文本框内容转换为png图片,避免了PDF转换时可能出现的文字断裂。在截图过程中,会调整文本框边框为0以提高截图质量。最终效果与PDF转换相似,适用于需要完整保存tkinter文本组件内容的场景。
摘要由CSDN通过智能技术生成

tkinter文本框小功能(5):长截图

引言

这篇文章实际上来自于tkinter文本框转录为PDF

因为单纯录为pdf会出现分页导致一些文本断裂的情况,毕竟这个在tkinter中是无解的,所以我们可以选择长截图。

经过测试,即使使用长截图,也会存在部分文字无法正常显示,但这个概率很小。


依赖

需要使用到PIL,请自行安装。


与之前的PDF同逻辑

在这篇文章里,实际上就是对当时转录为pdf的函数做了一个小调整:

class Text2Image:
    '''将tkinter文本组件内容长截图为png图片'''

    def __init__(self,text_widget,master):
        #text_widget::tkinter的文本框组件
        #master::tkinter文本框所在的窗口
        self.text=text_widget
        self.master=master
        self.retop=self.master.attributes('-topmost')
        self.textstyle=self.text['relief']
        self.bd=self.text['borderwidth']
        print(self.bd)

    def img(self,pdfname='textpng',path=''):
        #pdfname::pdf文件名称
        #path::生成的pdf路径,默认当前目录
        self.text.yview('moveto',0.0)
        self.text.update()
        _,ys,_,ye=self.text.bbox(1.0)
        chh=ye-ys#获取单字符高度
        startx=self.text.winfo_rootx()
        starty=self.text.winfo_rooty()
        width=self.text.winfo_width()
        height=self.text.winfo_height()
        #填充最后一页字符
        num=height//chh+1
        self.text.insert('end','\n'*num)
        #开始截屏
        ctypes.windll.shcore.SetProcessDpiAwareness(2)
        endx=startx+width
        endy=starty+height
        self.master.attributes('-topmost',1)
        self.text['relief']='flat'
        self.text['borderwidth']=0
        imgs=[]
        all_height=0
        while True:
            img=ImageGrab.grab((startx,starty,endx,endy))
            imgs.append(img)
            if self.text.yview()[1]>=1:
                break
            self.text.yview("scroll",height,'pixels')
            self.text.update()
            all_height+=height
        newimg=Image.new('RGB',(width,all_height),255)
        x=y=0#拼接起始点
        for img in imgs:
            newimg.paste(img,(x,y)) 
            y+=height
        newimg.save(path+pdfname+'.png',resolution=100.0)
        self.master.attributes('-topmost',int(self.retop))
        self.text['relief']=self.textstyle
        self.text['borderwidth']=self.bd

唯一的一个新增点就是在录制时,将文本框的边框改为0宽度。

效果

录制效果和pdf一样。下面是成果:
在这里插入图片描述


结语

毕竟因为前面那一篇文章的积淀,因此这里只将其作为一个小功能。完整逻辑参考本文开头的那一篇文章。

☀tkinter创新☀

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值