Tic-Tac-Toe Python 3 game
Bug: If, during the "pick a sigil" part of the game setup, player 1 simply presses &lt;ENTER&gt;, the game will play empty-string vs. "X". It looks bad.

Your code has several problems. Let's start with the most basic:


You are not using Python idiom for structuring your code. Please see this page (one of many duckduck search results) for an example and explanation. You should be using:

if __name__ == '__main__':
    play_game()


(for some value of play_game().)
You are not using descriptive names for your functions. What does func_1 do?
You are not using functions to organize your code. From about line 7 down to the definition of make_a_move you have a bunch of code that is just executed in-line. That should be a setup_game() function, or some such.
Your logic is confused. Consider this code:

#sets the players name
if (player_1 == "" or player_2 == ""):
  if (player_1 == ""):
    player_1 = "Player 1"
  if (player_2 == ""):
    player_2 = "Player 2"
else:
  pass


What are the real possibilities here? If player one's name is empty, you
need to set it:

if (player_1 == ""):
    player_1 = "Player 1"


Likewise for player 2:

if (player_2 == ""):
    player_2 = "Player 2"


All the rest of that code is just noise.
You are not using standard Python functions. Consider:

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


Is there a standard Python function that returns a range of values? Why, yes! There is!

square_values = range(1, 10) # integers, not strings
# or
square_values = map(str, range(1, 10))
# or 
square_values = [str(n) for n in range(1, 10)]

Not a code problem, but a logic problem: why use player 1 and player 2? You ask for their names, and then the sigil they should use. Why not simply call them 'Player X' and 'Player O' all the way through? You could eliminate a lot of code that way.
Your code does not have "basic elegance" of structure. This is hard to quantify, but I would say that basic elegance requires that your control structures be used in as natural a fashion as possible. Consider this:

while (status_main == True):
      func_1(player_1, player_1_pick)
      func_1(player_2, player_2_pick)


This fails on many levels. First, comparing a boolean with True in a conditional expression is stupid. It's a boolean! Just use it:

while (status_main):


Next, using parens like this is a Java/C thing. Not required, nor recommended, in Python:

while status_main:
    func_1(player_1, player_1_pick)
    func_1(player_2, player_2_pick)


Next, what does status_main even mean? How about keep_playing instead?

while keep_playing:
    func_1(player_1, player_1_pick)
    func_1(player_2, player_2_pick)


But honestly, why not do the checking in the while loop, instead of relying on a global variable set who-knows-where?

while not game_over():
    func_1(player_1, player_1_pick)
    func_1(player_2, player_2_pick)


And, since all you are doing is alternating between player X and player O, why not include that in the loop. You can use that to insert a check for a win after each turn:

curr, next = 'O', 'X'

while not game_over():
    curr, next = next, curr
    take_turn(curr)

print("Winner is", curr)  # Note that winner is in curr, if winner


There are other problems like this. Look for your no_wins variable: almost every place it gets used looks inelegant. And calling a function won't help - you really need to think how to get rid of that variable. Here's hint: simplify your code. Move some logic out of the "bottom" functions and up into the "middle" and "top" functions.