pythontermcolor

Issues with box drawing character interface


I am working on a terminal music player. I've almost made box-drawing interface. Screenshot]

As you can see, I have broken right border ("║"). I tried to make it. But something is wrong and it doesn't work. Take a look at my code:

import vlc
import glob
import sys
from termcolor import colored, cprint
def scanfolder(directory, extension):
    sfile = glob.glob(f'{directory}*.{extension}')
    box1 = colored("║", "yellow", attrs=["bold"])
    box2 = colored("╚", "yellow", attrs=["bold"])
    box3 = colored("═", "yellow", attrs=["bold"])
    box4 = colored("╔", "yellow", attrs=["bold"])
    box5 = colored("╗", "yellow", attrs=["bold"])
    box6 = colored("╝", "yellow", attrs=["bold"])
    x = len(directory)
    y = len(extension) + 1
    z = len(max(sfile, key=len))
    z = z - x - y + 3
    box3 = box3 * z
    print(box4 + box3 + box5)
    for i, track in enumerate(sfile):
        trackEn = box1 + str(i + 1) + ". " + str(track[x:-y])
        indent = " "
        mFactor = z - len(trackEn) #z is the most long track name length, len(trackEn) is any other track's length
        indent = indent * mFactor #space * mFactor, used to align box drawing character ║, so they can make one solid wall
        print(trackEn + indent + box1) #track name + aligning spaces + ║
    print(box2 + box3 + box6)
sext = input("Choose extension: ")
sdir = input("Choose directory: ")
cprint("""
________          ________ ______                 
___  __ \_____  _____  __ \___  /______ ______  __
__  /_/ /__  / / /__  /_/ /__  / _  __ `/__  / / /
_  ____/ _  /_/ / _  ____/ _  /  / /_/ / _  /_/ / 
/_/      _\__, /  /_/      /_/   \__,_/  _\__, /  
         /____/                          /____/   """, "yellow", "on_blue", attrs=["bold"])
scanfolder(sdir, sext)
chooseTrack = colored("Choose track", "green", attrs=["bold"])
colon = colored(": ", "green", attrs=["bold", "blink"])
trackn = input(chooseTrack + colon)

Solution

  • Question: Issues with box drawing character using termcolor.colored symbols.

    The problem are the box1 variable which is returned from termcolor.colored.
    This string box1 are already formated with the ANSI Color sequence which is, e.g. \E231║.
    Therefore the len(trackEn) gives 6 more which results in mFactor = z - len(trackEn) == -6.
    Your mFactor becomes Negative, therefore no indent.



    Change the following:

        for i, track in enumerate(sfile):
            trackEn = str(i + 1) + ". " + str(track[x:-y])
    
            # z is the most long track name length, len(trackEn) is any other track's length
            mFactor = z - len(trackEn)
    
            # space * mFactor, used to align box drawing character ║, 
            # so they can make one solid wall 
            indent = " " * mFactor 
    
            # ║ + track name + aligning spaces + ║
            print(box1 + trackEn + indent + box1)