OSError:无法打开资源

时间:2019-02-23 03:38:40

标签: python python-3.x tkinter python-imaging-library font-face

yangxiaoyu@STB-240:~/test/c/mem$ ./a.out & 
[1] 163026
yangxiaoyu@STB-240:~/test/c/mem$ start of heap = 0xb7b010 
end of heap = 0xb9d000 
sizeOfHeap = 0x21ff0 

yangxiaoyu@STB-240:~/test/c/mem$ cat /proc/163026/map
map_files/ maps       
yangxiaoyu@STB-240:~/test/c/mem$ cat /proc/163026/map
map_files/ maps       
yangxiaoyu@STB-240:~/test/c/mem$ cat /proc/163026/maps 
00400000-00401000 r-xp 00000000 08:12 266873328                          /home/yangxiaoyu/test/c/mem/a.out
00600000-00601000 r--p 00000000 08:12 266873328                          /home/yangxiaoyu/test/c/mem/a.out
00601000-00602000 rw-p 00001000 08:12 266873328                          /home/yangxiaoyu/test/c/mem/a.out
00b7b000-00b9d000 rw-p 00000000 00:00 0                                  [heap]
7f499604e000-7f499620c000 r-xp 00000000 08:03 9572117                    /lib/x86_64-linux-gnu/libc-2.19.so
7f499620c000-7f499640c000 ---p 001be000 08:03 9572117                    /lib/x86_64-linux-gnu/libc-2.19.so
7f499640c000-7f4996410000 r--p 001be000 08:03 9572117                    /lib/x86_64-linux-gnu/libc-2.19.so
7f4996410000-7f4996412000 rw-p 001c2000 08:03 9572117                    /lib/x86_64-linux-gnu/libc-2.19.so
7f4996412000-7f4996417000 rw-p 00000000 00:00 0 
7f4996417000-7f499643a000 r-xp 00000000 08:03 9572106                    /lib/x86_64-linux-gnu/ld-2.19.so
7f4996624000-7f4996627000 rw-p 00000000 00:00 0 
7f4996638000-7f4996639000 rw-p 00000000 00:00 0 
7f4996639000-7f499663a000 r--p 00022000 08:03 9572106                    /lib/x86_64-linux-gnu/ld-2.19.so
7f499663a000-7f499663b000 rw-p 00023000 08:03 9572106                    /lib/x86_64-linux-gnu/ld-2.19.so
7f499663b000-7f499663c000 rw-p 00000000 00:00 0 
7ffde625a000-7ffde627b000 rw-p 00000000 00:00 0                          [stack]
7ffde633b000-7ffde633d000 r--p 00000000 00:00 0                          [vvar]
7ffde633d000-7ffde633f000 r-xp 00000000 00:00 0                          [vdso]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0                  [vsyscall]
yangxiaoyu@STB-240:~/test/c/mem$ 

输出

  

Tkinter回调中的异常
  追溯(最近一次通话):
  __call__返回self.func(* args)中的文件“ C:\ Users \ Mevada \ AppData \ Local \ Programs \ Python \ Python37 \ lib \ tkinter__init __。py”,行1702
  在func_image中的文件“ test.py”,第9行
  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)
  __init__layout_engine = layout_engine中的文件“ C:\ Users \ Mevada \ AppData \ Local \ Programs \ Python \ Python37 \ lib \ site-packages \ PIL \ ImageFont.py”(第145行)
  OSError:无法打开资源

谢谢...

4 个答案:

答案 0 :(得分: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()

答案 1 :(得分:0)

ImageFont.truetype要求您提供一个文件名。您没有给它一个文件名,而是给它一个字体系列的名称。 Tkinter的font.families()不返回文件名。

答案 2 :(得分:0)

PIL似乎找不到font

在计算机中找到字体文件。在Windows中,它始终位于C:\WINDOWS\Fonts目录中。选择一个并像这样修改您的第9行:

font_type_1 = ImageFont.truetype("bahnschrift.ttf",18)

bahnschrift.ttf只是我计算机上的一个示例,我不确定它是否存在于您的计算机上。

答案 3 :(得分:0)

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

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

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

正如我所说,这可能有用,但是您必须放开组合框:ImageFont.truetype('arial',18)

在我开始之前,还有一个重要的注意事项:如果您使用的不是Windows操作系统,则必须输入字体文件的完整路径。