PIL (Pillow) получаетizeize_multiline () в то время как l oop переходит в бесконечное l oop? - PullRequest
0 голосов
/ 10 февраля 2020

Почему эти несколько строк кодов go превращаются в бесконечное число l oop? Кажется, это единственная возможная часть, которая не подходит для моего кода, так как после комментирования все остальное работает отлично.

#Increase the font size till the text is just a little too wide
while selected_font.getsize_multiline(beautiful_text)[0] < (0.8 * img.size[0]):
    selected_font.size += 2

#If the text is too long, reduce the font size a little...
while selected_font.getsize_multiline(beautiful_text)[1] > (0.7 * img.size[1]):
    selected_font.size -= 2
    #..and then increase the number of characters per line till it's wide enough...
    while selected_font.getsize_multiline(beautiful_text)[0] < (0.8 * img.size[0]):
        wrapper.width += 2
        beautiful_text = wrapper.fill(input_text)
    #...rewrap the text, test again, and keep repeating till it sits well

Я знаю, что selected_font.getsize_multiline(beautiful_text) - это допустимый вызов, который возвращает кортеж, и То же самое касается img.size. При увеличении размера шрифта ширина текстового поля определенно увеличится на go, так почему же это приводит к бесконечному l oop?

1 Ответ

0 голосов
/ 11 февраля 2020

Я исправил ошибку. Проблема заключается в том, что объект шрифта, возвращаемый ImageFont.truetype('fontfile', size = desired_size) (в данном случае объект selected_font), имеет атрибут size, который является неизменным.

selected_font = ImageFont.truetype('Arial.ttf', size = 20)
print(selected_font.size)       #output: 20
selected_font.size = 10         #doesn't raise an error
print(selected_font.size)       #output: 20

, и поэтому эта строка не обновляется переменная, которую я проверяю в l oop

selected_font.size += 2         #does nothing, and raises no errors

Чтобы добавить к путанице, модуль TextWrapper имеет изменяемый атрибут размера для своей переменной ширины строки

wrapper.width += 5              #works as you'd expect

В любом случае, я решил свою проблему с этим кодом

fontsize = 10

while selected_font.getsize_multiline(beautiful_text)[1] > (0.7 * img.size[1]):
    fontsize -= 2
    selected_font = ImageFont.truetype("src/CaviarDreams.ttf", size = fontsize)

и так далее для других циклов.

...