Rostyslav23
@Rostyslav23
Начинающий программист на Python и C++

Ошибка: TypeError: argument 1 must be pygame.Surface, not function. Как исправить?

Перелазил много сайтов, так и не нашел ответ.

Полный код ошибки:
Traceback (most recent call last):
File "main.py", line 52, in
win.blit(gpic, (gx, gy))
TypeError: argument 1 must be pygame.Surface, not function


Вот код Main.py:
import pygame
from GrassLog import grass

DisplayX = 500
DisplayY = 250

pygame.init()
win = pygame.display.set_mode((DisplayX, DisplayY))

pygame.display.set_caption("Tetra")

x = 60
y = 50
widht = 50
height = 50
speed = 5
FPS = 65

person = pygame.image.load('Image\\pers.png')
gpic = grass.pic

gx = grass.X
gy = grass.Y


run = True

while run:
	pygame.time.delay(50)
	for event in pygame.event.get():
		if event.type == pygame.QUIT:
			run = False
	
	keys = pygame.key.get_pressed()

	if keys[pygame.K_LEFT] and x > 1:
		x -= speed
	
	if keys[pygame.K_RIGHT] and x < (DisplayX - widht - 1):
		x += speed

	if keys[pygame.K_UP] and y > 1:
		y -= speed

	if keys[pygame.K_DOWN] and y < (DisplayY - height - 5):
		y += speed


	win.fill((0, 0, 0))

	win.blit(person, (x, y))
	win.blit(gpic, (gx, gy))
	
	pygame.display.update()



pygame.quit()


Код GrassLog.py:
import pygame


class grass:

	def X(x):
		x = 0

	def Y(y):
		y = 195

	def pic(grasspic):
		grasspic = pygame.image.load('Imaga\\grass.png')
  • Вопрос задан
  • 1022 просмотра
Решения вопроса 1
phaggi
@phaggi Куратор тега Python
лужу, паяю, ЭВМы починяю
Ростислав, там написано, что аргумент gpic в строке win.blit(gpic, (gx, gy))
должен быть определенным объектом, а не функцией.
Полагаю, метод gpic у объекта grass с точки зрения win.blit выглядит как функция.
gpic = grass.pic
Ты создаешь ссылку с именем gpic на метод класса grass.

(И, кстати, если мы посмотрим на этот метод, что он возвращает? Видимо, None, потому что return в нем нет)

Надо правильно создать класс и объект класса, т.е.
class Grass:
  def __init__(self):
    self.X = 0
    self.Y = 195

  def pic(self):
    return pygame.image.load('Imaga\\grass.png')


gpic = Grass()

А потом обращаться к его методу
win.blit(gpic.pic(), (gpic.X, gpic.Y))

Вообще, класс получается довольно пустой и бестолковый, и не уверен, что правильный - но что-то такое должно быть, может более сложное (потому что константы self.X и self.Y, захардкорженные внутри конструктора класса - ну, не знаю...)

P.s. признаться, я не большой мастер, возможно меня поправят старшие товарищи.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы