IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Programmation multimédia/Jeux Python Discussion :

probleme pygame event [Python 3.X]


Sujet :

Programmation multimédia/Jeux Python

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 70
    Points : 45
    Points
    45
    Par défaut probleme pygame event
    Bonsoir,

    je suis en train de programmer un jeu d'escape game avec pygame, cela va fonctionner avec la recherche de numéros cachés sur une image et résoudre des énigmes. Pour saisir les numéros, j'utilise un digicode : je sais que je pourrais utiliser le pavé numérique pour plus de facilité.
    Mon problème est que lorsque je clique sur le digicode, je peux faire un print de chaque bouton mais pas de 2 chiffre ou plus.
    j'arrive à afficher 1, 2, 3, 4, etc... séparément, Ce que je voudrais faire c'est par exemple afficher 15 après avoir cliqué sur 1 puis 5 et pour finir sur "ok". Et avec "cancel", faire un reset de ce que l'on vient de saisir avant.

    voici mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
     
    import pygame,sys
    import time
    from pygame.locals import *
     
    pygame.display.init()
    ecran = pygame.display.set_mode((1920, 1080)) #Crée la fenêtre de tracé
    ecran.fill((127,127,127))
    bg = pygame.image.load("images/plan_1.png") #charge une image à partir d'un fichier
    bg= pygame.transform.scale(bg, (1280, 720))
    ecran.blit(bg, (0,0)) #Colle l'image en haut à gauche de la fenêtre de tracé (ici, l'ecran)
    pygame.display.flip() #L'affichage devient effectif : l'image est rendue visible.
     
     
    buttons=[]
    # Create Buttons
    buttons.append({ "image" : pygame.image.load("images/1.png"), "position" : (1350, 25)})
    buttons.append({ "image" : pygame.image.load("images/2.png"), "position" : (1540, 25)})
    buttons.append({ "image" : pygame.image.load("images/3.png"), "position" : (1730, 25)})
    buttons.append({ "image" : pygame.image.load("images/4.png"), "position" : (1350, 215)})
    buttons.append({ "image" : pygame.image.load("images/5.png"), "position" : (1540, 215)})
    buttons.append({ "image" : pygame.image.load("images/6.png"), "position" : (1730,215)})
    buttons.append({ "image" : pygame.image.load("images/7.png"), "position" : (1350, 405)})
    buttons.append({ "image" : pygame.image.load("images/8.png"), "position" : (1540, 405)})
    buttons.append({ "image" : pygame.image.load("images/9.png"), "position" : (1730, 405)})
    buttons.append({ "image" : pygame.image.load("images/cancel.png"), "position" : (1350, 595)})
    buttons.append({ "image" : pygame.image.load("images/0.png"), "position" : (1540, 595)})
    buttons.append({ "image" : pygame.image.load("images/ok.png"), "position" : (1730, 595)})
     
    def drawButtons():
      for button in buttons:
        ecran.blit(button["image"], button["position"])
     
    def event_mouse():
        for button in buttons:
            but_img = button['image']
            buttonSize = button['image'].get_rect().size
            buttonPosition = button['position']
            return but_img
     
    def click_button(but_img):
        nbre="" # j'ai mis ceci car UnboundLocalError: local variable 'nbre' referenced before assignment
        if event.type == pygame.MOUSEBUTTONDOWN:
            x, y = event.pos
            if but_img.get_rect(topleft=(1350, 25)).collidepoint(x,y):
                nbre="1"
            if but_img.get_rect(topleft=(1540, 25)).collidepoint(x,y):
                nbre="2"
            if but_img.get_rect(topleft=(1730, 25)).collidepoint(x,y):
                nbre="3"
            if but_img.get_rect(topleft=(1350, 215)).collidepoint(x,y):
                nbre="4"
            if but_img.get_rect(topleft=(1540, 215)).collidepoint(x,y):
                nbre="5"
            if but_img.get_rect(topleft=(1730, 215)).collidepoint(x,y):
                nbre="6"
            if but_img.get_rect(topleft=(1350, 405)).collidepoint(x,y):
                nbre="7"
            if but_img.get_rect(topleft=(1540, 405)).collidepoint(x,y):
                nbre="8"
            if but_img.get_rect(topleft=(1730, 405)).collidepoint(x,y):
                nbre="9"
            if but_img.get_rect(topleft=(1350, 595)).collidepoint(x,y):
                nbre="cancel"
            if but_img.get_rect(topleft=(1540, 595)).collidepoint(x,y):
                nbre="0"
            if but_img.get_rect(topleft=(1730, 595)).collidepoint(x,y):
                nbre="ok"
            print(nbre)
     
     
    loop=True
     
    while loop: #Boucle d'événements
        time.sleep(0.1)
     
        for event in pygame.event.get(): #parcours de la liste des événements
            if(event.type==pygame.QUIT or ( event.type==pygame.KEYDOWN and event.key==pygame.K_ESCAPE)): #interrompt la boucle si nécessaire
                loop = False
     
            drawButtons()
            click_button(event_mouse())
     
     
     
        pygame.display.update()
    pygame.quit()
     
    loop = True
    Pouvez-vous m'aider?
    Merci

  2. #2
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 896
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 896
    Points : 219 548
    Points
    219 548
    Billets dans le blog
    125
    Par défaut
    Bonjour,

    La variable contenant l'entrée de l'utilisateur doit être mis à jour à chaque appuie (et doit donc s'utiliser comme une liste de chiffre).
    Par exemple :
    Si on tente d'afficher ça, on a la chaîne de caractères "13". Chaîne qui peut s'utiliser comme un tableau, que l'on va parcourir pour faire l'affichage dans le jeu.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 70
    Points : 45
    Points
    45
    Par défaut
    Bonjour,

    c'est ce que j'avais fais, mais je n'avais qu'un chiffre qui s'affichait : à cause du debut de ma fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    def click_button(but_img):
        nbre="" # j'ai mis ceci car UnboundLocalError: local variable 'nbre' referenced before assignment
    j'ai mis nbre="" au debut du programme, et remplacer la ligne par global nbre

    Merci

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 70
    Points : 45
    Points
    45
    Par défaut
    Bonjour,
    J'ai reouvert le fil, car j'ai un nouveau problème : dans ma fonction affiche_texte(nbre).

    TypeError: object of type 'NoneType' has no len()
    au niveau de nb_char=len(nbre).

    j'ai même mis nb_char=len(nbre) à la fin de la fonction click_button(but_img) et global nb_char dans affiche_texte(nbre),

    mais cette fois ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ecran.fill((127,127,127),(0,720,(nb_char)*27,49))
    NameError: name 'nb_char' is not defined

    voici mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    import pygame,sys
    import time
    from pygame.locals import *
     
    pygame.init()
    pygame.display.init()
    ecran = pygame.display.set_mode((1920, 1080)) #Crée la fenêtre de tracé
    ecran.fill((127,127,127))
    bg = pygame.image.load("images/plan_1.png") #charge une image à partir d'un fichier
    bg= pygame.transform.scale(bg, (1280, 720))
    ecran.blit(bg, (0,0)) #Colle l'image en haut à gauche de la fenêtre de tracé (ici, l'ecran)
    pygame.display.flip() #L'affichage devient effectif : l'image est rendue visible.
     
     
     
     
    buttons=[]
    # Create Buttons
    buttons.append({ "image" : pygame.image.load("images/1.png"), "position" : (1350, 25)})
    buttons.append({ "image" : pygame.image.load("images/2.png"), "position" : (1540, 25)})
    buttons.append({ "image" : pygame.image.load("images/3.png"), "position" : (1730, 25)})
    buttons.append({ "image" : pygame.image.load("images/4.png"), "position" : (1350, 215)})
    buttons.append({ "image" : pygame.image.load("images/5.png"), "position" : (1540, 215)})
    buttons.append({ "image" : pygame.image.load("images/6.png"), "position" : (1730,215)})
    buttons.append({ "image" : pygame.image.load("images/7.png"), "position" : (1350, 405)})
    buttons.append({ "image" : pygame.image.load("images/8.png"), "position" : (1540, 405)})
    buttons.append({ "image" : pygame.image.load("images/9.png"), "position" : (1730, 405)})
    buttons.append({ "image" : pygame.image.load("images/cancel.png"), "position" : (1350, 595)})
    buttons.append({ "image" : pygame.image.load("images/0.png"), "position" : (1540, 595)})
    buttons.append({ "image" : pygame.image.load("images/ok.png"), "position" : (1730, 595)})
     
    def drawButtons():
     
      for button in buttons:
        ecran.blit(button["image"], button["position"])
     
    nbre=""
    police = pygame.font.SysFont('dejavuserif.ttf', 72)
    del_lettre=False
    loop = True
     
    def event_mouse():
        for button in buttons:
            but_img = button['image']
            buttonSize = button['image'].get_rect().size
            buttonPosition = button['position']
            return but_img
     
    def click_button(but_img):
        global nbre,police
     
        if event.type == pygame.MOUSEBUTTONDOWN:
            x, y = event.pos
            if but_img.get_rect(topleft=(1350, 25)).collidepoint(x,y):
                nbre+="1"
            elif but_img.get_rect(topleft=(1540, 25)).collidepoint(x,y):
                nbre+="2"
            elif but_img.get_rect(topleft=(1730, 25)).collidepoint(x,y):
                nbre+="3"
            elif but_img.get_rect(topleft=(1350, 215)).collidepoint(x,y):
                nbre+="4"
            elif but_img.get_rect(topleft=(1540, 215)).collidepoint(x,y):
                nbre+="5"
            elif but_img.get_rect(topleft=(1730, 215)).collidepoint(x,y):
                nbre+="6"
            elif but_img.get_rect(topleft=(1350, 405)).collidepoint(x,y):
                nbre+="7"
            elif but_img.get_rect(topleft=(1540, 405)).collidepoint(x,y):
                nbre+="8"
            elif but_img.get_rect(topleft=(1730, 405)).collidepoint(x,y):
                nbre+="9"
            elif but_img.get_rect(topleft=(1350, 595)).collidepoint(x,y):
                del_lettre = True
                nbre=nbre[:-1]
            elif but_img.get_rect(topleft=(1540, 595)).collidepoint(x,y):
                nbre+="0"
            elif but_img.get_rect(topleft=(1730, 595)).collidepoint(x,y):
                nbre+="ok"
            else:
                nbre+=""
            return nbre
     
    def affiche_texte(nbre):
    '''Fonction qui doit afficher les chiffres saisi par le digicode et si on supprime une lettre
        global del_lettre
        print("lettre=",del_lettre)
        nb_char=len(nbre)
        image_texte = police.render ( nbre, 1 , (255,255,255) )
        text=ecran.blit(image_texte, (0,720))    
        pygame.display.update()
        if del_lettre==True:
            ecran.fill((127,127,127),(0,720,(nb_char)*27,49))
            image_texte = police.render ( nbre, 1 , (255,255,255) )
            text=ecran.blit(image_texte, (0,720))    
        pygame.display.update()
        return text
     
    while loop: #Boucle d'événements
        time.sleep(0.1)
     
        for event in pygame.event.get(): #parcours de la liste des événements
            if(event.type==pygame.QUIT or ( event.type==pygame.KEYDOWN and event.key==pygame.K_ESCAPE)): #interrompt la boucle si nécessaire
                loop = False
     
        drawButtons() # affiche les boutons
        texte=click_button(event_mouse())
    Pouvez vous m'aider.
    Merci

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 70
    Points : 45
    Points
    45
    Par défaut
    Il y a une chose que je ne comprend pas.
    C'est que si dans ecran.fill((127,127,127),(0,720,(nb_char)*27,49)), je remplace nb_char par len(nbre)+1 cela fonctionne.

  6. #6
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 896
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 896
    Points : 219 548
    Points
    219 548
    Billets dans le blog
    125
    Par défaut
    Je ne vois pas l'appel à affiche_texte. Peut être le paramètre est incorrect.
    Sinon, le len(nbre)+1 fonctionne, car il y a le +1. Si la partie à gauche ne donne pas de résultat correct, il est possible que le +1 rattrape la chose est fasse que le résultat soit 1.

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 70
    Points : 45
    Points
    45
    Par défaut
    Bonjour,

    Je n'avais pas mis mon code en entier.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    import pygame,sys
    import time
    from pygame.locals import *
     
    pygame.init()
    pygame.display.init()
    ecran = pygame.display.set_mode((1920, 1080)) #Crée la fenêtre de tracé
    ecran.fill((127,127,127))
    bg = pygame.image.load("images/plan_1.png") #charge une image à partir d'un fichier
    bg= pygame.transform.scale(bg, (1280, 720))
    ecran.blit(bg, (0,0)) #Colle l'image en haut à gauche de la fenêtre de tracé (ici, l'ecran)
    pygame.display.flip() #L'affichage devient effectif : l'image est rendue visible.
     
     
     
     
    buttons=[]
    # Create Buttons
    buttons.append({ "image" : pygame.image.load("images/1.png"), "position" : (1350, 25)})
    buttons.append({ "image" : pygame.image.load("images/2.png"), "position" : (1540, 25)})
    buttons.append({ "image" : pygame.image.load("images/3.png"), "position" : (1730, 25)})
    buttons.append({ "image" : pygame.image.load("images/4.png"), "position" : (1350, 215)})
    buttons.append({ "image" : pygame.image.load("images/5.png"), "position" : (1540, 215)})
    buttons.append({ "image" : pygame.image.load("images/6.png"), "position" : (1730,215)})
    buttons.append({ "image" : pygame.image.load("images/7.png"), "position" : (1350, 405)})
    buttons.append({ "image" : pygame.image.load("images/8.png"), "position" : (1540, 405)})
    buttons.append({ "image" : pygame.image.load("images/9.png"), "position" : (1730, 405)})
    buttons.append({ "image" : pygame.image.load("images/cancel.png"), "position" : (1350, 595)})
    buttons.append({ "image" : pygame.image.load("images/0.png"), "position" : (1540, 595)})
    buttons.append({ "image" : pygame.image.load("images/ok.png"), "position" : (1730, 595)})
     
    def drawButtons():
     
      for button in buttons:
        ecran.blit(button["image"], button["position"])
     
    nbre=""
    police = pygame.font.SysFont('dejavuserif.ttf', 72)
    del_lettre=False
    loop = True
     
    def event_mouse():
        for button in buttons:
            but_img = button['image']
            buttonSize = button['image'].get_rect().size
            buttonPosition = button['position']
            return but_img
     
    def click_button(but_img):
        global nbre,police
     
        if event.type == pygame.MOUSEBUTTONDOWN:
            x, y = event.pos
            if but_img.get_rect(topleft=(1350, 25)).collidepoint(x,y):
                nbre+="1"
            elif but_img.get_rect(topleft=(1540, 25)).collidepoint(x,y):
                nbre+="2"
            elif but_img.get_rect(topleft=(1730, 25)).collidepoint(x,y):
                nbre+="3"
            elif but_img.get_rect(topleft=(1350, 215)).collidepoint(x,y):
                nbre+="4"
            elif but_img.get_rect(topleft=(1540, 215)).collidepoint(x,y):
                nbre+="5"
            elif but_img.get_rect(topleft=(1730, 215)).collidepoint(x,y):
                nbre+="6"
            elif but_img.get_rect(topleft=(1350, 405)).collidepoint(x,y):
                nbre+="7"
            elif but_img.get_rect(topleft=(1540, 405)).collidepoint(x,y):
                nbre+="8"
            elif but_img.get_rect(topleft=(1730, 405)).collidepoint(x,y):
                nbre+="9"
            elif but_img.get_rect(topleft=(1350, 595)).collidepoint(x,y):
                del_lettre = True
                nbre=nbre[:-1]
            elif but_img.get_rect(topleft=(1540, 595)).collidepoint(x,y):
                nbre+="0"
            elif but_img.get_rect(topleft=(1730, 595)).collidepoint(x,y):
                nbre+="ok"
            else:
                nbre+=""
            return nbre
     
    def affiche_texte(nbre):
    '''Fonction qui doit afficher les chiffres saisi par le digicode et si on supprime une lettre'''
        global del_lettre
        print("lettre=",del_lettre)
        nb_char=(len(nbre)+1)
        image_texte = police.render ( nbre, 1 , (255,255,255) )
        text=ecran.blit(image_texte, (0,720))    
        pygame.display.update()
        if del_lettre==True:
            ecran.fill((127,127,127),(0,720,(nb_char)*27,49))
            image_texte = police.render ( nbre, 1 , (255,255,255) )
            text=ecran.blit(image_texte, (0,720))    
        pygame.display.update()
        return text
     
    while loop: #Boucle d'événements
        time.sleep(0.1)
     
        for event in pygame.event.get(): #parcours de la liste des événements
            if(event.type==pygame.QUIT or ( event.type==pygame.KEYDOWN and event.key==pygame.K_ESCAPE)): #interrompt la boucle si nécessaire
                loop = False
     
        drawButtons() # affiche les boutons
        texte=click_button(event_mouse())
        affiche_texte(texte)
     
        pygame.display.update()
        clock.tick(60)
    pygame.quit()
    erreur : TypeError: object of type 'NoneType' has no len()
    comme je le dis si je mets ecran.fill((127,127,127),(0,720,(len(nbre)+1)*27,49)) le programme fonctionne.

  8. #8
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 201
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 201
    Points : 4 665
    Points
    4 665
    Par défaut
    bonjour

    c'est ce qui a été dit plus haut : nbre(==texte) est null, ligne 107 texte=click_button(event_mouse()) ta variable texte est vide(pire: pas allouée) ...

    A toi de controler dans un premier temps que event_mouse() retourne ce que tu désires (vu le code j'ai un doute), et si event_mouse() est ok alors tester click_button()

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 70
    Points : 45
    Points
    45
    Par défaut
    Bonjour,
    je n'ai toujours pas réussi à résoudre le problème de erreur : TypeError: object of type 'NoneType' has no len()

    j'ai un autre problème, peu être lié à mon erreur précédente.

    Voici mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
     
    import pygame
    import sys
    import time
    from pygame.locals import *
     
    pygame.init()
    pygame.display.init()
    ecran = pygame.display.set_mode((1920, 1080))   # Crée la fenêtre de tracé
    ecran.fill((127,127,127))
    bg = pygame.image.load("images/plan_1.png") #charge une image à partir d'un fichier
    bg= pygame.transform.scale(bg, (1280, 720))
    ecran.blit(bg, (0,0)) #Colle l'image en haut à gauche de la fenêtre de tracé (ici, l'ecran)
    pygame.display.flip() #L'affichage devient effectif : l'image est rendue visible.
    clock = pygame.time.Clock()
     
     
     
    buttons=[]
    # Create Buttons
    buttons.append({ "image" : pygame.image.load("images/1.png"), "position" : (1350, 25)})
    buttons.append({ "image" : pygame.image.load("images/2.png"), "position" : (1540, 25)})
    buttons.append({ "image" : pygame.image.load("images/3.png"), "position" : (1730, 25)})
    buttons.append({ "image" : pygame.image.load("images/4.png"), "position" : (1350, 215)})
    buttons.append({ "image" : pygame.image.load("images/5.png"), "position" : (1540, 215)})
    buttons.append({ "image" : pygame.image.load("images/6.png"), "position" : (1730,215)})
    buttons.append({ "image" : pygame.image.load("images/7.png"), "position" : (1350, 405)})
    buttons.append({ "image" : pygame.image.load("images/8.png"), "position" : (1540, 405)})
    buttons.append({ "image" : pygame.image.load("images/9.png"), "position" : (1730, 405)})
    buttons.append({ "image" : pygame.image.load("images/cancel.png"), "position" : (1350, 595)})
    buttons.append({ "image" : pygame.image.load("images/0.png"), "position" : (1540, 595)})
    buttons.append({ "image" : pygame.image.load("images/ok.png"), "position" : (1730, 595)})
     
    def drawButtons():
     
      for button in buttons:
        ecran.blit(button["image"], button["position"])
     
    nbre=""
    police = pygame.font.SysFont(None, 72)
    del_lettre=False
    validate=False
    loop = True
     
    def create_button():
        for button in buttons:
            but_img = button['image']
            buttonSize = button['image'].get_rect().size
            buttonPosition = button['position']
            return but_img
     
    def click_button(but_img):
        global nbre,police,del_lettre
     
        if event.type == pygame.MOUSEBUTTONDOWN:
            x, y = event.pos
            if but_img.get_rect(topleft=(1350, 25)).collidepoint(x,y):
                nbre+="1"
            elif but_img.get_rect(topleft=(1540, 25)).collidepoint(x,y):
                nbre+="2"
            elif but_img.get_rect(topleft=(1730, 25)).collidepoint(x,y):
                nbre+="3"
            elif but_img.get_rect(topleft=(1350, 215)).collidepoint(x,y):
                nbre+="4"
            elif but_img.get_rect(topleft=(1540, 215)).collidepoint(x,y):
                nbre+="5"
            elif but_img.get_rect(topleft=(1730, 215)).collidepoint(x,y):
                nbre+="6"
            elif but_img.get_rect(topleft=(1350, 405)).collidepoint(x,y):
                nbre+="7"
            elif but_img.get_rect(topleft=(1540, 405)).collidepoint(x,y):
                nbre+="8"
            elif but_img.get_rect(topleft=(1730, 405)).collidepoint(x,y):
                nbre+="9"
            elif but_img.get_rect(topleft=(1350, 595)).collidepoint(x,y):
                del_lettre = True
                nbre=nbre[:-1]
            elif but_img.get_rect(topleft=(1540, 595)).collidepoint(x,y):
                nbre+="0"
            elif but_img.get_rect(topleft=(1730, 595)).collidepoint(x,y):
                validate=True
                print(validation(nbre))
                print(len(nbre)
                del_lettre=True
                nbre=nbre[:-(len(nbre))]
                affiche_texte(nbre)
     
            else:
                nbre+=""
            return nbre
     
    def affiche_texte(nbre):
        global del_lettre
        image_texte = police.render ( nbre, True , (255,255,255) )
        text=ecran.blit(image_texte, (0,720))    
        pygame.display.update()
        if del_lettre == True:
            ecran.fill((127,127,127),(0,720,(len(nbre)+1)*72,49))
            image_texte = police.render ( nbre, True , (255,255,255))
            text=ecran.blit(image_texte, (0,720))
            del_lettre=False    
            pygame.display.update()
        return text
     
    def validation(nbre):
        global validate
        if validate==True:
            print("le nombre validé est : ",nbre)
            print("nombre validé")
            validate=False
        return nbre
     
    while loop: #Boucle d'événements
     
        for event in pygame.event.get(): #parcours de la liste des événements
            if(event.type==pygame.QUIT or ( event.type==pygame.KEYDOWN and event.key==pygame.K_ESCAPE)): #interrompt la boucle si nécessaire
                loop = False
     
        drawButtons()
        texte=click_button(create_button())
        affiche_texte(texte)
     
        pygame.display.update()
        clock.tick(60)
    pygame.quit()
    dans la partie suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    elif but_img.get_rect(topleft=(1730, 595)).collidepoint(x,y):
                validate=True
                print(validation(nbre))
                prin(len(nbre))
                del_lettre=True
                nbre=nbre[:-(len(nbre))]
                affiche_texte(nbre)
    si je saisi un numéro supérieur à 3 chiffres, il y a un effacement de 2 chiffres seulement
    pourtant j'ai mis un print(len(nbre)) qui correspond bien au nombre de caractères affichés
    merci pour votre aide

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 70
    Points : 45
    Points
    45
    Par défaut
    Je pense avoir trouvé la solution :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    [...]
    elif but_img.get_rect(topleft=(1730, 595)).collidepoint(x,y):
                validation()
                nbre=""
    [...]
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    def validation():
        global nbre
        ecran.fill((127,127,127), (0,720,(len(nbre)+1)*30,49))

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 70
    Points : 45
    Points
    45
    Par défaut
    J'ai modifié une partie de mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    def draw():
        for button in buttons:
            ecran.blit(button['image'],button['position'])
        for button in buttons:
            but_img = button['image']
            buttonSize = button['image'].get_rect().size
            buttonPosition = button['position']
            return but_img
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    texte=click_button(draw())
    y a t'il un moyen de n'utiliser qu'une boucle for au lieu de 2?

    et par la même occasion pour la partie du code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
            if but_img.get_rect(topleft=(1350, 25)).collidepoint(x,y):
                nbre+="1"
            elif but_img.get_rect(topleft=(1540, 25)).collidepoint(x,y):
                nbre+="2"
            elif but_img.get_rect(topleft=(1730, 25)).collidepoint(x,y):
                nbre+="3"
            elif but_img.get_rect(topleft=(1350, 215)).collidepoint(x,y):
                nbre+="4"
            elif but_img.get_rect(topleft=(1540, 215)).collidepoint(x,y):
                nbre+="5"
            elif but_img.get_rect(topleft=(1730, 215)).collidepoint(x,y):
                nbre+="6"
            elif but_img.get_rect(topleft=(1350, 405)).collidepoint(x,y):
                nbre+="7"
            elif but_img.get_rect(topleft=(1540, 405)).collidepoint(x,y):
                nbre+="8"
            elif but_img.get_rect(topleft=(1730, 405)).collidepoint(x,y):
                nbre+="9"
            elif but_img.get_rect(topleft=(1350, 595)).collidepoint(x,y):
                del_lettre = True
                nbre=nbre[:-1]
            elif but_img.get_rect(topleft=(1540, 595)).collidepoint(x,y):
                nbre+="0"
            elif but_img.get_rect(topleft=(1730, 595)).collidepoint(x,y):
                validation(nbre)
                nbre=""
            else:
                nbre+=""
    j'avais pensé utiliser 2 boucles for imbriquées pour reduire le nombre de lignes de code
    et utiliser une matrice mat_nbre=[["1","2","3"],["4","5","6"],["7","8","9"],[nbre[:-1],"0",""].
    Pensez-vous que c'est une bonne idée?

    Pour éviter les variables globales, je sais qu'il faut utiliser la programmation orienté objet. Je n'ai jamais etudié la POO, je connais principalement comme langage de programmation le Basic, le C et Python.
    Ils utilisent des variables globles, pour le C et Python, il peut y avoir utilisation de variables locales dans les fonctions.
    Mais selon les cas, il est impossible de ne pas utiliser des variables globales.

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 70
    Points : 45
    Points
    45
    Par défaut
    Bonsoir,
    Je n'arrive pas à afficher le texte dans la fenetre.

    voici mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
     
    import pygame
    import os
    import sys
    import time
    from pygame.locals import *
     
    pygame.init()
    pygame.display.init()
    ecran = pygame.display.set_mode((1920, 1080))   # Crée la fenêtre de tracé
    ecran.fill((127,127,127))
    bg = pygame.image.load("images/plan_1.png") #charge une image à partir d'un fichier
    bg= pygame.transform.scale(bg, (1280, 720)) #1280,720
    ecran.blit(bg, (0,0)) #Colle l'image en haut à gauche de la fenêtre de tracé (ici, l'ecran)
    pygame.display.flip() #L'affichage devient effectif : l'image est rendue visible.
    clock = pygame.time.Clock()
    nbre=""
    card =""
    police = pygame.font.Font(None, 72)
    del_lettre=False
    loop = True 
    cards=25
     
     
    buttons=[]
    # Create Buttons
    buttons.append({ "image" : pygame.image.load("images/1.png"), "position" : (1350, 25)})
    buttons.append({ "image" : pygame.image.load("images/2.png"), "position" : (1540, 25)})
    buttons.append({ "image" : pygame.image.load("images/3.png"), "position" : (1730, 25)})
    buttons.append({ "image" : pygame.image.load("images/4.png"), "position" : (1350, 215)})
    buttons.append({ "image" : pygame.image.load("images/5.png"), "position" : (1540, 215)})
    buttons.append({ "image" : pygame.image.load("images/6.png"), "position" : (1730,215)})
    buttons.append({ "image" : pygame.image.load("images/7.png"), "position" : (1350, 405)})
    buttons.append({ "image" : pygame.image.load("images/8.png"), "position" : (1540, 405)})
    buttons.append({ "image" : pygame.image.load("images/9.png"), "position" : (1730, 405)})
    buttons.append({ "image" : pygame.image.load("images/cancel.png"), "position" : (1350, 595)})
    buttons.append({ "image" : pygame.image.load("images/0.png"), "position" : (1540, 595)})
    buttons.append({ "image" : pygame.image.load("images/ok.png"), "position" : (1730, 595)})
     
    def draw():
        '''dessine les boutons'''
        for button in buttons:
            ecran.blit(button['image'],button['position'])
        for button in buttons:
            but_img = button['image']
            buttonSize = button['image'].get_rect().size
            buttonPosition = button['position']
            return but_img
     
    def click_button(but_img):
        '''Fonction clique sur bouton'''
        global nbre,del_lettre,card,validate,cards
        if event.type == pygame.MOUSEBUTTONDOWN:
            x, y = event.pos
            if but_img.get_rect(topleft=(1350, 25)).collidepoint(x,y):
                nbre+="1"
            elif but_img.get_rect(topleft=(1540, 25)).collidepoint(x,y):
                nbre+="2"
            elif but_img.get_rect(topleft=(1730, 25)).collidepoint(x,y):
                nbre+="3"
            elif but_img.get_rect(topleft=(1350, 215)).collidepoint(x,y):
                nbre+="4"
            elif but_img.get_rect(topleft=(1540, 215)).collidepoint(x,y):
                nbre+="5"
            elif but_img.get_rect(topleft=(1730, 215)).collidepoint(x,y):
                nbre+="6"
            elif but_img.get_rect(topleft=(1350, 405)).collidepoint(x,y):
                nbre+="7"
            elif but_img.get_rect(topleft=(1540, 405)).collidepoint(x,y):
                nbre+="8"
            elif but_img.get_rect(topleft=(1730, 405)).collidepoint(x,y):
                nbre+="9"
            elif but_img.get_rect(topleft=(1350, 595)).collidepoint(x,y):
                del_lettre = True
                nbre=nbre[:-1]
            elif but_img.get_rect(topleft=(1540, 595)).collidepoint(x,y):
                nbre+="0"
            elif but_img.get_rect(topleft=(1730, 595)).collidepoint(x,y):
                card=validation()
                print(card_verif(card,cards))
                nbre=""
            else:
                nbre+=""
            return nbre
     
    def affiche_texte():
        '''Fonction qui affiche chiffre'''
        global del_lettre,nbre
        image_texte = police.render ( nbre, True , (255,255,255) )
        text=ecran.blit(image_texte, (0,720))    
        pygame.display.update()
        if del_lettre:
            ecran.fill((127,127,127),(0,720,(len(nbre)+1)*30,49))
            image_texte = police.render ( nbre, True , (255,255,255))
            text=ecran.blit(image_texte, (0,720))
            del_lettre=False    
            pygame.display.update()
        return text
     
     
    def validation():
        global nbre
        ecran.fill((127,127,127), (0,720,(len(nbre)+1)*30,49))
        return nbre
     
    def card_verif(card,cards):
        if card==str(cards):
            carte="vous avez trouvé une carte"
        else:
            carte="pas la bonne carte"
        return carte
     
    while loop: #Boucle d'événements
        time.sleep(0.1)
     
        for event in pygame.event.get(): #parcours de la liste des événements
            if(event.type==pygame.QUIT or ( event.type==pygame.KEYDOWN and event.key==pygame.K_ESCAPE)): #interrompt la boucle si nécessaire
                loop = False
     
            if event.type==pygame.KEYDOWN:
     
                if event.key==pygame.K_LEFT:
                    bg = pygame.image.load("images/plan_1.png")  # charge une image à partir d'un fichier
                    bg= pygame.transform.scale(bg, (1280,720)) #1280,720
                    ecran.blit(bg, (0, 0))  # Colle l'image en haut à gauche de la fenêtre de tracé (ici, l'ecran)
                    pygame.display.flip()  # L'affichage devient effectif : l'image est rendue visible.
                    loop = True
     
                if event.key==pygame.K_UP:
                    bg = pygame.image.load("images/plan_2.png")  # charge une image à partir d'un fichier
                    bg= pygame.transform.scale(bg, (1280,720)) #1280,720
                    ecran.blit(bg, (0, 0))  # Colle l'image en haut à gauche de la fenêtre de tracé (ici, l'ecran)
                    pygame.display.flip()  # L'affichage devient effectif : l'image est rendue visible.
                    loop = True
     
                if event.key==pygame.K_RIGHT:
                    bg = pygame.image.load("images/plan_3.png")  # charge une image à partir d'un fichier
                    bg= pygame.transform.scale(bg, (1280,720)) #1280,720
                    ecran.blit(bg, (0, 0))  # Colle l'image en haut à gauche de la fenêtre de tracé (ici, l'ecran)
                    pygame.display.flip()  # L'affichage devient effectif : l'image est rendue visible.
                    loop = True
     
        texte=click_button(draw())
        affiche_texte()
     
        pygame.display.update()
        clock.tick(60)
    pygame.quit()
    Merci pour votre aide.

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 70
    Points : 45
    Points
    45
    Par défaut
    bonjour,

    Pour mon code, il fonctionne très bien sous python 3.8 mais plus sous python 3.10.
    Je viens de voir que sous python 3.8 (pygame 2.0.0) et sous python 3.10 (pygame 2.1.2)
    Je pense que cela doit venir de blit .
    je ne trouve pas de documentation qui explique la différence entre les 2 versions.

    Merci de votre aide

  14. #14
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 70
    Points : 45
    Points
    45
    Par défaut
    Bonjour,

    J'ai trouvé mon erreur, c’était un problème d'indentation pour
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    texte=click_button(draw())
    .

    Merci.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. probleme Key event
    Par champity dans le forum Débuter
    Réponses: 2
    Dernier message: 24/04/2009, 17h11
  2. Probleme avec Events Worksheet_Change
    Par reymat dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 28/02/2009, 09h46
  3. [Irrlicht] Probleme avec event.KeyInput.Key
    Par samiblide dans le forum Irrlicht
    Réponses: 1
    Dernier message: 09/07/2007, 01h46
  4. [WebForms][2.0]MasterPage content, problem d'event
    Par zeavan dans le forum ASP.NET
    Réponses: 3
    Dernier message: 07/11/2006, 17h06
  5. [MFC] Probleme Key Events
    Par vainsoul dans le forum MFC
    Réponses: 11
    Dernier message: 08/08/2005, 12h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo