准备在Python的Tkinter模块中用Canvas绘制如下形式的工艺卡片(图片来自参考文献5,原图来自参考文献4),但是在绘制图形时遇到两个问题,特此记录如下:
Canvas绘制图片支持bitmap和image两种格式,其中image必须是tkinter模块的BitmapImage类或PhotoImage类的实例变量,而PhotoImage类不支持jpg格式图片。
百度tkinter绘制jpg图片,大部分搜索结果中给出的建议都是使用PIL包中的 Image类和ImageTk类中转一下,具体介绍请见参考文献6,程序代码列出如下:
from PIL import Image, ImageTk
img = Image.open("./images/part1.jpg")
photo = ImageTk.PhotoImage(img)
cv.create_image(startX,startY+51,anchor = tk.NW,image=photo)
如果本机没有安装PIL 包,使用pip install PIL安装包时会提示如下错误,关于该错误的说明请见参考文献2,将安装命令改为pip install Pillow即可正常安装。
ERROR: Could not find a version that satisfies the requirement PIL (from versions: none)
ERROR: No matching distribution found for PIL
WARNING: There was an error checking the latest version of pip.
图片正常加载后,运行上面的绘图函数绘图,得到如下结果,可以看到图片已经超出的左侧显示区域,占据了部分右侧显示区域。
还是回到Canvas绘图函数定义,绘图函数中仅支持指定绘图的左上角坐标,并没有指定绘图区域的参数,尝试在函数中增加width和height属性并赋值,运行程序时会直接报错。
百度tkinter canvas 绘制图形到指定区域,也没有找到能参考的文章,不过在参考文献3中的示例程序中有调用Image类的resize函数重新设置图片大小的代码。既然没有找到类似C#GDI+和JavaScript绘图函数那样可以指定绘图区域的配置,那死马先当活马医,先将图片尺寸重新设置为工艺卡片中绘图区域的大小,然后再调用Canvas绘图函数绘图,代码及程序效果如下所示。勉强能看,但只是凑合能用,后续还会继续学习Canvas绘图方法,看是否有更好的解决方式。
img = Image.open("./images/part1.jpg").resize((399, 222), Image.ANTIALIAS)
photo = ImageTk.PhotoImage(img)
cv.create_image(startX,startY+51,anchor = tk.NW,image=photo)
参考文献:
[1]http://c.biancheng.net/tkinter/canvas-widget.html
[2]https://blog.csdn.net/username666/article/details/113598726
[3]https://vimsky.com/examples/detail/python-method-ImageTk.PhotoImage.html
[4]https://baike.baidu.com/item/%E5%B7%A5%E8%89%BA%E5%8D%A1/8940434?fr=aladdin
[5]https://blog.csdn.net/gc_2299/article/details/110292808
[6]https://www.cnblogs.com/Mrzyz/p/16146182.html