简体   繁体   English

如何在python中打印消息框?

[英]How to print a message box in python?

I'm trying to print out a message within a created box in python, but instead of it printing straight down, it prints horizontally.我正在尝试在 python 中创建的框中打印出一条消息,但它不是直接向下打印,而是水平打印。

def border_msg(msg):
    row = len(msg)
    columns = len(msg[0])
    h = ''.join(['+'] + ['-' *columns] + ['+'])
    result = [h] + ["|%s|" % row for row in msg] + [h]
    return result

Expected result预期结果

border_msg('hello')

+-------+
| hello |
+-------+

but got但得到了

['+-+', '|h|', '|e|', '|l|', '|l|', '|o|', '+-+'].

When you use list comprehension you get the output as list , as seen by your output, to see the new line character you need to print the result当您使用列表理解时,您将获得输出为 list ,如您的输出所示,以查看打印result所需的换行符

And also you are using columns to multiply - which is only one for all strings.而且您还使用columns进行乘法-对于所有字符串,这只是一个。 Change it to `row'将其更改为“行”

def border_msg(msg):
    row = len(msg)
    h = ''.join(['+'] + ['-' *row] + ['+'])
    result= h + '\n'"|"+msg+"|"'\n' + h
    print(result)

Output输出

>>> border_msg('hello')
+-----+
|hello|
+-----+
>>> 

Here's a mildly elaborated function for printing a message-box with optional title and indent which centers around the longest line:这是一个精心设计的函数,用于打印带有可选标题和缩进的消息框,以最长的行为中心:

def print_msg_box(msg, indent=1, width=None, title=None):
    """Print message-box with optional title."""
    lines = msg.split('\n')
    space = " " * indent
    if not width:
        width = max(map(len, lines))
    box = f'╔{"═" * (width + indent * 2)}╗\n'  # upper_border
    if title:
        box += f'║{space}{title:<{width}}{space}║\n'  # title
        box += f'║{space}{"-" * len(title):<{width}}{space}║\n'  # underscore
    box += ''.join([f'║{space}{line:<{width}}{space}║\n' for line in lines])
    box += f'╚{"═" * (width + indent * 2)}╝'  # lower_border
    print(box)

Demo:演示:

print_msg_box('\n~ PYTHON ~\n')
╔════════════╗
║            ║
║ ~ PYTHON ~ ║
║            ║
╚════════════╝
print_msg_box('\n~ PYTHON ~\n', indent=10)
╔══════════════════════════════╗
║                              ║
║          ~ PYTHON ~          ║
║                              ║
╚══════════════════════════════╝
print_msg_box('\n~ PYTHON ~\n', indent=10, width=20)
╔════════════════════════════════════════╗
║                                        ║
║          ~ PYTHON ~                    ║
║                                        ║
╚════════════════════════════════════════╝
msg = "And I thought to myself,\n" \
      "'a little fermented curd will do the trick',\n" \
      "so, I curtailed my Walpoling activites, sallied forth,\n" \
      "and infiltrated your place of purveyance to negotiate\n" \
      "the vending of some cheesy comestibles!"

print_msg_box(msg=msg, indent=2, title='In a nutshell:')
╔══════════════════════════════════════════════════════════╗
║  In a nutshell:                                          ║
║  --------------                                          ║
║  And I thought to myself,                                ║
║  'a little fermented curd will do the trick',            ║
║  so, I curtailed my Walpoling activites, sallied forth,  ║
║  and infiltrated your place of purveyance to negotiate   ║
║  the vending of some cheesy comestibles!                 ║
╚══════════════════════════════════════════════════════════╝

The above answers are good if you only want to print one line, however, they break down for multiple lines.如果您只想打印一行,则上述答案很好,但是,它们会分解为多行。 If you want to print multiple lines you can use the following:如果要打印多行,可以使用以下命令:

def border_msg(msg):
    l_padding = 2
    r_padding = 4

    msg_list = msg.split('\n')
    h_len = max([len(m) for m in msg]) + sum(l_padding, r_padding)
    top_bottom = ''.join(['+'] + ['-' * h_len] + ['+'])
    result = top_bottom

    for m in msg_list:
        spaces = h_len - len(m)
        l_spaces = ' ' * l_padding
        r_spaces = ' ' * (spaces - l_padding)
        result += '\n' + '|' + l_spaces + m + r_spaces + '|\n'

    result += top_bottom
    return result

This will print a box around a multi-line string that is left-aligned with the specified padding values determining the positioning of the text in the box.这将在多行字符串周围打印一个框,该框与指定的填充值左对齐,确定文本在框中的位置。 Adjust accordingly.相应调整。

If you would like to center the text, just use one padding value and interleave half of the spaces value from the spaces = h_len - len(m) line between the pipes.如果您想将文本居中,只需使用一个填充值并在管道之间插入spaces = h_len - len(m)行中的空格值的一半。

you can do:你可以做:

print("+-------------+")
print("| Hello World |")
print("+-------------+") 

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM