Search code examples
colorspython-3.7python-idle

How do you change the colour of text in python without importing other modules?


how could you create a print statement, such as print("Hello world") that could be a different colour (e.g. green).

Also, is there a way of doing this without needing to download new modules?


Solution

  • @epicgamer300065, here's an actual full IDLE solution that worked for me using Python 3.8.1 on win10pro, but it does NOT work in terminal.

    It is from idlecolors and since your access is limited I have included the full module needed idlecolors.py herein for your copy/paste pleasure to circumvent your inability to install.

    As you can see, the only dependencies are modules sys and random, but random is only needed for the randcol() function which you could live without if you had to.

    Here's idlecolors.py:

    import sys
    import random
    
    # This will only work in IDLE, it won't work from a command prompt
    try:
        shell_connect = sys.stdout.shell
    except AttributeError:
        print("idlecolors highlighting only works with IDLE")
        exit()
    
    # Map the colour strings to IDLE highlighting
    USE_CUSTOM_COLORS = False       # Change to True if you want to use custom colours
    
    global colormap
    
    if USE_CUSTOM_COLORS:
        colormap = {"red": "COMMENT",
                    "orange": "KEYWORD",
                    "green": "STRING",
                    "blue": "stdout",
                    "purple": "BUILTIN",
                    "black": "SYNC",
                    "brown": "console",
    
                    "user1": "DEFINITION",
                    "user2": "sel",
                    "user3": "hit",
                    "user4": "ERROR",
                    "user5": "stderr"}
    else:
        colormap = {"red": "COMMENT",
                    "orange": "KEYWORD",
                    "green": "STRING",
                    "blue": "stdout",
                    "purple": "BUILTIN",
                    "black": "SYNC",
                    "brown": "console"}
    
    # ---------------------------
    # Functions
    # ---------------------------
    
    # Like the print() function but will allow you to print colours
    def printc(text, end="\n"):
        # Parse the text provided to find {text:color} and replace with the colour. Any text not encompassed in braces
        # will be printed as black by default.
        buff = ""
        for char in text:
            if char == "{":
                # Write current buffer in black and clear
                shell_connect.write(buff, colormap["black"])
                buff = ""
            elif char == "}":
                # Write current buffer in color specified and clear
                tag_write = buff.split(":")
                shell_connect.write(tag_write[0], tag_write[1])
                buff = ""
            else:
                # Add this char to the buffer
                buff += char
    
        # Write the chosen end character (defaults to newline like print)
        sys.stdout.write( end )
    
    
    # Individual colour functions
    def red(text):
        return "{"+ text + ":" + colormap["red"] + "}"
    
    def orange(text):
        return "{"+ text  + ":" + colormap["orange"] + "}"
    
    def green(text):
        return "{"+ text + ":" + colormap["green"] + "}"
    
    def blue(text):
        return "{"+ text  + ":" + colormap["blue"] + "}"
    
    def purple(text):
        return "{"+ text + ":" + colormap["purple"] + "}"
    
    def black(text):
        return "{"+ text  + ":" + colormap["black"] + "}"
    
    def brown(text):
        return "{"+ text + ":" + colormap["brown"] + "}"
    
    def randcol(text):
        color = random.choice(list(colormap.keys()))
        return "{"+ text + ":" + colormap[color] + "}"
    
    # User defined colours
    def user1(text):
        return "{"+ text + ":" + colormap["user1"] + "}"
    
    def user2(text):
        return "{"+ text + ":" + colormap["user2"] + "}"
    
    def user3(text):
        return "{"+ text + ":" + colormap["user3"] + "}"
    
    def user4(text):
        return "{"+ text + ":" + colormap["user4"] + "}"
    
    def user5(text):
        return "{"+ text + ":" + colormap["user5"] + "}"
    

    And here is how you would use it:

    from idlecolors import *
    printc( red("Red text") )
    printc( "If you add " + red("red") + " to " + blue("blue") + ", you get " + purple("purple") )
    
    # Print a line in a random colour
    printc( randcol("This is a random colour") )
    
    # Print each word in a random colour
    mytext = "This is a random piece of text which I want to print in random colours"
    mytext = mytext.split(" ")
    for word in mytext:
        printc(randcol(word), end=" ")
    

    The colors available are red(), orange(), green(), blue(), purple(), black(), brown(), and you can use randcol() for a random color from this selection.