类型错误:预期整数参数,实际为浮点数

1 投票
2 回答
23728 浏览
提问于 2025-04-17 08:10

这是我第一次在Stack Overflow上提问,所以如果我的问题太模糊或者信息不够,我提前道歉。

我遇到的问题是我的代码因为一个类型错误(TypeError)而无法运行。

这是具体的错误信息:

Traceback (most recent call last):
  File "C:\Program Files (x86)\Wing IDE 101 4.0\src\debug\tserver\_sandbox.py", line 61, in <module>
  File "C:\pygamehelper.py", line 62, in mainLoop
  File "C:\Program Files (x86)\Wing IDE 101 4.0\src\debug\tserver\_sandbox.py", line 54, in draw
TypeError: integer argument expected, got float

我认为这个错误是因为与pos相关的元组被用vec2d方法转换成了一个向量,然后作为一个浮点数传递给了第54行的draw.circle方法,而这个方法其实是期待一个整数(int)。我跟着的教程里是这么做的,而且他的代码是完全一样的,运行没有问题。

这可能是因为他使用了不同版本的Python或者PyGame,还是说我的代码有什么问题呢?

谢谢你们的帮助。

from pygamehelper import *
from pygame import *
from pygame.locals import *
from vec2d import *
from math import e, pi, cos, sin, sqrt
from random import uniform

class Agents:
    def __init__(self):
        self.pos = vec2d(0, 0)
        self.target = vec2d(0, 0)

class Starter(PygameHelper):
    def __init__(self):
        self.w, self.h = 800, 600
        PygameHelper.__init__(self, size=(self.w, self.h), fill=((255,255,255)))

        self.agents = []

        for i in range(10):
            a = Agents()
            a.pos = vec2d(uniform(0, self.w), uniform(0, self.h))
            a.target = vec2d(uniform(0, self.w), uniform(0, self.h))
            self.agents.append(a)

    def update(self):

        for a in self.agents:

            dir = a.target - a.pos
            dir.length = 5
            a.pos = a.pos + dir

    def keyUp(self, key):
        pass

    def mouseUp(self, button, pos):

        for a in self.agents:
            a.target = vec2d(pos)

    def mouseMotion(self, buttons, pos, rel):
        pass

    def draw(self):

        # clear the screen 40 times / sec so that only 1 char and target
        # present on screen at a time
        self.screen.fill((255,255,255))


        for a in self.agents:
            # character
            pygame.draw.circle(self.screen, (200, 200, 255), a.pos, 10)
            # black character outline
            pygame.draw.circle(self.screen, (0, 0, 0), a.pos, 11, 1)
            # target
            pygame.draw.circle(self.screen, (200, 0, 0), a.target, 20, 1)

s = Starter()
s.mainLoop(40)

2 个回答

1

看起来你的tuiototouch.py文件在第92行传递了一个浮点数参数(self.x_mouse),而uinput只接受整数。

我觉得在suinput里面可以自动把浮点数转换成整数。所以也许suinput应该确保在把ev_value传给uinput系统之前,它是一个整数。

所以有两种可能的解决方案。我可以选择:

  • 在uinput.Device.emit()的文档中说明需要整数类型

或者

  • 允许任何数字类型,并在suinput中把它转换成整数

我现在还不确定哪种方案更好,我会考虑一下。

同时,我觉得你可以通过在tuiototouch.py中把self.x_mouse转换成整数来解决这个问题:int(self.x_mouse)。

1

random.uniform(a,b) 这个函数会返回一个浮点数,也就是带小数点的数字。如果你想要一个整数,可以用 int(random.uniform(a,b)) 这个方法。

撰写回答