Python command-line Tic Tac Toe for two humans
Avoid too much code in try blocks

The try ... except ValueError in the take_turn function wraps too many statements that it shouldn't need. Only the int(...) statement may raise a ValueError there, so it would be better to wrap only that in the try. When you wrap a large block of code, it can lead to masked errors or make defect localization harder.

Magic values

Instead of referring to the player symbols by their literals like '0' and 'X', it would be better to give them names.

Iterate over elements when possible

In this code you iterate over indexes of elements:

   for x in range(len(winning_combos)):
        score = 0
        for y in range(len(winning_combos[x])):
            if boxes[winning_combos[x][y]] == player:
                score += 1
            if score == 3:
                win = True


It would be more natural, simpler and safer to iterate over elements:

for combo in winning_combos:
    score = 0
    for index in combo:
        if boxes[index] == player:
            # ...