OSError: 无法打开资源

新手上路,请多包涵
import tkinter as tk
from tkinter import ttk,font
from PIL import Image,ImageDraw,ImageFont

root = tk.Tk()

def func_image():
    image = Image.open(r'E:\side_300.png')
    font_type_1 = ImageFont.truetype(str(combo.get()),18)
    draw = ImageDraw.Draw(image)
    draw.text((50,50),text='Hello',fill='red',font=font_type_1)
    image.show()

fonts=list(font.families())
fonts.sort()
combo = ttk.Combobox(root,value=fonts)
combo.pack()

btn = ttk.Button(root,text='Click Me',command=func_image)
btn.pack()

root.mainloop()

输出

Tkinter 回调异常

追溯(最近一次通话):

文件“C:\Users\Mevada\AppData\Local\Programs\Python\Python37\lib\tkinter__init__.py”,第 1702 行,在 __call__return self.func(*args)

文件“test.py”,第 9 行,在 func_image 中

font_type_1 = ImageFont.truetype(str(combo.get()),18)

文件“C:\Users\Mevada\AppData\Local\Programs\Python\Python37\lib\site-packages\PIL\ImageFont.py”,第 280 行,在 truetype 中返回 FreeTypeFont(字体、大小、索引、编码、layout_engine)

文件“C:\Users\Mevada\AppData\Local\Programs\Python\Python37\lib\site-packages\PIL\ImageFont.py”,第 145 行,在 __init__layout_engine=layout_engine 中)

OSError: 无法打开资源

谢谢…

原文由 Bhavesh Mevada 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 824
2 个回答
import tkinter as tk
from tkinter import ttk
from PIL import Image,ImageDraw,ImageFont
import matplotlib.font_manager as fm

root = tk.Tk()

def func_image():
    image = Image.open(r'E:\side_300.png')
    font_type_1 = ImageFont.truetype(fm.findfont(fm.FontProperties(family=combo.get())),18)
    draw = ImageDraw.Draw(image)
    draw.text((50,50),text='Hello',fill='red',font=font_type_1)
    image.show()

fonts = list(set([f.name for f in fm.fontManager.ttflist]))
fonts.sort()

combo = ttk.Combobox(root,value=fonts)
combo.pack()

btn = ttk.Button(root,text='Click Me',command=func_image)
btn.pack()

root.mainloop()

原文由 Bhavesh Mevada 发布,翻译遵循 CC BY-SA 4.0 许可协议

它不起作用,因为您必须在此处插入字体文件名作为第一个参数: ImageFont.truetype(str(combo.get()),18)

例如,如果您尝试 arial ,您将成功(当然,如果您的计算机上安装了 Arial)。哦,那个函数是区分大小写的,所以你必须用小写字母写它,因为文件名实际上是 arial.ttf (顺便说一下,如果需要,你可以删除扩展名)。

因此,您的组合框不起作用,因为当您选择名为 Courier New 的字体时,例如,PIL 将找不到它,因为它的文件名为 cour.ttf 。不幸的是,您不能在 ImageFont 上使用来自 tkinter 的字体列表,在这种情况下我没有适合您的解决方法。

正如我所说,这可能有效,但你必须放弃你的组合框: ImageFont.truetype('arial',18)

在我开始之前,还有一个更重要的注意事项:如果您在 Windows 以外的操作系统上工作,则必须键入字体文件的完整路径。

原文由 Rafael Barros 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题