Ошибка TypeError: unsupported operand type(s) for -: 'int' and 'list', при запуске кода.

zensolix

Новичок
Пользователь
Фев 17, 2021
6
0
1
Python:
import pygame

pygame.init()

display_w = 800 
display_h = 600 

display = pygame.display.set_mode((display_w, display_h)) 

pers_width = 60
pers_height = 100

def rect(offset, height):
    pers_0_x = display_w // offset
    pers_0_y = display_h - height - pers_height
    pers_1_x = display_w // offset
    pers_1_y = display_h - height + pers_height
rect(4, [100, 600])

def rect(offset, height):
    pers_2_x = display_w - offset
    pers_2_y = display_h - height - pers_height
    pers_3_x = display_w - offset
    pers_3_y = display_h - height + pers_height
rect(260, [100, 600])

def rungame():
    game = True
    while game: 
        for event in pygame.event.get(): 
            if event.type == pygame.QUIT: 
                pygame.quit() 
                quit()
display.fill((255, 255, 255))
pygame.draw.rect(display, (251,186,0), (pers_0_x, pers_0_y, pers_width, pers_height)) 
pygame.draw.rect(display, (168,91,56), (pers_1_x, pers_1_y, pers_width, pers_height))
pygame.draw.rect(display, (34,253,48), (pers_2_x, pers_2_y, pers_width, pers_height)) 
pygame.draw.rect(display, (11,28,189), (pers_3_x, pers_3_y, pers_width, pers_height)) 
pygame.display.update() 
rungame()

Код:
Traceback (most recent call last):
  File "D:\Python\Game on Python\Персонаж1.py", line 21, in <module>
    rect(4, [100, 600])
  File "D:\Python\Game on Python\Персонаж1.py", line 18, in rect
    pers_0_y = display_h - height - pers_height
TypeError: unsupported operand type(s) for -: 'int' and 'list'

Как исправить подобную ошибку на примере вот этого кода? Если знаете, помогите пожалуйста.
 

abc

Новичок
Пользователь
Мар 17, 2021
7
4
3
Переведите ошибку и посмотрите, что вы передаёте в качестве height
 

overpathz

Новичок
Пользователь
Авг 10, 2020
13
3
3
21
В 18 (и не только) строке, ты передаешь list. В самом методе, над аргументом height выполняются операции сложения и вычитания. (То есть ты складываешь число и список)
В общем, при вызове метода rect(), передай аргумент нужного типа.
И потом, если решить эту проблему, у тебя появятся другие - ты используешь локальные переменные метода за его пределами.
Можешь вернуть лист значений, и по индексу что-то отковырять, либо, не использовать локальные переменные.

upd: Ко всему вышеперечисленному, у тебя 2 одинаковых метода.

Бырое решение, чисто чтобы оно запустилось:
Python:
import pygame

pygame.init()

display_w = 800
display_h = 600

display = pygame.display.set_mode((display_w, display_h))

pers_width = 60
pers_height = 100


def rect(offset, height):
    pers_0_x = display_w // offset
    pers_0_y = display_h - height - pers_height
    pers_1_x = display_w // offset
    pers_1_y = display_h - height + pers_height
    return [pers_0_x, pers_0_y, pers_1_x, pers_1_y]


rect(4, 600)


def rect(offset, height):
    pers_2_x = display_w - offset
    pers_2_y = display_h - height - pers_height
    pers_3_x = display_w - offset
    pers_3_y = display_h - height + pers_height
    return [pers_2_x, pers_2_y, pers_3_x, pers_3_y]


rect(260, 600)


def rungame():
    game = True
    while game:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                quit()


display.fill((255, 255, 255))

pygame.draw.rect(display, (251,186,0), (rect(260, 600)[0], rect(260, 600)[1], pers_width, pers_height))
pygame.draw.rect(display, (168,91,56), (rect(260, 600)[2], rect(260, 600)[3], pers_width, pers_height))
pygame.draw.rect(display, (34,253,48), (rect(260, 600)[0], rect(260, 600)[1], pers_width, pers_height))
pygame.draw.rect(display, (11,28,189), (rect(260, 600)[2], rect(260, 600)[3], pers_width, pers_height))
pygame.display.update()
rungame()
 
Последнее редактирование:

zensolix

Новичок
Пользователь
Фев 17, 2021
6
0
1
В 18 (и не только) строке, ты передаешь list. В самом методе, над аргументом height выполняются операции сложения и вычитания. (То есть ты складываешь число и список)
В общем, при вызове метода rect(), передай аргумент нужного типа.
И потом, если решить эту проблему, у тебя появятся другие - ты используешь локальные переменные метода за его пределами.
Можешь вернуть лист значений, и по индексу что-то отковырять, либо, не использовать локальные переменные.

upd: Ко всему вышеперечисленному, у тебя 2 одинаковых метода.

Бырое решение, чисто чтобы оно запустилось:
Python:
import pygame

pygame.init()

display_w = 800
display_h = 600

display = pygame.display.set_mode((display_w, display_h))

pers_width = 60
pers_height = 100


def rect(offset, height):
    pers_0_x = display_w // offset
    pers_0_y = display_h - height - pers_height
    pers_1_x = display_w // offset
    pers_1_y = display_h - height + pers_height
    return [pers_0_x, pers_0_y, pers_1_x, pers_1_y]


rect(4, 600)


def rect(offset, height):
    pers_2_x = display_w - offset
    pers_2_y = display_h - height - pers_height
    pers_3_x = display_w - offset
    pers_3_y = display_h - height + pers_height
    return [pers_2_x, pers_2_y, pers_3_x, pers_3_y]


rect(260, 600)


def rungame():
    game = True
    while game:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                quit()


display.fill((255, 255, 255))

pygame.draw.rect(display, (251,186,0), (rect(260, 600)[0], rect(260, 600)[1], pers_width, pers_height))
pygame.draw.rect(display, (168,91,56), (rect(260, 600)[2], rect(260, 600)[3], pers_width, pers_height))
pygame.draw.rect(display, (34,253,48), (rect(260, 600)[0], rect(260, 600)[1], pers_width, pers_height))
pygame.draw.rect(display, (11,28,189), (rect(260, 600)[2], rect(260, 600)[3], pers_width, pers_height))
pygame.display.update()
rungame()

Но можно поинтересоваться, почему выводится только 1 прямоугольник?
 

overpathz

Новичок
Пользователь
Авг 10, 2020
13
3
3
21
Но можно поинтересоваться, почему выводится только 1 прямоугольник?
Потому что мы в параметры передаем одни и те же значения. Вот, другие значения.

Python:
import pygame

pygame.init()

display_w = 800
display_h = 600

display = pygame.display.set_mode((display_w, display_h))

pers_width = 60
pers_height = 100


def rect(offset, height):
    pers_0_x = display_w // offset
    pers_0_y = display_h - height - pers_height
    pers_1_x = display_w // offset
    pers_1_y = display_h - height + pers_height
    return [pers_0_x, pers_0_y, pers_1_x, pers_1_y]


rect(4, 600)


def rect(offset, height):
    pers_2_x = display_w - offset
    pers_2_y = display_h - height - pers_height
    pers_3_x = display_w - offset
    pers_3_y = display_h - height + pers_height
    return [pers_2_x, pers_2_y, pers_3_x, pers_3_y]


rect(260, 600)


def rungame():
    game = True
    while game:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                quit()


display.fill((255, 255, 255))

pygame.draw.rect(display, (251,186,0), (rect(260, 600)[0], rect(260, 600)[1], pers_width, pers_height))
pygame.draw.rect(display, (168,91,56), (rect(260, 600)[2], rect(260, 600)[3], pers_width, pers_height))

pygame.draw.rect(display, (34,253,48), (rect(100, 600)[0], rect(100, 600)[1], pers_width, pers_height))
pygame.draw.rect(display, (11,28,189), (rect(100, 600)[2], rect(100, 600)[3], pers_width, pers_height))
pygame.display.update()
rungame()
1622303719998.png
 

overpathz

Новичок
Пользователь
Авг 10, 2020
13
3
3
21
Сам не понял что сделал, но кода стало меньше. (завернул повторяющие фрагменты в функцию)

Python:
import pygame

pygame.init()

display_w = 800
display_h = 600

display = pygame.display.set_mode((display_w, display_h))

pers_width = 60
pers_height = 100


def rect(offset, height):
    pers_0_x = display_w // offset
    pers_0_y = display_h - height - pers_height
    pers_1_x = display_w // offset
    pers_1_y = display_h - height + pers_height
    return [pers_0_x, pers_0_y, pers_1_x, pers_1_y]


def draw(color, offset, height):
    pygame.draw.rect(display, color, (rect(offset, height)[2], rect(offset, height)[3], pers_width, pers_height))


def run_game():
    game = True
    while game:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                quit()


display.fill((255, 255, 255))


draw('red', 300, 600)
draw('black', 5, 600)


pygame.display.update()
run_game()
 

Форум IT Специалистов