我正在实现图像上的文本绘制,并试图通过实现适当前进的“文本光标”来处理换行符。
我有一个处理尾随换行符的解决方案,但是它很丑陋且不符合Python规范。 Python的方式是什么?
这就是我现在正在做的事情(出于示例目的,简化了代码):
# string may contain zero or more newlines, may or may not terminate in a newline
def text(string):
for line in string.splitlines():
global x_cursor, y_cursor # pixel location of cursor in image
x_size_of_text = draw_one_line_of_text(line)
old_x_cursor = x_cursor
x_cursor = 0
y_cursor += 20 # lines are 20 pixels high
if string[-1] != '\n': # if no trailing newline, undo final newline
x_cursor = old_x_cursor + x_size_of_text
y_cursor -= 20
在string.splitline()返回的每一行之后,我都要换行,然后,如果原始字符串没有以换行符结尾,请撤消换行。
这可行,但是很丑。正确的方法是什么?
答案 0 :(得分:1)
您可以告诉splitlines
在拆分时保留行尾(通过传递True
作为可选参数)。
然后,如果没有换行符,请不要在每一行中转到下一行(显示时必须去除line
。
对于string.splitlines(True)中的行:
global x_cursor, y_cursor # pixel location of cursor in image
x_size_of_text = draw_one_line_of_text(line.rstrip())
old_x_cursor = x_cursor
if line.endswith("\n"):
x_cursor = 0
y_cursor += 20 # lines are 20 pixels high
这避免了最终测试,但引入了许多额外的测试和复杂性,仅用于处理最后一种情况。我认为坚持您的解决方案没有问题(这很丑陋,但速度很快-要求宽恕而不是获得许可)。
一个异议,而不是:
if string[-1] != '\n': # if string is empty: Index out of range exception
我愿意:
if string and not string.endswith("\n"):
如果字符串为空,则测试将使程序崩溃。此外,没有什么要纠正的,因此请先测试空字符串。