【问题标题】:Pygame "'set_at' for 'pygame.Surface' objects doesn't apply to 'tuple' object"Pygame“'pygame.Surface'对象的'set_at'不适用于'tuple'对象”
【发布时间】:2019-10-10 22:17:28
【问题描述】:

我正在编写一个基本程序,它从一个文件中读取数据,其中每个字符代表一个像素的颜色,然后使用 pygame 在屏幕上显示该信息。

我有一段代码可以读取运行良好的文件,但是当我尝试一个一个地显示像素时,我收到一个错误,上面写着“'pygame.Surface'对象的描述符'set_at'没有'不适用于'元组'对象”。 “网格”是一个二维数组,包含文件中的 0 和 1 数据。

print("Done processing file, Drawing pixels...")

for i in range(0, height - 2):
    for j in range(0, width - 2):
        if grid[i][j] == 0:
            pygame.Surface.set_at((i, j), "black") #Throws the error
        elif grid[i][j] == 1:
            pygame.Surface.set_at((i, j), "white")

print("Pixels drawn!")

我正在尝试使用“i”和“j”值来描述我要修改的像素的“x”和“y”,但 pygame 似乎将其读取为与我不同的数据类型想?我不完全确定为什么 pygame 不期望坐标元组(对我来说似乎是笛卡尔坐标最合乎逻辑的数据类型)。

我对 pygame 很陌生,所以我希望这是一个相对简单的错误,并且可以轻松修复。如果您想要此特定功能的文档:https://www.pygame.org/docs/ref/surface.html#pygame.Surface.set_at

【问题讨论】:

  • 总是将完整的错误消息(从单词“Traceback”开始)作为文本(不是屏幕截图)放在有问题的(不是评论)中。还有其他有用的信息。
  • surface 应该是 pygame.Surface 类的实例,而不是 pygame.Surface 类的实例 - 即。 my_surface = pygame.Surface()my_surface.set_at(...)。或screen = pygame.display.set_mode(...)screen.set_at(...)

标签: python pygame pygame-surface


【解决方案1】:

您的问题不是(x,y),而是pygame.Surface

你必须使用类pygame.Surface的实例,而不是类pygame.Surface

surface = pygame.Surface((800,600))
surface.set_at((i, j), (255,255,255))

screen = pygame.display.set_mode((800,600))
screen.set_at((i, j), (255,255,255))

image = pygame.image.load('image.png')
image.set_at((i, j), (255,255,255))

font = pygame.font.SysFont(None, 50)
text = font.render("Hello World", True, (255,255,255))
text.set_at((i, j), (255,255,255))

您将遇到另一个颜色问题。它必须是元组 (R,G,B) - 如果您使用透明度(alpha 通道),则最终是 (R,G,B,A)

对于white,它将是(255,255,255),对于black,它将是(0,0,0)

要使用带名称的字符串,您必须使用类 pygame.color.Color(name)

screen.set_at((i, j), pygame.color.Color('white'))    

示例代码:

import pygame

pygame.init()
screen = pygame.display.set_mode((800,600))

#WHITE = pygame.color.Color('white')
WHITE = (255,255,255)

for x in range(100):
    for y in range(100):
        screen.set_at((350+x, 250+y), WHITE)

pygame.display.flip()

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

pygame.quit()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-18
    • 2018-05-18
    • 1970-01-01
    • 2022-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多