TypeError: integer argument expected, got float

C'est pourtant comme sur le modèle...

    5 septembre 2011 à 1:36:51

    Je sens que je vais prendre un abonnement par ici...

    Toujours dans ma tentative d'apprendre à programmer, je suis ce tutoriel :
    https://lorenzod8n.wordpress.com/2007/ [...] ial-5-pixels/

    J'ai une erreur que je n'ai pas réussie à résoudre.
    Le programme doit afficher un pixel qui peut se déplacer à l'aider des touches du clavier.
    Hors, le programme plante avec l'erreur suivante :

    builtins.TypeError: integer argument expected, got float
    line 38, in <module> screen.set_at((x, y), (255, 255, 255))

    Note : le code du tutoriel en copié/collé plante et retourne la même erreur.
    Pas de commentaire à la suite du tuto pourtant.

    Je pense avoir été attentif à l'indentation cette fois.

    Voici mon code, recopié "à la main" :

    # -*- coding:utf-8 -*-  ######################################################## # Importation des modules et configuration de la fenêtre ########################################################  import os, pygame, random  screen_w = 800 screen_h = 600  bgcolor = 0, 0, 0 pixcolor = 255, 255, 255 # pour tester mais ça ne change pas l'erreur  x = screen_w/2 y = screen_h/2  dir_x = 0 dir_y = -1  screen = pygame.display.set_mode((screen_w, screen_h)) clock = pygame.time.Clock() running = True  ################### # Boucle principale ###################  while running:          x += dir_x     y += dir_y          if x <= 0 or x >= screen_w or y <= 0 or y >= screen_h:         print ("Perdu !")         running = False              screen.fill((0, 0, 0))     screen.set_at((x, y), (255, 255, 255)) # C'est ici qu'est surlignée l'erreur dans mon IDE      for event in pygame.event.get():         if event.type == pygame.QUIT:             running = False         if event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE:             running = False         elif event.type == pygame.KEYDOWN:             if event.type == pygame.K.UP:                 dir_x = 0                 dir_y = -1             if event.type == pygame.K.DOWN:                 dir_x = 0                 dir_y = 1             if event.type == pygame.K.LEFT:                 dir_x = -1                 dir_y = 0             if event.type == pygame.K.RIGHT:                 dir_x = 1                 dir_y = 0                      pygame.display.flip()     pygame.mouse.set_visible(0)     clock.tick(120)                    

      5 septembre 2011 à 1:57:03

      Tes variables x et y sont des floats, la fonction attend des entiers. Transtype x et y en entier à l'aide de la fonction int().

      Je suppose que le tutoriel que tu lis est pour Python2 et non Python3. En Python2, l'opérateur / utilisé avec deux entiers retourne un entier, même si le résultat n'est normalement pas un entier.

        5 septembre 2011 à 2:20:09

        Merci, c'est tout bête.
        J'ai juste fait ça, c'est bon ? Le code fonctionne mais c'est pour savoir si c'est "propre" ?

        x = int(screen_w/2) y = int(screen_h/2)                    

        Heu, c'est normal qu'il est 02h19 alors que cinq minutes plus tôt il était à peine 22h ?

          5 septembre 2011 à 2:22:02

          Oui, ça fonctionne. N'oublie pas, par contre, que tu perds de la précision en utilisant int, et que ton nombre est tronqué pour ne retourner que la partie entière.

          Citation

          Heu, c'est normal qu'il est 02h19 alors que cinq minutes plus tôt il était à peine 22h ?

          Les joies de la programmation !

            5 septembre 2011 à 2:25:55

            Je comprends. Dans le cas présent c'est négligeable vu que c'est pour diviser 800 et 600, mais c'est bon à savoir pour les éventuels usages futurs.

            Merci encore.

            • Langage Python

              5 septembre 2011 à 7:17:09

              On peut aussi faire ceci :

              Citation : ( Tchey )

              x = int(screen_w/2) y = int(screen_h/2)                      

              en plus propre en utilisant la division entière :

              x = screen_w // 2 y = screen_h // 2                    

                5 septembre 2011 à 10:06:36

                En bonus c'est plus court ! Merci.

                  5 septembre 2011 à 10:12:48

                  les lignes 46 à 58 (qui sont fausses d'ailleur ...) peuvent se réduire à 2 lignes ...

                  indices: dictionnaire

                  #!/usr/bin/env python # -*- coding: utf-8 -*-# -*- coding:utf-8 -*-  ######################################################## # Importation des modules et configuration de la fenêtre ########################################################  import os, pygame, random  screen_w = 800 screen_h = 600 screen = pygame.display.set_mode((screen_w, screen_h)) screenrect = screen.get_rect()  bgcolor = 0, 0, 0 pixcolor = 255, 255, 255 # pour tester mais ça ne change pas l'erreur  x,y = screenrect.center  dir_x = 0 dir_y = -1  clock = pygame.time.Clock() running = True pygame.mouse.set_visible(0)  ################### # Boucle principale ###################  while running:          screen.set_at((x, y),(0, 0, 0))     x += dir_x     y += dir_y     if not screenrect.collidepoint((x,y)):         print ("Perdu !")         running = False         continue     screen.set_at((x, y), (255, 255, 255))      for event in pygame.event.get():         try: dir_x,dir_y = {pygame.K_UP:(0,-1),pygame.K_DOWN:(0,1),pygame.K_LEFT:(-1,0),pygame.K_RIGHT:(1,0)}[event.key]         except:             if event.type == pygame.QUIT:                 running = False                      pygame.display.update((x-1,y-1,3,3))     clock.tick(120)                      

                  "il vaut mieux vivre en France qu'en Italie, la France a de plus jolies prisons"

                    5 septembre 2011 à 11:41:51

                    Intéressant.

                    Pas mal de changements, ce qui me perd, je ne suis pas encore "prêt" pour autant de modifications et de nouveautés en une seule fois.

                    En lisant le code je comprends grossièrement son fonctionnement, mais je suis encore incapable d'écrire... J'ai le sentiment d'être un jeune enfant qui comprend "presque tout" quand on lui parle, mais n'est pas capable de s'exprimer clairement et encore moins d'écrire ce qu'il souhaite exprimer.

                    Pour les contrôles du pixel, j'avais modifié le truc car il me semblait que c'était foireux.

                    if event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE:             running = False         if event.type == pygame.KEYDOWN and event.key == pygame.K_KP8:             dir_x = 0             dir_y = -1         if event.type == pygame.KEYDOWN and event.key == pygame.K_KP9:             dir_x = +1             dir_y = -1         if event.type == pygame.KEYDOWN and event.key == pygame.K_KP6:             dir_x = +1             dir_y = 0         if event.type == pygame.KEYDOWN and event.key == pygame.K_KP3:             dir_x = +1             dir_y = +1         if event.type == pygame.KEYDOWN and event.key == pygame.K_KP2:             dir_x = 0             dir_y = +1         if event.type == pygame.KEYDOWN and event.key == pygame.K_KP1:             dir_x = -1             dir_y = +1         if event.type == pygame.KEYDOWN and event.key == pygame.K_KP4:             dir_x = -1             dir_y = 0         if event.type == pygame.KEYDOWN and event.key == pygame.K_KP7:             dir_x = -1             dir_y = -1                    

                    C'est beaucoup de lignes, certes, je vais utiliser le dictionnaire pour modifier ça.

                    (édition)

                    Ce qui donne ça :

                    for event in pygame.event.get():                  try: dir_x,dir_y = {pygame.K_KP8:(0,-1), pygame.K_KP9:(1,-1), pygame.K_KP6:(+1,0), pygame.K_KP3:(+1,+1), pygame.K_KP2:(0,+1), pygame.K_KP1:(-1,+1), pygame.K_KP4:(-1,0), pygame.K_KP7:(-1,-1),}[event.key]         except:             if event.type == pygame.QUIT:                 running = False             if event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE:                 running = False                    

                    Prochaine étape avant d'aller plus loin, faire que le pixel ne se déplace que lorsque j'appuie sur une touche, façon "tour par tour" ou plutôt "roguelike"...

                      5 septembre 2011 à 12:21:30

                      on peut aussi l'ecrire comme ça si on aime pas les try/except ...

                      dic = { pygame.K_KP8:(0,-1),         pygame.K_KP9:(1,-1),         pygame.K_KP6:(+1,0),         pygame.K_KP3:(+1,+1),         pygame.K_KP2:(0,+1),         pygame.K_KP1:(-1,+1),         pygame.K_KP4:(-1,0),         pygame.K_KP7:(-1,-1) }  for event in pygame.event.get():                  if event.type == pygame.KEYDOWN:             if event.key in dic: dir_x,dir_y = dic[event.key]             elif event.key == pygame.K_ESCAPE: running = False         elif event.type == pygame.QUIT:             running = False                    

                      edit: bugfixe

                      "il vaut mieux vivre en France qu'en Italie, la France a de plus jolies prisons"

                        5 septembre 2011 à 12:39:42

                        Hum, je comprends le principe du code, l'indentation semble bonne, mais j'ai ça dès que je cherche à déplacer le pixel :

                        builtins.ValueError: need more than 1 value to unpack
                        line 55, in <module>
                        if event.key in dic: dir_x, dir_y = [event.key]

                          5 septembre 2011 à 22:46:35

                          pardon, c'est if event . key in dic : dir_x , dir_y = dic [ event . key ]
                          perso je préfère try/except car plus logique et plus rapide ... amha.

                          "il vaut mieux vivre en France qu'en Italie, la France a de plus jolies prisons"

                            6 septembre 2011 à 12:42:14

                            J'aime bien cette façon de faire, je crois.

                            Juste un soucis, avec mon bloc long je pouvais définir ligne par ligne KEYDOWN, KEYUP etc si je voulais que le "drone" réagisse lorsque je presse la touche, ou lorsque je la relâche ou autre.

                            Ici, le drone se déplace de deux crans, une fois à la pression, une fois au relâchement.
                            Je n'arrivais pas à voir à quel endroit et comment placer le KEYDOWN.
                            Après avoir perdu quelques neurones à trouver la "solution", j'ai fait ça, et je voudrais savoir si c'est "propre" ?

                            for event in pygame.event.get():             if event.type == pygame.KEYDOWN:                 try: xpos,ypos = {pygame.K_KP8:(xpos, ypos-10), pygame.K_KP9:(xpos +10, ypos -10), pygame.K_KP6:(xpos +10, ypos), pygame.K_KP3:(xpos +10, ypos +10), pygame.K_KP2:(xpos, ypos +10), pygame.K_KP1:(xpos -10, ypos +10), pygame.K_KP4:(xpos -10, ypos), pygame.K_KP7:(xpos -10, ypos -10),}[event.key]                 except:                     if event.type == pygame.QUIT:                         running = False                     if event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE:                         running = False                    

                              6 septembre 2011 à 18:54:29

                              techniquement c'est bien je trouve
                              esthétiquement c'est mieux de pas dépasser les 80 chars/line
                              rien ne t'empêche de wrapper comme ici

                              "il vaut mieux vivre en France qu'en Italie, la France a de plus jolies prisons"

                              TypeError: integer argument expected, got float

                              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.

                              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.