当一个文本不适合屏幕并返回到行时,我如何改变python的行为?

eufgjt7s  于 2022-12-10  发布在  Python
关注(0)|答案(1)|浏览(85)

我的问题有点难以解释,我做了一个程序,它将列表与最长的类名对齐,我们在This picture中看到的是我启动程序时显示的内容:S37和38与类名在同一位置,因为一旦到达屏幕边界,python就会返回到行。
现在,this是我想要的。显然,在这个例子中,我打印了空格来显示它应该是什么样子,但是程序必须适应所有的屏幕尺寸,所以这个方法根本不可行。有没有什么方法可以让所有的文本都对齐,不管屏幕尺寸是多少?
我使用的示例列表(list[x][0]是类名,list[x][1]是类):

[['2', ['bob', 'patrick', 'mike', 'jhamed', 'brook', 'gianni', 'espoir', 'igor', 'estère', 'charlotte', 'marie-charlotte', 'charlotte-marie', 'pénellope', 'cunégonde', 'félicie', "zo'", 'esmeralda', 'canada']], ['longclass', ['S1', 'S2', 'S3', 'S4', 'S5', 'S6', 'S7', 'S8', 'S9', 'S10', 'S11', 'S12', 'S13', 'S14', 'S15', 'S16', 'S17', 'S18', 'S19', 'S20', 'S21', 'S22', 'S23', 'S24', 'S25', 'S26', 'S27', 'S28', 'S29', 'S30', 'S31', 'S32', 'S33', 'S34', 'S35', 'S36', 'S37', 'S38']], ['test2', ['S1', 'S2', 'S3', 'S4', 'S6']], ['extremely long class name', ['s1', 's2', 's3', 's4']]]

这段代码我用来添加空格来对齐(用在一个程序中找到最大的类名之后):

for j in range(len(List)) :
    var = List[j]
    for i in range(length - len(List[j])) : #"length" is the number of letters in the biggest class name, with "extremely long class name" : 25
        var = var + " "
    print(j,length,length - len(List[j]),var,exemple)
5us2dqdw

5us2dqdw1#

下面是一个解决方案:

import shutil
maxWidth = shutil.get_terminal_size()[0]
buf = ''
List = [['2', ['bob', 'patrick', 'mike', 'jhamed', 'brook', 'gianni', 'espoir', 'igor', 'estère', 'charlotte', 
               'marie-charlotte', 'charlotte-marie', 'pénellope', 'cunégonde', 'félicie', "zo'", 'esmeralda', 'canada']],
        ['longclass', ['S1', 'S2', 'S3', 'S4', 'S5', 'S6', 'S7', 'S8', 'S9', 'S10', 'S11', 'S12', 'S13', 'S14',
                       'S15', 'S16', 'S17', 'S18', 'S19', 'S20', 'S21', 'S22', 'S23', 'S24', 'S25', 'S26', 'S27', 'S28', 'S29', 'S30', 'S31', 'S32', 'S33', 'S34', 'S35', 'S36', 'S37', 'S38']],
        ['test2', ['S1', 'S2', 'S3', 'S4', 'S6']], 
        ['extremely long class name', ['s1', 's2', 's3', 's4']]
       ]
classnameMaxLen = len(max( List, key=lambda L: len(L[0]))[0]) # return longest classname length

def flushBuf():
  global buf
  print( buf)
  buf = ''

def addClassnameToBuf( txt):
  global buf
  if len(buf): # Something from previous class?
    flushBuf()
  buf += txt + ': ' + ' ' * (classnameMaxLen - len(txt))
  
def addNameToBuf( txt:str):
  global buf
  
  if len(buf) + len(txt) >= maxWidth:
    flushBuf()

  if len(buf) == 0: # No classname means it's a continuation line.
    buf += (' ' * (classnameMaxLen  + len( ': ')))
    
  buf += txt

# Print column titles (optional)
addClassnameToBuf( "Class")
addNameToBuf( "Names")
for klass in List:
  addClassnameToBuf( klass[0])
  for i,name in enumerate( klass[1]):
    addNameToBuf( name + (', ' if i+1 != len(klass[1]) else ''))
flushBuf() # final flush

而结果是:

Class:                     Names
2:                         bob, patrick, mike, jhamed, 
                           brook, gianni, espoir, igor, 
                           estère, charlotte, 
                           marie-charlotte, 
                           charlotte-marie, pénellope, 
                           cunégonde, félicie, zo', 
                           esmeralda, canada
longclass:                 S1, S2, S3, S4, S5, S6, S7, 
                           S8, S9, S10, S11, S12, S13, 
                           S14, S15, S16, S17, S18, S19, 
                           S20, S21, S22, S23, S24, S25, 
                           S26, S27, S28, S29, S30, S31, 
                           S32, S33, S34, S35, S36, S37, 
                           S38
test2:                     S1, S2, S3, S4, S6
extremely long class name: s1, s2, s3, s4

使用面向对象的设计可能会有一个更优雅的解决方案。
如果您需要帮助,请随时提出。注意:在“zo”名字附近有一个多余撇号。

相关问题