TypeError: ожидается целочисленный аргумент, получил значение с плавающей точкой - PullRequest
1 голос
/ 12 декабря 2011

Я впервые задаю вопрос о переполнении стека, поэтому заранее прошу прощения, если мой вопрос слишком расплывчатый или недостаточно информации.

В принципе, проблема в том, что мой кодне запускается из-за ошибки 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, а затем передаваемый в качестве аргумента (как число с плавающей точкой) в метод draw.circle в строке 54, где ожидается 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 голос
/ 12 января 2012

Кажется, что ваш tuiototouch.py ​​в строке 92 передает аргумент с плавающей точкой (self.x_mouse). Uinput ожидает только целые числа.

Я думаю, что int-преобразование может быть выполнено в suinput. Поэтому, возможно, suinput должен убедиться, что ev_value является целым числом, прежде чем передать его в систему uinput.

Так что есть два возможных решения. Я мог бы либо

  • документировать целочисленное требование для uinput.Device.emit ()

или

  • разрешить любой числовой тип и привести его к целому числу в suinput

Я не уверен, что лучше, я подумаю над этим некоторое время.

Между тем, я думаю, вы можете исправить это, приведя self.x_mouse к типу int в tuiototouch.py: int (self.x_mouse).

1 голос
/ 12 декабря 2011

random.uniform(a,b) возвращает число с плавающей запятой.используйте int(random.uniform(a,b)) для целого числа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...