【问题标题】:ASCII Characters Text AlignASCII 字符文本对齐
【发布时间】:2018-07-31 06:40:05
【问题描述】:

我正在用 python 编写一个非常小且基本的基于文​​本的冒险游戏,我希望能够对齐我的标题(在 ASCII 中) 我查了一下,要么没看懂,要么没用。

这是 ASCII:

  ________            ___                         
 /_  __/ /_  ___     /   |  ________  ____  ____ _
  / / / __ \/ _ \   / /| | / ___/ _ \/ __ \/ __ `/
 / / / / / /  __/  / ___ |/ /  /  __/ / / / /_/ / 
/_/ /_/ /_/\___/  /_/  |_/_/   \___/_/ /_/\__,_/  

(我知道这不是很有创意)

我想让它与中心对齐,可以吗?

【问题讨论】:

    标签: python python-2.7 ascii


    【解决方案1】:

    您可以使用str.center 方法。下面的代码假定屏幕宽度为 80 个字符:

    s = '''  ________            ___                         
     /_  __/ /_  ___     /   |  ________  ____  ____ _
      / / / __ \/ _ \   / /| | / ___/ _ \/ __ \/ __ `/
     / / / / / /  __/  / ___ |/ /  /  __/ / / / /_/ / 
    /_/ /_/ /_/\___/  /_/  |_/_/   \___/_/ /_/\__,_/ '''
    print('\n'.join(l.center(80) for l in s.splitlines()))
    

    这个输出:

                     ________            ___                                        
                    /_  __/ /_  ___     /   |  ________  ____  ____ _               
                     / / / __ \/ _ \   / /| | / ___/ _ \/ __ \/ __ `/               
                    / / / / / /  __/  / ___ |/ /  /  __/ / / / /_/ /                
                   /_/ /_/ /_/\___/  /_/  |_/_/   \___/_/ /_/\__,_/                 
    

    【讨论】:

      【解决方案2】:

      您可以逐行添加使文本居中所需的空白数量。

      这是一种方法,您必须提供要居中的文本以及可用的宽度:

      def align_center(text, width):
          lext = text.split('\n')
          for line in lext:
              assert len(line) < width, 'insufficient width'
          max_w = max(len(line) for line in lext)
          res = []
          for line in lext:
              res.append(' ' * ((width - max_w) // 2))
              res.append(line)
              res.append('\n')
          return ''.join(res)
      
      
      text = """  ________            ___                         
       /_  __/ /_  ___     /   |  ________  ____  ____ _
        / / / __ \/ _ \   / /| | / ___/ _ \/ __ \/ __ `/
       / / / / / /  __/  / ___ |/ /  /  __/ / / / /_/ / 
      /_/ /_/ /_/\___/  /_/  |_/_/   \___/_/ /_/\__,_/  """
      
      centered = align_center(text, 90)
      print(centered)
      

      输出:

                    ________            ___                         
                   /_  __/ /_  ___     /   |  ________  ____  ____ _
                    / / / __ \/ _ \   / /| | / ___/ _ \/ __ \/ __ `/
                   / / / / / /  __/  / ___ |/ /  /  __/ / / / /_/ / 
                  /_/ /_/ /_/\___/  /_/  |_/_/   \___/_/ /_/\__,_/  
      

      【讨论】:

        【解决方案3】:

        我愿意:

        • 获取终端窗口的大小(主要是列) - linux 命令:"stty -a",windows 命令:"mode con" - 并解析cli 输出,或在此处执行此操作:How to get Linux console window width in Python

        • 获取文本的最大大小(需要最多列的行)

        • 然后:padding_left = (terminal_columns - text-max_columns) / 2 , ceil 或 floor 随意
        • 在所有文本行前添加与 padding_left 值一样多的空格

        编辑

        这是一个示例(适用于 Linux 和 Windows):

        import shutil
        import math
        
        
        def str_repeat(string, length):
            return (string * (int(length / len(string)) + 1))[:length]
        
        
        def print_center(lines_out):
            columns, rows = shutil.get_terminal_size()
            max_line_size = 0
            left_padding = 0
        
            for line in lines_out:
                if max_line_size == 0 or max_line_size < len(line):
                    max_line_size = len(line)
        
            if columns > max_line_size:
                left_padding = math.floor((columns - max_line_size) / 2)
        
            if left_padding > 0:
                for line in lines_out:
                    print(str_repeat(' ', left_padding) + line)
        
        
        lines = [
            '  ________            ___',
            ' /_  __/ /_  ___     /   |  ________  ____  ____ _',
            '  / / / __ \/ _ \   / /| | / ___/ _ \/ __ \/ __ `/',
            ' / / / / / /  __/  / ___ |/ /  /  __/ / / / /_/ /',
            '/_/ /_/ /_/\___/  /_/  |_/_/   \___/_/ /_/\__,_/'
        ]
        
        print_center(lines)
        

        输出:

                         ________            ___
                        /_  __/ /_  ___     /   |  ________  ____  ____ _
                         / / / __ \/ _ \   / /| | / ___/ _ \/ __ \/ __ `/
                        / / / / / /  __/  / ___ |/ /  /  __/ / / / /_/ /
                       /_/ /_/ /_/\___/  /_/  |_/_/   \___/_/ /_/\__,_/
        
        Process finished with exit code 0
        

        Output screenshot

        【讨论】:

        • 你能用简单的术语来表达吗?我才刚刚开始学习python。
        • 谢谢伙计,我已经决定采用不同的方法,但你的方法确实奏效了!
        【解决方案4】:

        不要自己输入 ASCII 艺术 - 使用 text2art:

        from art import *
        
        text2art("The Arena")
        

        替代方案是:

        from art import *
        
        tprint("The Arena")
        

        要居中,请执行以下操作:

        from art import *
        
        string="The Arena"
        new_string = string.center(90)
        
        tprint(new_string)
        

        或(使用 text2art 代替):

        text2art(new_string)
        

        【讨论】:

        • 这是很久以前的事了,我最终找到了 text2art 或类似的东西并使用它,要容易得多。不过,谢谢。
        • @FrancoisvanKempen 很多人更喜欢 text2art,虽然我个人最喜欢的是 tprint。
        • 我相信我使用了 colorama 和 tprint?我真的不记得了,那是 2 年前的一次评估任务。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-12-20
        • 2020-07-19
        相关资源
        最近更新 更多