我在这里看到了一些错误的主题:" TypeError:参数必须是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)
问题是当我通过这个矩形时(我已经和#34; unclustered"让它更清晰的论点):
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
现在,有趣的部分是:如果我将参数更改为任意int值:
sub.append(self.tileset.getSubSurface((1,2,3,4)))
完美无缺。 pygame subsurfaces方法将其作为有效的Rect。问题是:我的所有实例变量都是有效的int(即使它们不是,如果我明确地转换它们也不行。)
没用。
为什么它采用显式整数,但不采用我的变量? (如果值的类型不正确,我就不会得到" rectstyle"错误,好像我正确地传递了参数一样。)
答案 0 :(得分: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)))
答案 1 :(得分:0)
我找到了问题的根源。我已经明确地将变量转换为整数:
sub.append(self.tileset.getSubSurface((int(x),int(y),int(w),int(h))))
得到一个“TypeError: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.