Python Forum
Need help with 'str' object is not callable error.
Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Need help with 'str' object is not callable error.
#1
I need some help. Whenever I try to run the code, it says that the showcase() and line 696 with the pot=input() is a 'str' object is not callable error. Can someone help me debug? Thanks!
# Make a website to showcase all my projects.
def player():
    # This is a 2p tic tac toe game
    from enum import Enum

    class GridSquare():
        state = ""
        pos = 0

        def __init__(self, x):
            self.pos = x
            self.state = "-1"

        def draw_space(self):
            if self.state == "1":
                return 'X'
            if self.state == "0":
                return 'O'
            return str(self.pos)[0]

    class TicTacToe():
        cols = 3
        rows = 3
        total_turns = 0
        winner = -1

        class game_state(Enum):
            OVER = 0
            RUNNING = 1

        current_state = game_state.OVER
        board = None

        def setup(self):
            self.board = [[None] * self.cols for _ in range(self.rows)]
            position = 1
            r = 0
            while r < self.rows:
                c = 0
                while c < self.cols:
                    self.board[r][c] = GridSquare(position)
                    position += 1
                    c += 1
                r += 1
            TicTacToe.current_state = TicTacToe.game_state.RUNNING
            self.play_game()

        def play_game(self):
            while TicTacToe.current_state == TicTacToe.game_state.RUNNING:
                self.display_board()
                self.make_move()
            if TicTacToe.current_state == TicTacToe.game_state.OVER:
                self.display_game_over()

        def display_board(self):
            print(
                "\n  " + str(self.board[0][0].draw_space()) + " | " + str(self.board[0][1].draw_space()) + "  | " + str(
                    self.board[0][2].draw_space()))
            print(" ___|____|___ ")
            print(
                "\n  " + str(self.board[1][0].draw_space()) + " | " + str(self.board[1][1].draw_space()) + "  | " + str(
                    self.board[1][2].draw_space()))
            print(" ___|____|___ ")
            print(
                "\n  " + str(self.board[2][0].draw_space()) + " | " + str(self.board[2][1].draw_space()) + "  | " + str(
                    self.board[2][2].draw_space()))

        def make_move(self):
            print("Player " + str(self.get_player()) + " choose a pos: ")
            spot = input()
            i = 0
            while i < self.cols:
                j = 0
                while j < self.rows:
                    if str(self.board[i][j].state) == "-1" and str(self.board[i][j].pos) == spot:
                        self.board[i][j].state = str(self.total_turns % 2)
                        self.total_turns += 1
                        self.check_win(i, j, str(self.board[i][j].state))
                    j += 1
                i += 1

        def display_game_over(self):
            self.display_board()
            print('Game Over!')
            if self.winner == '1':
                print('X Wins!')
            if self.winner == '0':
                print('O Wins!')
            if self.total_turns == 9 and not (self.winner == "1") and not self.winner == "0":
                print('Tie Game!')

        def get_player(self):
            if self.total_turns % 2 == 0:
                return 'O'
            return 'X'

        def check_win(self, x, y, turn):
            col_win = 0
            row_win = 0
            diag1_win = 0
            diag2_win = 0
            i = 0

            while i < 3:
                if self.board[x][i].state == turn:
                    col_win += 1

                if self.board[i][y].state == turn:
                    row_win += 1
                if self.board[i][i].state == turn:
                    diag1_win += 1
                if self.board[i][2 - i].state == turn:
                    diag2_win += 1
                i += 1
            if col_win == 3 or row_win == 3 or diag1_win == 3 or diag2_win == 3:
                self.winner = turn
                if self.winner != -1:
                    TicTacToe.current_state = TicTacToe.game_state.OVER
            if self.total_turns == 9:
                TicTacToe.current_state = TicTacToe.game_state.OVER
            # Check for a win in every direction.

    gameplay = TicTacToe()
    gameplay.setup()


def ai():
    # player vs. computer tic tac toe game!!!!
    from enum import Enum
    import random

    class GridSquare():
        state = ""
        pos = 0

        def __init__(self, x):
            self.pos = x
            self.state = "-1"

        def draw_space(self):
            if self.state == "1":
                return 'X'
            if self.state == "0":
                return 'O'
            return str(self.pos)[0]

    class TicTacToe():
        cols = 3
        rows = 3
        total_turns = 0
        winner = -1

        class game_state(Enum):
            OVER = 0
            RUNNING = 1

        current_state = game_state.OVER
        board = None

        def setup(self):
            self.board = [[None] * self.cols for _ in range(self.rows)]
            position = 1
            r = 0
            while r < self.rows:
                c = 0
                while c < self.cols:
                    self.board[r][c] = GridSquare(position)
                    position += 1
                    c += 1
                r += 1
            TicTacToe.current_state = TicTacToe.game_state.RUNNING
            self.play_game()

        def play_game(self):
            while TicTacToe.current_state == TicTacToe.game_state.RUNNING:
                self.display_board()
                self.make_move()
            if TicTacToe.current_state == TicTacToe.game_state.OVER:
                self.display_game_over()

        def display_board(self):
            print(
                "\n  " + str(self.board[0][0].draw_space()) + " | " + str(self.board[0][1].draw_space()) + "  | " + str(
                    self.board[0][2].draw_space()))
            print(" ___|____|___ ")
            print(
                "\n  " + str(self.board[1][0].draw_space()) + " | " + str(self.board[1][1].draw_space()) + "  | " + str(
                    self.board[1][2].draw_space()))
            print(" ___|____|___ ")
            print(
                "\n  " + str(self.board[2][0].draw_space()) + " | " + str(self.board[2][1].draw_space()) + "  | " + str(
                    self.board[2][2].draw_space()))

        def make_move(self):
            if str(self.get_player()) == 'X':
                ai = random.randint(1, 9)
                print("Player X chose " + str(ai))
                i = 0
                while i < self.cols:
                    j = 0
                    while j < self.rows:
                        if str(self.board[i][j].state) == "-1" and str(self.board[i][j].pos) == str(ai):
                            self.board[i][j].state = str(self.total_turns % 2)
                            self.total_turns += 1
                            self.check_win(i, j, str(self.board[i][j].state))
                            self.display_board()
                        j += 1
                    i += 1

            if str(self.get_player()) == "O":
                print("Player " + str(self.get_player()) + " choose a pos: ")
                spot = input()
                i = 0
                while i < self.cols:
                    j = 0
                    while j < self.rows:
                        if str(self.board[i][j].state) == "-1" and str(self.board[i][j].pos) == spot:
                            self.board[i][j].state = str(self.total_turns % 2)
                            self.total_turns += 1
                            self.check_win(i, j, str(self.board[i][j].state))
                        j += 1
                    i += 1

        def display_game_over(self):
            self.display_board()
            print('Game Over!')
            if self.winner == '1':
                print('X Wins!')
            if self.winner == '0':
                print('O Wins!')
            if self.total_turns == 9 and not (self.winner == "1") and not self.winner == "0":
                print('Tie Game!')

        def get_player(self):
            if self.total_turns % 2 == 0:
                return 'O'
            return 'X'

        def check_win(self, x, y, turn):
            col_win = 0
            row_win = 0
            diag1_win = 0
            diag2_win = 0
            i = 0

            while i < 3:
                if self.board[x][i].state == turn:
                    col_win += 1

                if self.board[i][y].state == turn:
                    row_win += 1
                if self.board[i][i].state == turn:
                    diag1_win += 1
                if self.board[i][2 - i].state == turn:
                    diag2_win += 1
                i += 1
            if col_win == 3 or row_win == 3 or diag1_win == 3 or diag2_win == 3:
                self.winner = turn
                if self.winner != -1:
                    TicTacToe.current_state = TicTacToe.game_state.OVER
            if self.total_turns == 9:
                TicTacToe.current_state = TicTacToe.game_state.OVER
            # Check for a win in every direction.

    gameplay = TicTacToe()
    gameplay.setup()


def tictactoe():
    print('Welcome to tic tac toe, would you like to play versus another player or play vs ai?(player/ai)')
    choice = input()
    if choice == 'player':
        player()
    elif choice == 'ai':
        ai()
    elif choice == 'quit':
        active = False
    else:
        print('Please enter a valid statement.')


def caesarcypher():
    letters = [
        'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J',
        'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T',
        'U', 'V', 'W', 'X', 'Y', 'Z']

    # make functions for each area

    # ideas:
    # encrypt:
    # take index of each inputted letter
    # add key
    # print encrypted message
    # decrypt:
    # take index of each inputted letter
    # subtract key from each index
    # print decrypted message
    def encrypt():
        e_str = ""
        for i in encrypt_message:
            index = letters.index(i)
            index = int(index)
            index = index + key
            index = index % 26
            e_str += letters[index]
        print(e_str)

    def decrypt():
        e_str = ""
        for i in encrypt_message:
            index = letters.index(i)
            index = int(index)
            index = index - key
            index = index % 26
            e_str += letters[index]
        print(e_str)

    choice = input('Welcome to Caesar Cypher!  Would you like to encrypt or decrypt?')

    active = True
    while active:
        if choice == 'encrypt':
            key = input('Please enter the key!')
            key = int(key)
            encrypt_message = input('What is the message you want to encrypt in all caps?')
            encrypt()
            active = False
        else:
            # this is decrypt!
            key = input('Please enter the key!')
            key = int(key)
            encrypt_message = input('What is the message you want to encrypt in all caps?')
            decrypt()
            active = False


def guessinggame():
    import random

    # guess a number game
    # needs the following parts:
    # tell if too high or too low
    # generate a number between 100
    # do this in 7 tries
    # have a way to quit
    print("Welcome to the number guessing game!")
    print("Try to guess the number from 1 to 100 in 7 tries!  Good luck!  Type anything larger than 100 to exit!")

    counter = 0
    jackpot = random.randint(1, 100)
    guessed = False

    while not guessed:

        number = input("Enter a number from 1-100!")
        number = int(number)

        if counter > 6:
            print('You have run out of tries!  Good luck next time!')
            guessed = True

        if number == jackpot:
            print('Congrats! You win!')
            guessed = True

        elif number < jackpot:
            print('Too low, try again!')
            counter += 1

        elif number > 100:
            print('Thanks for playing, come back soon!')
            guessed = True

        else:
            print('Too high, try again!')
            counter += 1


def mazerunner():
    import pygame

    BLACK = (0, 0, 0)
    WHITE = (255, 255, 255)
    BLUE = (0, 0, 255)
    GREEN = (0, 255, 0)
    RED = (255, 0, 0)
    PURPLE = (255, 0, 255)

    class Wall(pygame.sprite.Sprite):
        """This class represents the bar at the bottom that the player controls """

        def __init__(self, x, y, width, height, color):
            """ Constructor function """

            # Call the parent's constructor
            super().__init__()

            # Make a BLUE wall, of the size specified in the parameters
            self.image = pygame.Surface([width, height])
            self.image.fill(color)

            # Make our top-left corner the passed-in location.
            self.rect = self.image.get_rect()
            self.rect.y = y
            self.rect.x = x

    class Player(pygame.sprite.Sprite):
        """ This class represents the bar at the bottom that the
        player controls """

        # Set speed vector
        change_x = 0
        change_y = 0

        def __init__(self, x, y):
            """ Constructor function """

            # Call the parent's constructor
            super().__init__()

            # Set height, width
            self.image = pygame.Surface([15, 15])
            self.image.fill(WHITE)

            # Make our top-left corner the passed-in location.
            self.rect = self.image.get_rect()
            self.rect.y = y
            self.rect.x = x

        def changespeed(self, x, y):
            """ Change the speed of the player. Called with a keypress. """
            self.change_x += x
            self.change_y += y

        def move(self, walls):
            """ Find a new position for the player """

            # Move left/right
            self.rect.x += self.change_x

            # Did this update cause us to hit a wall?
            block_hit_list = pygame.sprite.spritecollide(self, walls, False)
            for block in block_hit_list:
                # If we are moving right, set our right side to the left side of
                # the item we hit
                if self.change_x > 0:
                    self.rect.right = block.rect.left
                else:
                    # Otherwise if we are moving left, do the opposite.
                    self.rect.left = block.rect.right

            # Move up/down
            self.rect.y += self.change_y

            # Check and see if we hit anything
            block_hit_list = pygame.sprite.spritecollide(self, walls, False)
            for block in block_hit_list:

                # Reset our position based on the top/bottom of the object.
                if self.change_y > 0:
                    self.rect.bottom = block.rect.top
                else:
                    self.rect.top = block.rect.bottom

    class Room(object):
        """ Base class for all rooms. """

        # Each room has a list of walls, and of enemy sprites.
        wall_list = None
        enemy_sprites = None

        def __init__(self):
            """ Constructor, create our lists. """
            self.wall_list = pygame.sprite.Group()
            self.enemy_sprites = pygame.sprite.Group()

    class Room1(Room):
        """This creates all the walls in room 1"""

        def __init__(self):
            super().__init__()
            # Make the walls. (x_pos, y_pos, width, height)

            # This is a list of walls. Each is in the form [x, y, width, height]
            walls = [[0, 0, 20, 250, WHITE],
                     [0, 350, 20, 250, WHITE],
                     [780, 0, 20, 250, WHITE],
                     [780, 350, 20, 250, WHITE],
                     [20, 0, 760, 20, WHITE],
                     [20, 580, 760, 20, WHITE],
                     [390, 50, 20, 500, BLUE],
                     [200, 50, 20, 500, PURPLE],
                     [295, 50, 20, 500, GREEN],
                     [485, 50, 20, 500, RED],
                     [100, 300, 500, 20, PURPLE],
                     [240, 50, 20, 300, BLUE]
                     ]

            # Loop through the list. Create the wall, add it to the list
            for item in walls:
                wall = Wall(item[0], item[1], item[2], item[3], item[4])
                self.wall_list.add(wall)

    class Room2(Room):
        """This creates all the walls in room 2"""

        def __init__(self):
            super().__init__()

            walls = [[0, 0, 20, 250, RED],
                     [0, 350, 20, 250, RED],
                     [780, 0, 20, 250, RED],
                     [780, 350, 20, 250, RED],
                     [20, 0, 760, 20, RED],
                     [20, 580, 760, 20, RED],
                     [190, 50, 20, 500, GREEN],
                     [590, 50, 20, 500, GREEN],
                     [150, 300, 500, 20, BLUE],
                     [150, 200, 250, 20, PURPLE],
                     [500, 200, 250, 20, PURPLE]
                     ]

            for item in walls:
                wall = Wall(item[0], item[1], item[2], item[3], item[4])
                self.wall_list.add(wall)

    class Room3(Room):
        """This creates all the walls in room 3"""

        def __init__(self):
            super().__init__()

            walls = [[0, 0, 20, 250, PURPLE],
                     [0, 350, 20, 250, PURPLE],
                     [780, 0, 20, 250, PURPLE],
                     [780, 350, 20, 250, PURPLE],
                     [20, 0, 760, 20, PURPLE],
                     [20, 580, 760, 20, PURPLE],
                     [100, 300, 600, 20, BLUE]
                     ]

            for item in walls:
                wall = Wall(item[0], item[1], item[2], item[3], item[4])
                self.wall_list.add(wall)

            for x in range(100, 800, 100):
                for y in range(50, 451, 300):
                    wall = Wall(x, y, 20, 200, RED)
                    self.wall_list.add(wall)

            for x in range(150, 700, 100):
                wall = Wall(x, 200, 20, 200, WHITE)
                self.wall_list.add(wall)

    def main():
        """ Main Program """

        # Call this function so the Pygame library can initialize itself
        pygame.init()

        # Create a 800x600 sized screen
        screen = pygame.display.set_mode([800, 600])

        # Set the title of the window
        pygame.display.set_caption('Maze Runner')

        # Create the player paddle object
        player = Player(50, 50)
        movingsprites = pygame.sprite.Group()
        movingsprites.add(player)

        rooms = []

        room = Room1()
        rooms.append(room)

        room = Room2()
        rooms.append(room)

        room = Room3()
        rooms.append(room)

        current_room_no = 0
        current_room = rooms[current_room_no]

        clock = pygame.time.Clock()

        done = False

        while not done:

            # --- Event Processing ---

            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    done = True

                if event.type == pygame.KEYDOWN:
                    if event.key == pygame.K_LEFT:
                        player.changespeed(-5, 0)
                    if event.key == pygame.K_RIGHT:
                        player.changespeed(5, 0)
                    if event.key == pygame.K_UP:
                        player.changespeed(0, -5)
                    if event.key == pygame.K_DOWN:
                        player.changespeed(0, 5)

                if event.type == pygame.KEYUP:
                    if event.key == pygame.K_LEFT:
                        player.changespeed(5, 0)
                    if event.key == pygame.K_RIGHT:
                        player.changespeed(-5, 0)
                    if event.key == pygame.K_UP:
                        player.changespeed(0, 5)
                    if event.key == pygame.K_DOWN:
                        player.changespeed(0, -5)

            # --- Game Logic ---

            player.move(current_room.wall_list)

            if player.rect.x < -15:
                if current_room_no == 0:
                    current_room_no = 2
                    current_room = rooms[current_room_no]
                    player.rect.x = 790
                elif current_room_no == 2:
                    current_room_no = 1
                    current_room = rooms[current_room_no]
                    player.rect.x = 790
                else:
                    current_room_no = 0
                    current_room = rooms[current_room_no]
                    player.rect.x = 790

            if player.rect.x > 801:
                if current_room_no == 0:
                    current_room_no = 1
                    current_room = rooms[current_room_no]
                    player.rect.x = 0
                elif current_room_no == 1:
                    current_room_no = 2
                    current_room = rooms[current_room_no]
                    player.rect.x = 0
                else:
                    current_room_no = 0
                    current_room = rooms[current_room_no]
                    player.rect.x = 0

            # --- Drawing ---
            screen.fill(BLACK)

            movingsprites.draw(screen)
            current_room.wall_list.draw(screen)

            pygame.display.flip()

            clock.tick(60)

        pygame.quit()

    if __name__ == "__main__":
        main()


def fortuneteller():
    # fortune teller game
    import random

    active = True

    while active:
        fortune = random.randint(1, 10)
        fortune = int(fortune)

        roll = input("\nWelcome to your fortune teller! I know how good your future will be, based on your luck! \n\
        If you're lucky, you'll have a lucky outcome. \n\
        Tell me to 'roll' when you're ready to roll the dice for your future.")

        if roll == 'roll':
            print('You have rolled a ' + str(fortune) + '. ')
            if fortune < 4:
                print('You have really bad luck today.')
            elif fortune < 7:
                print('You have average luck today.')
            else:
                print('You have extremely good luck!  Might be a good time to bet something. :)')
        else:
            print('Tell me to roll when you are ready, nothing else!')


def showcase():
    print("Choose a project below to play according to it's order number starting from 1.")
    print('1. Tic Tac Toe\n2. Caesar Cypher\n3. Guessing Game\n4. Maze Runner\n5. Fortune Teller')
    pot = input()
    if pot == 1:
        tictactoe()
    elif pot == 2:
        caesarcypher()
    elif pot == 3:
        guessinggame()
    elif pot == 4:
        mazerunner()
    elif pot == 5:
        fortuneteller()
    elif pot == 'quit':
        active = False
    else:
        print('Please enter a valid number or enter quit to exit the program.')


active = True
print("Welcome to the hub, please enter the password.\nThe hint is my favorite animal in plural lowercase.")
while active:
    input = input('Enter the password here:')
    if input == 'cats':
        print('Welcome valid user.')
        print('Enter quit at any time to exit the program.')
        showcase()
    else:
        print('Incorrect, please try again.')
        continue
Reply
#2
try in python interpreter:
>>> x = input()
1
>>> x
'1'
>>>
in order to test the way you are testing, you need to turn x to an integer
>>> x =int(input())
1
>>> x
1
>>> if x == 1:
...     print("x is equal to 1")
... 
x is equal to 1
>>> 
>>> # another way:
>>> x = input()
1
>>> if x == '1':
...     print("x is equal to 1")
... 
x is equal to 1
Reply
#3
The problem is line 716:
   input = input('Enter the password here:')
From the moment this line is executed, the input() function is redefined. It becomes a string with the value of the given password. So from then on, calling input() will give the error: "'str' object is not callable".

Solution: never use reserved words or defined functions as a variable.
Reply
#4
ibreeden, good catch.
Reply
#5
Oh ok, I see now. Thank you so much!
Reply


Possibly Related Threads…
Thread Author Replies Views Last Post
  error in class: TypeError: 'str' object is not callable akbarza 2 524 Dec-30-2023, 04:35 PM
Last Post: deanhystad
  TypeError: 'NoneType' object is not callable akbarza 4 1,020 Aug-24-2023, 05:14 PM
Last Post: snippsat
  [NEW CODER] TypeError: Object is not callable iwantyoursec 5 1,389 Aug-23-2023, 06:21 PM
Last Post: deanhystad
  TypeError: 'float' object is not callable #1 isdito2001 1 1,089 Jan-21-2023, 12:43 AM
Last Post: Yoriz
  'SSHClient' object is not callable 3lnyn0 1 1,177 Dec-15-2022, 03:40 AM
Last Post: deanhystad
  TypeError: 'float' object is not callable TimofeyKolpakov 3 1,475 Dec-04-2022, 04:58 PM
Last Post: TimofeyKolpakov
  API Post issue "TypeError: 'str' object is not callable" makeeley 2 1,935 Oct-30-2022, 12:53 PM
Last Post: makeeley
  Merge htm files with shutil library (TypeError: 'module' object is not callable) Melcu54 5 1,607 Aug-28-2022, 07:11 AM
Last Post: Melcu54
  Error in Int object is not subscript-able. kakut 2 1,190 Jul-06-2022, 08:31 AM
Last Post: ibreeden
  [split] TypeError: 'int' object is not callable flash77 4 2,775 Mar-21-2022, 09:44 PM
Last Post: deanhystad

Forum Jump:

User Panel Messages

Announcements
Announcement #1 8/1/2020
Announcement #2 8/2/2020
Announcement #3 8/6/2020