引言
这篇文章实际上来自于tkinter文本框转录为PDF。
因为单纯录为pdf会出现分页导致一些文本断裂的情况,毕竟这个在tkinter中是无解的,所以我们可以选择长截图。
经过测试,即使使用长截图,也会存在部分文字无法正常显示,但这个概率很小。
依赖
需要使用到PIL,请自行安装。
与之前的PDF同逻辑
在这篇文章里,实际上就是对当时转录为pdf的函数做了一个小调整:
class Text2Image:
'''将tkinter文本组件内容长截图为png图片'''
def __init__(self,text_widget,master):
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=''):
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创新?
|