Partage
  • Partager sur Facebook
  • Partager sur Twitter

Gestion du focus de pygame

Sujet résolu
    14 février 2017 à 16:03:30

    Bonjour, 

    J'ai commencé un programme pygame qui prend les événements et les gère, mais le focus reste bloqué sur la fenêtre pygame. 

    Juste après le lancement, il est encore possible de cliquer en-dehors / sur la croix et de passer sur une autre fenêtre du bureau / de fermer ainsi le programme. 

    Mais dès que l'on clique à l'intérieur de la fenêtre, pygame gère tous les événements comme s'ils se déroulaient à l'intérieur (les tests montrent qu'un event.pos est toujours compris dans (0, 0, largeur, hauteur) même lorsque la souris est en-dehors) et, plus gênant encore que l'impossibilité de changer de fenêtre, le clic sur la croix (censé être un événement event.QUIT) ne fait rien. 

    Voici le code concerné : 

    def main():
       pygame.init()
       # + autres initialisations, variables...
    
       fenetre = pygame.display.set_mode((largeur, hauteur))
       # + autres créations de surfaces, variables...
       
       horloge = pygame.time.Clock()
       continuer = True
       while continuer:
          event = pygame.event.poll()
          if event.type == QUIT:
             continuer = False
          elif event.type == KEYDOWN and event.key == K_ESCAPE:
             continuer = False
          elif event.type == MOUSEMOTION:
             # gestion...
          elif event.type == MOUSEBUTTONDOWN and event.button == 1:
             # gestion...
          horloge.tick(tps)
       pygame.quit()
       return

    Merci d'avance pour votre aide. 

    • Partager sur Facebook
    • Partager sur Twitter
      14 février 2017 à 17:57:23

      Salut,

      Je ne comprend pas, vraiment votre question.

      Avez-vous essayer la fonction, entre vos lignes #10 et #11:

      Si l'utilisateur n'est plus dans la fenêtre (clique extérieur)

      print(pygame.key.get_focused())  ## --> return True(1) or False(0),

      Ensuite,

      Je crois qu'il vous manque le rafraîchissement, juste après votre ligne #20:

      pygame.display.flip()

      Pour finir, si vous ajoutez des print(), un peu partout, peut-être que vous allez voir votre erreur. (Tout fonctionne, chez moi)

      print(event.type, event.key)

      J'ai même essayé avec, un autre type d'event.. si cela peu vous aidez..:

      while continuer:
          for event in pygame.event.get():
              if event.type == pygame.QUIT:
                  continuer = False
          pressed = pygame.key.get_pressed()
      
          if pressed[pygame.K_UP]:
              ...
          elif pressed[pygame.K_DOWN]:
              ...
      
          pygame.display.flip()
      
      pygame.quit()

      J'espère vous avoir aidé un peu ;)

      Bonne Chance

      A+

      -
      Edité par nolimitech 14 février 2017 à 17:58:10

      • Partager sur Facebook
      • Partager sur Twitter
        14 février 2017 à 18:23:54

        Bonjour, 

        En ajoutant des print, voici ce qu'il se passe : après avoir cliqué en-dehors, le get_focused m'indique bien 0, mais si j'ai cliqué une fois à l'intérieur de la fenêtre, même si je clique en-dehors, je suis toujours avec 1 (focus sur la fenêtre). Autrement dit, le problème reste le même : il est impossible de quitter la fenêtre. 

        En affichant event.pos lorsqu'il s'agit d'un mouvement de la souris ou d'un clic, il n'y a aucun affichage lorsque la souris se ballade en-dehors avant d'avoir cliqué à l'intérieur. En revanche, après avoir cliqué dessus (et créé un focus sur l'écran), lorsque la souris bouge en-dehors de celui-ci, la position reste toujours comprise dans (0, 0, largeur, hauteur). Cela signifie que la position de la souris, même si elle devrait être supérieure ou inférieure à ces bornes, est minorée et majorée par celle-ci quelle que soit sa position réelle sur l'écran de l'ordinateur. 

        Je vais essayer d'autres tests, mais pour le moment, je ne vois pas réellement d'issue...

        EDIT : 

        Après avoir testé les ACTIVEEVENT, voici ce qui en ressort : 

         - Au début, lorsque la souris sort, il y a bien un événement ACTIVEEVENT créé avec un gain égal à 0

         - Après avoir cliqué une fois sur la fenêtre, lorsque la souris sort de la fenêtre, l'événement ACTIVEEVENT n'apparaît plus. Pourtant, il n'est pas bloqué par pygame (d'après la fonction pygame.event.get_blocked())

        EDIT 2 : 

        Seul le clic bloque les événements ACTIVEEVENT. 

        Si c'est un événement clavier ou juste un mouvement de la souris, il n'y a pas de problème. Il n'y a que lorsqu'un clic a lieu à l'intérieur de la fenêtre qu'ensuite, les événements ACTIVEEVENT sont bloqués (ce qui empêche de sortir du focus). 

        EDIT 3 : 

        Même lorsque le clic (MOUSEBUTTONDOWN) n'est pas géré par le programme (aucun elif event.type == MOUSEBUTTONDOWN), le problème subsiste. Après avoir cliqué sur la fenêtre, le focus reste bloqué sur celle-ci. 

        EDIT 4 : 

        Après avoir fait quelques tests, il semblerait que l'ajout de la fonction : 

        pygame.event.pump()

        Après la récupération d'un événement suffise pour débloquer le tout. 

        Merci tout de même pour vos conseils. 

        -
        Edité par H.H. 14 février 2017 à 19:34:35

        • Partager sur Facebook
        • Partager sur Twitter

        Gestion du focus de pygame

        × 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.
        • Editeur
        • Markdown