IndexError: list index out of range sur tkinter
Fermé
BienLeBonjour
-
Modifié le 12 mars 2021 à 18:25
yg_be Messages postés 23417 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 5 janvier 2025 - 18 mars 2021 à 21:29
yg_be Messages postés 23417 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 5 janvier 2025 - 18 mars 2021 à 21:29
A voir également:
- Indexerror: image index out of range
- Cmdlcache out of memory ✓ - Forum jeux en ligne
- Input signal out of range - Forum Matériel & Système
- Out of memory ✓ - Forum Matériel & Système
- Image iso - Guide
- Out of range écran - Forum Windows
3 réponses
yg_be
Messages postés
23417
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
5 janvier 2025
Ambassadeur
1 557
12 mars 2021 à 21:28
12 mars 2021 à 21:28
bonjour,
si tu ne comprends pas d'où vient l'erreur, décompose l'instruction qui provoque l'erreur, afin de déterminer quel index cause l'erreur.
si tu ne comprends pas d'où vient l'erreur, décompose l'instruction qui provoque l'erreur, afin de déterminer quel index cause l'erreur.
dachiasse
Messages postés
1709
Date d'inscription
samedi 12 septembre 2020
Statut
Membre
Dernière intervention
13 mai 2021
149
16 mars 2021 à 16:07
16 mars 2021 à 16:07
Salut,
Je suis à distance ce fil. Je vais essayer de faire ton jeu. Mais, tu étais obligé d'utiliser tkinter ? Je trouve que pygame est davantage adapté.
J'utilise tkinter pour des applis fenêtrées, et pygame pour des petits jeux 2D.
Bon, mon défi, c'est de faire le jeu avec tkinter. Ne connaissant pas bien la classe Canvas, c'est vraiment galère. Tu auras, je l'espère, fait mieux et fini avant moi.
Je suis à distance ce fil. Je vais essayer de faire ton jeu. Mais, tu étais obligé d'utiliser tkinter ? Je trouve que pygame est davantage adapté.
J'utilise tkinter pour des applis fenêtrées, et pygame pour des petits jeux 2D.
Bon, mon défi, c'est de faire le jeu avec tkinter. Ne connaissant pas bien la classe Canvas, c'est vraiment galère. Tu auras, je l'espère, fait mieux et fini avant moi.
Merci à tous pour les informations que vous m'avez donné !
Je vais devoir rendre ce devoir dans peu de temps cependant mon problème pour insérer une image et la faire bouger sans que mon jeu ne bug reste toujours présent.
Je ne le rajouterai donc pas dans mon travail mais si quelqu'un a la réponse je serais toujours content de la connaître.
Bonne chance à toi Dachiasse pour ce programme sur tkinter et n'hésite pas à l'envoyer pour que je puisse le voir.
PS: c'était un travail sur tkinter alors non je ne pouvais pas utiliser pygame.
Je vais devoir rendre ce devoir dans peu de temps cependant mon problème pour insérer une image et la faire bouger sans que mon jeu ne bug reste toujours présent.
Je ne le rajouterai donc pas dans mon travail mais si quelqu'un a la réponse je serais toujours content de la connaître.
Bonne chance à toi Dachiasse pour ce programme sur tkinter et n'hésite pas à l'envoyer pour que je puisse le voir.
PS: c'était un travail sur tkinter alors non je ne pouvais pas utiliser pygame.
yg_be
Messages postés
23417
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
5 janvier 2025
1 557
>
BienLeBonjour
18 mars 2021 à 21:21
18 mars 2021 à 21:21
si le programme fonctionne quand le joueur est un rectangle ou un ovale,
il faut, sans rien changer au joueur, ajouter une image, et déplacer cette image pour qu'elle se mette à la position du joueur.
il faut, sans rien changer au joueur, ajouter une image, et déplacer cette image pour qu'elle se mette à la position du joueur.
dachiasse
Messages postés
1709
Date d'inscription
samedi 12 septembre 2020
Statut
Membre
Dernière intervention
13 mai 2021
149
>
BienLeBonjour
18 mars 2021 à 21:27
18 mars 2021 à 21:27
Salut,
Pour qu'on soit bien d'accord sur les règles.
Le joueur est une boule qu'on déplace avec les touches fléchées du clavier. Il y a des balles qui se déplacent. Le chrono se lance, on se déplace en évitant les balles et dès qu'il y a contact on arrête le chrono et on l'affiche.
C'est bien ça ? Ou j'ai raté quelque chose.
Pour ton bug de l'image, bien que tu n'utilises pas pygame, tu pourrais t'en inspirer, au moins, au niveau de la méthode. Dans Pygame, il y a une classe Surface où l'on insère un objet (rectangle, image, autre) et avec la classe Rect on peut conserver les coordonnées pour "figer" l'image à la surface. Ainsi, à chaque déplacement, l'image est figée.
Car on dirait que ton problème, c'est que l'image sort de son cadre ou qu'elle ne bouge pas du tout.
Pour qu'on soit bien d'accord sur les règles.
Le joueur est une boule qu'on déplace avec les touches fléchées du clavier. Il y a des balles qui se déplacent. Le chrono se lance, on se déplace en évitant les balles et dès qu'il y a contact on arrête le chrono et on l'affiche.
C'est bien ça ? Ou j'ai raté quelque chose.
Pour ton bug de l'image, bien que tu n'utilises pas pygame, tu pourrais t'en inspirer, au moins, au niveau de la méthode. Dans Pygame, il y a une classe Surface où l'on insère un objet (rectangle, image, autre) et avec la classe Rect on peut conserver les coordonnées pour "figer" l'image à la surface. Ainsi, à chaque déplacement, l'image est figée.
Car on dirait que ton problème, c'est que l'image sort de son cadre ou qu'elle ne bouge pas du tout.
yg_be
Messages postés
23417
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
5 janvier 2025
1 557
>
dachiasse
Messages postés
1709
Date d'inscription
samedi 12 septembre 2020
Statut
Membre
Dernière intervention
13 mai 2021
18 mars 2021 à 21:29
18 mars 2021 à 21:29
je pense que son problème, c'est qu'il essaie d'utiliser l'image dans find_overlapping, sans se rendre compte que l'image n'est absolument pas identique à un rectange ou un ovale.
dachiasse
Messages postés
1709
Date d'inscription
samedi 12 septembre 2020
Statut
Membre
Dernière intervention
13 mai 2021
149
14 mars 2021 à 14:29
14 mars 2021 à 14:29
Salut,
J'ai récupéré ton code. J'ai modifié l'image car je n'y ai pas accès. J'ai mis un rectangle à la place. J'ai dû retirer des configurations de
J'ai testé la méthode find_overlapping de tk.Canvas, je l'ai comprise. Dans ton jeu, on perd si le joueur entre en collision avec au moins 2 balles on dirait.
J'ai récupéré ton code. J'ai modifié l'image car je n'y ai pas accès. J'ai mis un rectangle à la place. J'ai dû retirer des configurations de
fenetrepour accéder aux boutons.
J'ai testé la méthode find_overlapping de tk.Canvas, je l'ai comprise. Dans ton jeu, on perd si le joueur entre en collision avec au moins 2 balles on dirait.
Bonjour,
Le problème est que si je change le joueur en image les balles qui ont un déplacement aléatoire ne se lancent pas. Alors que si le joueur est une balle le programme se lance et fonctionne correctement même si c'est un rectangle.
PS: je pense qu' il y a une erreur car sur le mien le programme s'arrête dès qu'une balle touche le joueur.
Le problème est que si je change le joueur en image les balles qui ont un déplacement aléatoire ne se lancent pas. Alors que si le joueur est une balle le programme se lance et fonctionne correctement même si c'est un rectangle.
PS: je pense qu' il y a une erreur car sur le mien le programme s'arrête dès qu'une balle touche le joueur.
yg_be
Messages postés
23417
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
5 janvier 2025
1 557
>
BienLeBonjour
14 mars 2021 à 21:27
14 mars 2021 à 21:27
c'est en effet une seule balle, car find_overlapping() recherche le nombre d'objets qui touchent le rectangle où se trouve le joueur.
il y a toujours un objet qui touche ce rectangle, bien sûr.
il y a toujours un objet qui touche ce rectangle, bien sûr.
dachiasse
Messages postés
1709
Date d'inscription
samedi 12 septembre 2020
Statut
Membre
Dernière intervention
13 mai 2021
149
>
BienLeBonjour
14 mars 2021 à 21:33
14 mars 2021 à 21:33
En fait, comme j'ai dit, je n'ai pas ton image, donc j'ai réadapté en mettant un rectangle à la place. Et j'ai remarqué que la collision ne se traite que dans le canvas. Ce qui est logique.
Je ne peux pas te faire de dessin, mais imagine le canvas en haut à gauche de la fenêtre Tk, en agrandissant la fenêtre, je peux déplacer la boule hors du canvas, les balles en sortent également, et il n'y a jamais collision même si visuellement oui. Par contre, dans le canvas, s'il y a collision c'est game over.
Même s'il y a le très dégueulasse mot clé global, tu peux t'inspirer de : https://tarball69.developpez.com/tutoriels/python/isn-passe-ton-faq/#LIII-C-7
Il y a plein de fonctions. Logiquement, il faut éviter les boucles for ou while mais, dans son jeu, ce n'est absolument pas bloquant. En tout cas, au niveau de l'utilisateur ça ne l'est pas.
Dans ton code, tu devrais faire une liste de X et de Y, pareil pour les Dx et Dy. Et tu as des répétitions de code pour le déplacement des balles. Fais plutôt une fonction.
Tu remplaces :
par :
Comme ça, le jour où tu veux mettre 1000 balles, ça te fera 990 lignes en plus et non 990 x 10 lignes. D'ailleurs, une liste serait un meilleur choix.
Je ne peux pas te faire de dessin, mais imagine le canvas en haut à gauche de la fenêtre Tk, en agrandissant la fenêtre, je peux déplacer la boule hors du canvas, les balles en sortent également, et il n'y a jamais collision même si visuellement oui. Par contre, dans le canvas, s'il y a collision c'est game over.
Même s'il y a le très dégueulasse mot clé global, tu peux t'inspirer de : https://tarball69.developpez.com/tutoriels/python/isn-passe-ton-faq/#LIII-C-7
Il y a plein de fonctions. Logiquement, il faut éviter les boucles for ou while mais, dans son jeu, ce n'est absolument pas bloquant. En tout cas, au niveau de l'utilisateur ça ne l'est pas.
Dans ton code, tu devrais faire une liste de X et de Y, pareil pour les Dx et Dy. Et tu as des répétitions de code pour le déplacement des balles. Fais plutôt une fonction.
Tu remplaces :
if x10>1580: dx10=-dx10 if x10<-10: dx10=-dx10 if y10<-10: dy10=-dy10 if y10>970: dy10=-dy10 x10=x10+dx10 y10=y10+dy10
par :
def deplacerBalle(x,y,dx,dy): if x<-10 or x>1580: dx = -dx if y<-10 or y>970: dy = -dy x = x+dx y = y+dy # puis deplacerBalle(x10,y10,dx10,dy10)
Comme ça, le jour où tu veux mettre 1000 balles, ça te fera 990 lignes en plus et non 990 x 10 lignes. D'ailleurs, une liste serait un meilleur choix.
BienLeBonjour
>
dachiasse
Messages postés
1709
Date d'inscription
samedi 12 septembre 2020
Statut
Membre
Dernière intervention
13 mai 2021
Modifié le 14 mars 2021 à 21:55
Modifié le 14 mars 2021 à 21:55
Merci en effet ça a l'air plus pratique
12 mars 2021 à 21:49
Pourriez vous m'expliquer qu'est-ce qui doit changer dans le programme après avoir remplacé la balle par une image ?
12 mars 2021 à 22:01
tu écris "quand j'enlève un des can.coords je me retrouve avec une autre erreur": montre-nous les deux versions du programme.
comme j'ai compris que tu avais écrit avoir des erreurs avec cette ligne de code
j'ai simplement suggéré de décomposer cette instruction, de façon à déterminer quelle partie provoque le problème?
as-tu essayé de décomposer?
si tu ne comprends pas , n'hésite pas à poser des questions.
13 mars 2021 à 09:46
Ducoup je joins l'ancien programme (quand le joueur est une balle et que le programme tourne)
je précise que juste 2 lignes sont changées pour le nouveau programme.
De plus je ne vois pas trop ce que vous voulez dire par décomposer l'instruction.
Et pour la méthode avec can.coords je l'ai trouvé sur internet et c'est la seule que j'ai essayé.
(Au fait cette année est ma première en programmation alors mes connaissances sont un peu limités.)
13 mars 2021 à 10:19
si je ne me suis pas trompé, ce groupe d'instructions devrait faire la même chose que ton instruction, et il te sera plus simple de déterminer où précisément l'erreur se produit.
13 mars 2021 à 10:20