How can I call a function from inside another class and use it in a new file?

Question:

I am trying to make it so I can call paddle_up and paddle_down in the second file but I can only get the function "move".

class PaddleOne(Turtle):

    def __init__(self):
        super().__init__()
        self.segments = [0]
        self.head = self.segments[0]
        self.Paddle_One()

    def Paddle_One(self):
        self.move()
        self.penup()
        self.color("white")
        self.shape("square")
        self.shapesize(stretch_wid=5, stretch_len=1)
        self.goto(x=350, y=0)
        self.head = self.segments[0]

    def move(self):
        # moving the paddle:
        def paddle_up():
            new_y = self.ycor() + 20
            self.goto(self.xcor(), new_y)

        def paddle_down():
            new_y = self.ycor() - 20
            self.goto(self.xcor(), new_y)

This is the second file that I am trying to use the functions paddle_up and paddle_down however when I run the code I get the error message "AttributeError: type object ‘PaddleOne’ has no attribute ‘paddle_up’".

from turtle import Screen
from UserPaddles import PaddleOne as PO
import time

# screen creation:
screen = Screen()
paddle = PO()

# screen setting:
screen.title("Pong Game")
screen.setup(width=800, height=600)
screen.bgcolor("black")

# key presses:
screen.listen()
screen.onkey(PO().paddle_up(), "w")
screen.onkey(PO().paddle_down(), "s")

I’ve looked for the answer elsewhere but no one seems to have the exact issue of calling a function within a function.

Asked By: joeca

||

Answers:

Get rid of the move (don’t think you need it), and then PaddleOne will have accessible attributes paddle_up & paddle_down

class PaddleOne(Turtle):

    def __init__(self):
        super().__init__()
        self.segments = [0]
        self.head = self.segments[0]
        self.Paddle_One()

    def Paddle_One(self):
        self.move()
        self.penup()
        self.color("white")
        self.shape("square")
        self.shapesize(stretch_wid=5, stretch_len=1)
        self.goto(x=350, y=0)
        self.head = self.segments[0]

  
  # moving the paddle:
  def paddle_up(self):
        new_y = self.ycor() + 20
        self.goto(self.xcor(), new_y)

  def paddle_down():
       new_y = self.ycor() - 20
       self.goto(self.xcor(), new_y)
Answered By: John-H

paddle_up and paddle_down were scoped under the move() function but you are calling as instance. Just make paddle_Up and paddle_down instance functions

class PaddleOne(Turtle):

    def __init__(self):
        super().__init__()
        self.segments = [0]
        self.head = self.segments[0]
        self.Paddle_One()

    def Paddle_One(self):
        self.move()
        self.penup()
        self.color("white")
        self.shape("square")
        self.shapesize(stretch_wid=5, stretch_len=1)
        self.goto(x=350, y=0)
        self.head = self.segments[0]


    def paddle_up(self):
        new_y = self.ycor() + 20
        self.goto(self.xcor(), new_y)

    def paddle_down(self):
        new_y = self.ycor() - 20
        self.goto(self.xcor(), new_y)
Answered By: jwillis0720
Categories: questions Tags:
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.