如何在枕头上写多行文字?

问题描述 投票:0回答:1

我正在尝试将一个长文本转换为多行文本。我写了一些代码,大部分都有效。但是我在计算线宽时遇到了一些问题。因为线路越来越短。可能是由

lastCalculatedWidth
resultTextLength
或两者共同引起的。我尝试了很多东西,但我很困惑,我想尽快解决这个问题,如果你能帮助我,我将不胜感激。

text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec augue leo, pulvinar maaaıs sagittis sit amet, tristique viverra mauris. Sed mauris quam, faucibus id pretium non, varius eget leo."
result_text = ""
messageBreakLineIndexes = []
calculatedWords = 0
messageLineWidth = draw.textlength(text, font=font)
resultTextLength = 0
lastCalculatedWidth = 0
calculationSwitch = True

while calculatedWords < len(text.split()):
    result_text += text.split()[calculatedWords] + " "
    resultTextLength += draw.textlength(text.split()[calculatedWords], font=font)
    if resultTextLength > img.width - 60:
        result_text = result_text.rstrip()
        result_text = result_text.rsplit(" ", 1)[0]

        messageBreakLineIndexes.append(len(result_text))
        calculatedWords -= 1
        
        resultTextLength -= draw.textlength(result_text.rstrip(), font=font) - lastCalculatedWidth
        lastCalculatedWidth = draw.textlength(result_text.rstrip(), font=font)
    calculatedWords += 1

print(messageBreakLineIndexes)
for i in range(len(messageBreakLineIndexes)):
    index = messageBreakLineIndexes[i]
    result_text = result_text[:index+i] + "\n" + result_text[index+i:]
draw.text(text_position, result_text, font=font, fill=text_color)
python python-imaging-library
1个回答
0
投票

resultTextLength
在换行后无法正确重置,并且
lastCalculatedWidth
无法准确跟踪换行前适合该行的最后一个单词的宽度,这会在计算行宽度时触发累积错误,如下所示循环迭代。所以队伍会逐渐变短。

尝试这样的事情:

text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec augue leo, pulvinar maaaıs sagittis sit amet, tristique viverra mauris. Sed mauris quam, faucibus id pretium non, varius eget leo."

# Split the text by spaces to get words
words = text.split()

result_text = ""
messageBreakLineIndexes = []
resultTextLength = 0
img_width = 800

# Iterate over the words directly as an iterable, not by len
for word in words:
    # Check the width of the current line plus the next word
    word_width = draw.textlength(word, font=font)
    if resultTextLength + word_width <= img_width - 60:
        # If the line isn't too wide, add the word to the line
        result_text += word + " "
        resultTextLength += word_width + draw.textlength(" ", font=font)  # Add space width
    else:
        # If the line is too wide, break the line
        result_text = result_text.rstrip() + "\n"
        messageBreakLineIndexes.append(len(result_text))
        result_text += word + " "
        resultTextLength = word_width + draw.textlength(" ", font=font)  # Reset line width

draw.text(text_position, result_text, font=font, fill=text_color)

如果有效请告诉我。

© www.soinside.com 2019 - 2024. All rights reserved.