Je faisais récemment un jeu en utilisant tkinter
et son widget Canvas
, mais j'ai rencontré un problème en essayant de déplacer une image. J'ai défini canvas.create_image
sur une variable appelée character
mais j'ai remarqué qu'elle en faisait un objet. Cela pose des problèmes car lorsque j'essaye d'utiliser le canvas.move(character)
, il revient avec " character
not defined". Voici le code complet:
from tkinter import * from PIL import ImageTk, Image import pygame import threading import time gamestate= 'title' waiting = False #window init root = Tk() WIDTH=1280 HEIGHT=720 canvas = Canvas(root, width=WIDTH, height=HEIGHT, bg='black') canvas.pack(expand=1, fill=BOTH) logo = PhotoImage(file='Ghost clipart.png') root.iconphoto(False, logo) #setting up all the images title_image = PhotoImage(file='title.png') board_image = Image.open('board.png') done_board = board_image.resize((1920,1080), Image.ANTIALIAS) board_image = ImageTk.PhotoImage(done_board) character_image = ImageTk.PhotoImage(file='first_run_left.png') #display the title screen def title_screen(): title = canvas.create_image(WIDTH/2,HEIGHT/2, anchor=CENTER, image=title_image) #define the events after clicking play def play(): canvas.delete("all") board = canvas.create_image(WIDTH/2 + 100,HEIGHT/2 - 360, anchor=CENTER, image=board_image) character = canvas.create_image(556,304,anchor=CENTER,image=character_image) #testing for what should happen the the mouse button is clicked def click(event): if gamestate == 'title': print(event.x, event.y) if event.x > 475 and event.x < 804 and event.y > 213 and event.y < 337: play() elif event.x > 475 and event.x < 804 and event.y > 404 and event.y < 527: print("skin") def up(event): canvas.move(character,0,10) root.bind('<Button-1>', click) root.bind('<Up>', up) #audio module def test_loop(): while True: pygame.mixer.init() pygame.mixer.music.load("nokia-ringtone-arabic.mp3") pygame.mixer.music.play() time.sleep(23) thread = threading.Thread(target=test_loop) thread.daemon = True thread.start() title_screen() root.mainloop()
3 Réponses :
Voici un script simple qui utilise les touches fléchées pour déplacer une image sur le canevas. Notez que la variable img
(dans votre character
cas) doit être accessible depuis les fonctions qui agissent sur elle, donc sa portée doit être au-dessus de ces fonctions.
Vous pouvez l'utiliser comme point de départ pour résoudre votre problème.
image utilisée:
import tkinter as tk def up(event): canvas.move(img, 0, -10) def down(event): canvas.move(img, 0, 10) def left(event): canvas.move(img, -10, 0) def right(event): canvas.move(img, 10, 0) width = 500 height = 500 window = tk.Tk() window.title("Moving image") canvas = tk.Canvas(window, width=500, height=500) canvas.pack() my_image = tk.PhotoImage(file="pix.png") img = canvas.create_image(260, 125, anchor=tk.NW, image=my_image) window.bind("<Up>", up) window.bind("<Down>", down) window.bind("<Left>", left) window.bind("<Right>", right) window.mainloop()
Puisque le character
est une variable locale dans la fonction play()
, il n'est pas accessible dans la fonction up()
.
Cependant, vous pouvez utiliser l'option tags
de create_image()
:
def up(event): canvas.move('character',0,-10) # use tag 'character'
Ensuite, vous pouvez faire référence à cet élément d'image en utilisant la même balise:
def play(): ... canvas.create_image(556,304,anchor=CENTER,image=character_image, tags='character')
merci pour la réponse, j'ai réalisé que je n'avais pas globalement la variable de character
, mais dans mon cas ce n'est pas une variable, mais plutôt un objet à l'intérieur d'une classe, je ne sais pas pourquoi et je ne peux pas le changer. Mais je pense que les tags
fonctionneront de toute façon, donc ce n'est plus un problème. Modifier - La fonction de tags
a fonctionné et le programme fonctionne maintenant comme prévu, merci.
create_image()
renvoie un identifiant entier, pas un objet à l'intérieur d'une classe.
visual studio marque le character
comme un objet et le transforme en cyan.
Voir doc . Et vous pouvez également exécuter print(type(character))
et il renvoie <class 'int'>
.
create_image
ne transforme rien en objet. Il renvoie simplement un identifiant entier. L'objet d'origine est inchangé. character
n'est pas défini car c'est une variable locale et donc uniquement visible dans la méthode qui l'a créé.
Veuillez envisager de réviser le code que vous avez publié dans cette question. Nous n'avons pas besoin de 5 fichiers image différents (non fournis), ni de
pygame
sonpygame
pour répondre à une question sur les images; de plus, lecharacter
variable n'est pas défini et le code ne peut pas s'exécuter! Voici une excellente ressource pour vous aider à démarrer. Bonne chance avec votre code!