-2
votes

Tkinter faisant de la variable image une classe

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()


1 commentaires

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 son pygame pour répondre à une question sur les images; de plus, le character 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!


3 Réponses :


0
votes

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:

entrez la description de l'image ici

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()


0 commentaires

0
votes

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')


4 commentaires

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'> .



0
votes

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éé.


0 commentaires