Jul 03, 2024

Wiki

Python

Aide

edit SideBar

Search

Une Touche Pour Quitter


Le deuxième programme

Notre deuxième programme fenetre2.py ouvre une fenêtre graphique comme dans le tp1, mais attend que l'utilisateur appuie sur la touche q pour quitter :

  from OpenGL.GL import *
  from OpenGL.GLUT import *
  from OpenGL.GLU import *
  import sys

  def clavier(*args):
      if args[0] == 'q':
          sys.exit()

  def main():
      glutInit(sys.argv)
      glutInitDisplayMode(GLUT_RGB)
      glutInitWindowPosition(200,200)
      glutInitWindowSize(250,250)
      glutCreateWindow("Deuxieme Programme")
      glutKeyboardFunc(clavier)
      glutMainLoop()

  main()

A propos des événements

On a vu dans le tp précédent que la fonction glutMainLoop() lance la boucle d'attente des événements. On doit associer des fonctions à ces différents types d'événements.

Par exemple, on veut que la touche q arrête le programme, c'est-à-dire qu'un événement provenant du clavier interrompe la boucle principale.

On précise donc à OpenGL que la fonction détaillant ce qu'il faut faire lorqu'un événement clavier est signalé s'appelle clavier :

  glutKeyboardFunc(clavier)

Sur la fonction associée à glutKeyboardFunc

Cette fonction clavier (peu importe son nom) est forcément de ce type :

  def clavier(*args):

Vous pouvez remarquer, dans notre programme, qu'à aucun moment on ne s'est occupé de la variable args. Pourtant, dans la fonction clavier, on trouve uniquement

  if args[0] == 'q':
      sys.exit()

C'est qu'openGL attend (sans qu'on ait besoin de lui dire) qu'une touche soit appuyée, relève la valeur de la touche, et lance la fonction clavier avec en argument tout ce qui faut. Vous n'avez rien à faire...

En fait, args est une liste de trois éléments :

  • args[0] contient le caractère saisi au clavier,
  • args[1] l'abscisse de la souris au moment où la touche a été saisie,
  • et args[2] l'ordonnée de la souris à ce moment donné.

Vous pouvez remplacer la précédente fonction par

    def keyboard(*args):
        if args[0] == 'q':
            sys.exit()
        print args[0], args[1], args[2]

pour vous en rendre compte.

Cas des touches spéciales

Pour les touches "spéciales", on utilise glutSpecialFunc() au lieu de glutKeyboardFunc().

C'est ainsi que l'on peut gérer les F1 à F12, les touches de direction et de défilement, comme le prouve le programme suivant :

  from OpenGL.GL import *
  from OpenGL.GLUT import *
  from OpenGL.GLU import *
  import sys

  def special(*args):
      if args[0] == GLUT_KEY_F1:

et souris_x et souris_y sont les coordonnées de la souris par rapport à la fenêtre.

  def main():
      glutInit(sys.argv)
      glutInitDisplayMode(GLUT_RGB)
      glutInitWindowPosition(200,200)
      glutInitWindowSize(250,250)
      glutCreateWindow("Touches Speciales")
      glutSpecialFunc(special)
      glutMainLoop()

  main()

Les autres touches spéciales sont : GLUT_KEY_LEFT, GLUT_KEY_UP, GLUT_KEY_RIGHT, GLUT_KEY_DOWN, GLUT_KEY_INSERT, GLUT_KEY_PAGE_DOWN, GLUT_KEY_HOME, GLUT_KEY_END.

Les événements liés à la souris

On procédera de même pour gérer les événements liés à la souris :

glutMouseFunc()
Définit la fonction à appeler lorsqu'un bouton de la souris est appuyé ou relâché. La fonction utilisateur a pour argument une liste ayant quatre termes :
  • le premier peut valoir GLUT_LEFT_BUTTON, GLUT_MIDDLE_BUTTON, ou GLUT_RIGHT_BUTTON, et correspond au bouton de la souris concerné par l'événement,
  • le deuxième vaut GLUT_UP ou GLUT_LEFT_BUTTON, GLUT_MIDDLE_BUTTON peut valoir le premier GLUT_DOWN, et signale si ledit bouton a été appuyé ou relaché,
  • Enfin, les deux derniers éléments de la liste correspond aux coordonnées de la souris au moment de l'événement.
glutPassiveMotionFunc()
Définit la fonction à appeler lorsque la souris bouge. L'argument de la fonction est la liste des coordonnées de la souris.
glutMotionFunc()
Même chose que la précédente, sauf que la fonction utilisateur ne sera appelée que si la souris bouge et qu'un bouton est appuyé (comme dans un drag'n drop, par exemple).

Les autres événements

On procédera encore de même pour gérer les événements liés à l'affichage, à l'aide de la fonction glutDisplayFunc() que l'on utilisera dans le prochain TP.

A propos de glutReshapeFunc()

Signalons aussi que glutReshapeFunc() sert à préciser à OpenGL ce qu'il doit faire si la fenêtre est redimentionnée. C'est aussi dans cette fonction que l'on détaille la manière de projeter notre scène 3d à l'écran.

A propos de glutIdleFunc()

Signalons encore que glutIdleFunc() est une fonction très utile pour les animations : elle définit ce qui doit être fait quand il n'y a pas d'événement particulier.

Par exemple, si vous voulez qu'un petit bonhomme se déplace aléatoirement sur l'écran, indépendamment de votre propre déplacement...

glutCreateMenu()

Enfin, il y a glutCreateMenu(), dont la signification est évidente, et quelques autres fonctions que vous découvrirez forcément en pratiquant OpenGL.

Page Actions

Recent Changes

Group & Page

Back Links