Ошибка: не удается открыть ресурс - PullRequest
0 голосов
/ 23 февраля 2019
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, в истинном виде возвращает FreeTypeFont (шрифт, размер, индекс, кодировка, layout_engine)
Файл "C: \ Users \ Mevada \ AppData \ Local \ Programs \ Python \ Python37 \ lib \ site-packages \ PIL \ ImageFont.py"строка 145, в __init__layout_engine = layout_engine)
OSError: невозможно открыть ресурс

Спасибо ...

Ответы [ 4 ]

0 голосов
/ 23 февраля 2019
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()
0 голосов
/ 23 февраля 2019

Похоже, font не может быть найдено PIL.

Найдите файл шрифта на вашем компьютере.В Windows это всегда в каталоге C:\WINDOWS\Fonts.выберите один и измените свою строку 9 следующим образом:

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

bahnschrift.ttf - это просто образец на моем компьютере, я не уверен, что он существует на вашем компьютере.

0 голосов
/ 23 февраля 2019

Это не работает, потому что вы должны вставить имя файла шрифта в качестве первого аргумента здесь: ImageFont.truetype(str(combo.get()),18).

Если вы попытаетесь, например, arial , у вас все получится (если, конечно, на вашем компьютере установлен Arial).Да, и эта функция чувствительна к регистру, поэтому вы должны написать ее в нижнем регистре, потому что имя файла на самом деле arial.ttf (вы можете, кстати, удалить расширение, если хотите).

Итак, ваше поле со списком не работает, потому что когда вы выбираете шрифт с именем Courier New , например, PIL не найдет его, потому что его имя файла cour.ttf ,К сожалению, вы не можете использовать этот список шрифтов из tkinter в ImageFont, и у меня нет обходного пути в этом случае.

Как я уже сказал, это может сработать, но вы должны отпуститьВаше поле со списком: ImageFont.truetype('arial',18)

Прежде чем я уйду, еще одно важное замечание: если вы работаете в операционной системе, отличной от Windows, вы должны ввести полный путь к файлу шрифта.

0 голосов
/ 23 февраля 2019

ImageFont.truetype требует, чтобы вы дали ему имя файла.Вы не даете ему имя файла, вы даете ему имя семейства шрифтов.font.families() Tkinter не возвращает имена файлов.

...