I'm building my own engine using python and pygame however my cube model is not able to be displayed correctly. This is my result after applying translation, scaling and projection matrices:

Something is wrong and I don't know what, below are the matrices I use and the function for multiplying vectors with matrices.
The cube model is correct since I was able to display it using another code.
The render function is only multiplying each vector with the translation, scaling and then projection matrices.
Projection matrix
self.aspect_ratio = screen_width/screen_height
n = 0.1
f = 100
# projection matrix
self.projection[0][0] = (1 / (math.tan(math.radians(90/2)))) / self.aspect_ratio
self.projection[0][1] = 0
self.projection[0][2] = 0
self.projection[0][3] = 0
self.projection[1][0] = 0
self.projection[1][1] = 1 / math.tan(math.radians(90/2))
self.projection[1][2] = 0
self.projection[1][3] = 0
self.projection[2][0] = 0
self.projection[2][1] = 0
self.projection[2][2] = f / (f - n)
self.projection[2][3] = (-f * n) / (f - n)
self.projection[3][0] = 0
self.projection[3][1] = 0
self.projection[3][2] = 1
self.projection[3][3] = 0
Translation matrix
self.translation = [
[1, 0, 0, 50],
[0, 1, 0, 50],
[0, 0, 1, 0],
[0, 0, 0, 1]
]
Scaling matrix
scale = 50
self.scaling = [
[scale, 0, 0, 0],
[0, scale, 0, 0],
[0, 0, scale, 0],
[0, 0, 0, 1]
]
Function for multiplying vectors with matrices
def Matrix_MultiplyVector(self, i, m):
vx = i[0] * m[0][0] + i[1] * m[0][1] + i[2] * m[0][2] + m[0][3]
vy = i[0] * m[1][0] + i[1] * m[1][1] + i[2] * m[1][2] + m[1][3]
vz = i[0] * m[2][0] + i[1] * m[2][1] + i[2] * m[2][2] + m[2][3]
vw = i[0] * m[3][0] + i[1] * m[3][1] + i[2] * m[3][2] + m[3][3]
if vw != 0:
vx /= vw
vy /= vw
vz /= vw
return [vx,vy,vz,1]