您的位置:首页 > 编程语言 > Python开发

【请珍藏】python tkinter保存canvas画布的三种方法

2020-06-01 04:36 197 查看

正在尝试着做一个比较完善的画图软件,计划使用tkinter库中的canvas控件来做,然后正在攻关图形项位置、坐标、大小及其他属性项的保存和加载的问题,刚好需要用到坐标、位置的知识,因此作为这个画图软件的附带产出物,整理成了本篇博文,分享给大家,一起研究研究,期待能对你工作带来启发和帮助。

不忘初心,方得始终,让我们一起共勉!

好的,言归正传,回归本篇博文的主题:python tkinter保存canvas画布的三种方法

方法一:

[code]from tkinter import *
from PIL import ImageGrab

def getter(widget):
widget.update()
x=root.winfo_rootx()+widget.winfo_x()
y=root.winfo_rooty()+widget.winfo_y()
x1=x+widget.winfo_width()
y1=y+widget.winfo_height()
ImageGrab.grab().crop((x,y,x1,y1)).save("first.jpg")

root = Tk()
cv = Canvas(root)
cv.create_rectangle(10,10,50,50)
cv.create_line([0, 10, 100, 100], fill='green')
cv.pack()
getter(cv)
root.mainloop()

运行效果如下:

方法二:

[code]from tkinter import *
import win32gui
from PIL import ImageGrab

#然后是获取Canvas的实现
def CaptureScreen():
HWND = win32gui.GetFocus() #获取当前窗口句柄
rect=win32gui.GetWindowRect(HWND) #获取当前窗口坐标
im=ImageGrab.grab(rect) #截取目标图像
im.save("second.jpeg",'jpeg') #前面一个参数是保存路径,后面一个参数是保存格式

root = Tk()
cv = Canvas(root, width=300, height=150)
cv.create_rectangle(10,10,50,50)
cv.pack()
b = Button(root, text='截图', command=CaptureScreen)
b.pack()
mainloop()

运行效果如下:

通过上图可以发现截图的时候,把root的整个屏幕都截取出来了,但是下面的部分不是我们需要的,那么,我们对RECT的区域进行优化后的脚本如下:

[code]from tkinter import *
import win32gui
from PIL import ImageGrab

def CaptureScreen():
HWND = win32gui.GetFocus()
rect=win32gui.GetWindowRect(HWND)
x = rect[0]
x1=x+cv.winfo_width()
y = rect[1]
y1=y+cv.winfo_height()
im=ImageGrab.grab((x,y,x1,y1))
im.save("second.jpeg",'jpeg')

root = Tk()
cv = Canvas(root, width=300, height=150)
cv.pack()
cv.create_rectangle(10,10,50,50)
cv.update()
b = Button(root, text='截图', command=CaptureScreen)
b.pack()
root.mainloop()

运行效果如下:

方法三:直接使用ImageDraw进行图片生成。

[code]from tkinter import *
from PIL import Image, ImageDraw

width = 400
height = 300
center = height//2
white = (222, 222, 220)
green = (0,128,0)

root = Tk()
cv = Canvas(root, width=width, height=height, bg='white')
cv.pack()
image1 = Image.new("RGB", (width, height), white)
draw = ImageDraw.Draw(image1)
cv.create_line([0, center, width, center], fill='green')
draw.line([0, center, width, center], green)
filename = "third.jpg"
image1.save(filename)
root.mainloop()

运行效果如下:

好的,这篇博文写完了,其实主要是对canvas进行截图,然后保存成图片,基本原理是比较简单,这块功能将会应用在我后续的画图软件中实现,敬请期待!感谢支持!

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: