模糊的Pygame Rect错误

2 投票
2 回答
1049 浏览
提问于 2025-04-17 22:47

我在这里看到一些话题提到错误:“TypeError: Argument must be rect style object”。我一直遇到这个错误,真是烦人。

我看过文档:

Rect(left, top, width, height) -> Rect
Rect((left, top), (width, height)) -> Rect
Rect(object) -> Rect

我有一个方法可以从pygame.Surface中提取子表面(它使用了表面的原始方法):

def getSubSurface(self, rect):

    """
    Returns the subsurface of a specified rect area in the grict surface.
    """

    return self.surface.subsurface(rect)

问题是当我传递这个矩形时(我把参数分开写,让它更清楚):

sub = []
w = self.tileWidth
h = self.tileHeight
for i in range((self.heightInPixels/self.heightInTiles)):
    y = self.grid.getY(i)
    for j in range((self.widthInPixels/self.widthInTiles)):
        x = self.grid.getX(j)
        sub.append(self.tileset.getSubSurface(pygame.Rect(x,y,w,h)))

我明确传递了一个有效的pygame.Rect,但我什么都没有绘制,结果却是:

sub.append(self.tileset.getSubSurface(pygame.Rect(x,y,w,h)))
TypeError: Argument must be rect style object

有趣的是:如果我把参数改成任意的整数值:

sub.append(self.tileset.getSubSurface((1,2,3,4)))

它就能完美工作。pygame的子表面方法把它当作一个有效的矩形。问题是:我所有的实例变量都是有效的整数(即使它们不是,如果我明确转换成整数也不行)。

这真让人困惑。

为什么它接受明确的整数,但不接受我的变量?(如果值的类型不对,我不会收到“rectstyle”的错误,就像我传递参数不正确一样)。

2 个回答

0

我找到了问题的根源。我把变量明确地转换成了整数(int):

sub.append(self.tileset.getSubSurface((int(x),int(y),int(w),int(h))))

结果出现了一个“类型错误:int()的参数必须是字符串或数字,而不是'NoneType'”。这让我明白了。在我的循环中,“x”和“y”这两个变量在最后返回了一个“None”(因为它们的值是从一个字典中获取的,当找不到对应的键时,就会返回NoneType)。

我通过修复我的getX和getY方法解决了这个问题:

def getX(self, pos):

    """
    The getX() method expects a x-key as an argument. It returns its equivalent value in pixels.
    """

    if self.x.get(pos) != None:
        return self.x.get(pos)
    else:
        return 0 # If it is NoneType, it returns an acceptable Rect int value.
3

这个错误发生是因为传给 Rect() 的参数中有不是数字的值。

要找出问题所在,可以在你的方法中添加以下代码:

import numbers
...
sub = []
w = self.tileWidth
h = self.tileHeight
for i in range((self.heightInPixels/self.heightInTiles)):
    y = self.grid.getY(i)
    for j in range((self.widthInPixels/self.widthInTiles)):
        x = self.grid.getX(j)
        # be 100% sure x,y,w and h are really numbers
        assert isinstance(x, numbers.Number)
        assert isinstance(y, numbers.Number)
        assert isinstance(w, numbers.Number)
        assert isinstance(h, numbers.Number)
        sub.append(self.tileset.getSubSurface(pygame.Rect(x,y,w,h)))

撰写回答