模糊的Pygame Rect错误
我在这里看到一些话题提到错误:“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)))