2 player CLI Tic-Tac-Toe game in python
Matrix indexing

The display function is a handful. It's often better to use a matrix library like numpy to allow better indexing features. For instance,

import numpy as np
one_thru_nine = list(range(1,10))
print(one_thru_nine)
matrix = np.array(one_thru_nine).reshape(3,3)
print(matrix)
print(matrix[0, 1])
print(matrix[1, 1])
print(matrix[2, 2])


[1, 2, 3, 4, 5, 6, 7, 8, 9]
[[1 2 3]
 [4 5 6]
 [7 8 9]]
2
5
9


(Disclaimer: np.array(one_thru_nine).reshape(3,3) is not really an ideal way of initializing numpy arrays, it's just for demonstration purposes.)

Of course, do beware of zero-indexing. 

Magic numbers

As a rule of thumb, avoid magic numbers. Try not to put raw integers into code. 

return 0 &lt; box_num &lt; 10


will be more readable as 

min_boxes, max_boxes = 0, 10
return min_boxes &lt; box_num &lt; max_boxes


Similarly, I can understand what Turn=3 does, but it's unintuitive.

If-Else statements

else:
  pass


is redundant. If you don't have anything to do when if and elif conditions fail, you don't have to add the else statement altogether -- unlike some other languages.

That is, you can just do: 

while True:
  if condition_one:
    do_something()
  elif condition_two:
    do_something_else()


Class declaration

You don't need to put parentheses next to class declarations if you are not inheriting from a super class. 

class Board():
   def __init__(self):


can just be

class Board:
   def __init__(self):


Casing

As a general rule of thumb, in classes are in PascalCase and everything else (modules, variables, functions, methods) are in snake_case. As such, from AskUser import ask_user as As should be reformatted as from ask_user import ask_user as as_as or something similar.

Similarly, things like Turn should be turn. 

Wrap your module with main

In general, if you are not declaring globals, and you declare functions that you will actually call as main (perhaps you're familiar with C or Java?) you should wrap them in a statement of

if __name__ == "__main__":
  board = Board()
  turn = randint(0,1) ... 


If you don't get into the habit of this, you'll end up executing code you don't want to when you're just importing code from other modules.

Others


I don't see the use of valid and invalid_message anywhere?