OpenSesame
Rapunzel Code Editor
DataMatrix
Support forum
Python Tutorials
MindProbe
Supported by

Créer une extension

Qu'est-ce qu'une extension OpenSesame ?

Les Extensions ajoutent des fonctionnalités arbitraires à l'interface utilisateur d'OpenSesame. Par exemple, une extension peut ajouter une nouvelle entrée dans la barre d'outils principale ou dans la barre des menus. (Pour ajouter des fonctionnalités que vous pouvez utiliser dans des expériences, vous avez besoin d'un plugin.)

Fichiers pertinents

Une ou plusieurs extensions sont regroupées dans un paquet d'extension, qui est toujours un sous-paquet de opensesame_extensions (qui est en lui-même un paquet de noms de domaine implicite, mais c'est un détail technique qui n'est pas très important). Disons que votre paquet d'extension s'appelle example, et qu'il contient une seule extension (il peut y en avoir plus) appelée example_extension. Ceci correspondrait à la structure de fichiers et de dossiers suivante:

opensesame_extensions/
    example/
        __init__.py               # peut être vide mais doit exister
        example_extension/
            __init__.py           # contient des informations sur l'extension
            example_extension.py  # contient la classe d'extension

Informations sur l'extension

Les informations sur l'extension sont définies dans le fichier __init__.py du module d'extension, donc dans notre exemple, il s'agit de opensesesame_extensions/example/example_extension/__init__.py.

"""Une chaîne de caractères décrivant l'extension"""

# Un nom d'icône standard
# - <https://specifications.freedesktop.org/icon-naming-spec/icon-naming-spec-latest.html>
icon = 'applications-accessories'
# Le label et l'info-bulle sont utilisés pour créer l'action par défaut, qui est
# insérée dans le menu et/ ou la barre d'outils (ou aucun des deux)
label = "Exemple d'extension"
tooltip = "Exemple d'info-bulle"
menu = {
    "index": -1,
    "separator_before": True,
    "separator_after": True,
    "submenu": "Exemple"
}
toolbar = {
    "index": -1,
    "separator_before": True,
    "separator_after": True
}
# Les paramètres sont stockés de manière persistante dans l'objet cfg
settings = {
    "exemple_setting": "valeur exemple"
}

Une extension peut apparaître dans le menu ou la barre d'outils principale d'OpenSesame. Cela nécessite de définir plusieurs champs dans __init__.py comme indiqué ci-dessus :

  • Le label est le texte qui apparaîtra dans le menu.
  • L'icon est un nom d'icône conforme à freedesktop qui spécifie l'icône qui apparaîtra dans le menu et/ ou la barre d'outils.
  • L'index donne la position de l'extension dans le menu/ barre d'outils, et fonctionne comme un index list. C'est-à-dire que les valeurs négatives sont relatives à la dernière entrée, où -1 place votre extension à la fin.

Pour que votre extension réponde à l'activation du menu/ barre d'outils, implémentez la méthode activate() comme indiqué ci-dessous dans le code de l'extension ci-dessous.

Écrire le code de l'extension

Le code principal de l'extension est placé dans [extension_name].py. Ce fichier contient généralement une seule classe nommée [ExtensionName].py, c'est-à-dire une classe avec l'équivalent CamelCase du nom du plugin, qui hérite de libqtopensesame.extensions.BaseExtension. Ainsi, une classe d'extension de base (non fonctionnelle) ressemble à ceci:

from libopensesame.py3compat import *
from libopensesame.oslogging import oslogger
from libqtopensesame.extensions import BaseExtension

class ExampleExtension(BaseExtension):
    """Un exemple d'extension qui liste plusieurs événements communs. Le nom de la classe
    doit être la version CamelCase du folder_name et du file_name. Donc, dans
    ce cas, le dossier d'extension (qui est un paquet Python) et le
    fichier .py (qui est un module Python) sont appelés example_extension, alors que
    la classe est appelée ExampleExtension.
    """

    def activate(self):
        oslogger.debug("l'extension example_extension a été activée")

    def event_save_experiment(self, path):
        oslogger.debug(f"Événement déclenché: save_experiment(path={path})")

    # Voir le code source de example_extension pour plus d'écouteurs d'événements

Écoute des événements

OpenSesame déclenche des événements chaque fois que quelque chose d'important se produit. Par exemple, l'événement save_experiment est déclenché lorsqu'une expérience est enregistrée. Pour que votre extension écoute un événement, il suffit d'implémenter une méthode avec le nom event_[nom de l'événement] comme indiqué ci-dessus.

Notez que certains événements prennent des arguments de mots-clés, comme path dans le cas de save_experiment. La signature de mots-clés de votre fonction doit correspondre à la signature de mots-clés attendue. Voir la vue d'ensemble des événements ci-dessous pour une liste complète des événements et des mots-clés attendus.

Créer un package et le télécharger sur pypi

Créer un package d'extension et le télécharger sur pypi fonctionne de la même manière que pour les plugins :

Exemples

Pour un exemple fonctionnel, voir :

D'autres exemples peuvent être trouvés dans le dossier opensesame_extensions du code source d'OpenSesame :

Aperçu des événements

Cet aperçu répertorie tous les événements qui sont déclenchés quelque part dans le code et que votre extension peut donc écouter en implémentant les fonctions event_[nomdelévénement]() correspondantes.

change_experiment

Déclenché dans : general_properties.py

extension_manager.fire(u'change_experiment')

change_item

Déclenché dans : sequence.py

extension_manager.fire(u'change_item', name=self.name)

Déclenché dans : qtitem.py

extension_manager.fire(u'change_item', name=self.name)

Déclenché dans : loop.py

extension_manager.fire(u'change_item', name=self.name)

close

Déclenché dans : qtopensesame.py

extension_manager.fire(u'close')

delete_item

Déclenché dans : qtitem_store.py

extension_manager.fire(u'delete_item', name=name)

heartbeat

Déclenché dans : multiprocess_runner.py

extension_manager.fire(u'heartbeat')

ide_jump_to_line

Déclenché dans : SymbolSelector.py

extension_manager.fire('ide_jump_to_line', lineno=lineno)

Déclenché dans : OpenSesameIDE.py

extension_manager.fire('ide_jump_to_line', lineno=line_number)

ide_new_file

Déclenché dans : JupyterNotebook.py

extension_manager.fire(u'ide_new_file', source=code, ext=ext)

ide_save_current_file

Déclenché dans : OpenSesameIDE.py

extension_manager.fire('ide_save_current_file')

image_annotations_detect

Déclenché dans : JupyterNotebook.py

extension_manager.fire(u'image_annotations_detect', code=code)

jupyter_exception_occurred

Déclenché dans : transparent_jupyter_widget.py

extension_manager.fire('jupyter_exception_occurred')

jupyter_execute_finished

Déclenché dans : transparent_jupyter_widget.py

extension_manager.fire('jupyter_execute_finished')

jupyter_execute_result_text

Déclenché dans : transparent_jupyter_widget.py

extension_manager.fire('jupyter_execute_result_text', text=text)

jupyter_execute_start

Déclenché dans : transparent_jupyter_widget.py

extension_manager.fire('jupyter_execute_start')

jupyter_interrupt

Déclenché dans : OpenSesameIDE.py

extension_manager.fire(u'jupyter_interrupt')

jupyter_restart

Déclenché dans : console_bridge.py

extension_manager.fire(u'jupyter_restart')

Déclenché dans : OpenSesameIDE.py

extension_manager.fire(u'jupyter_restart')

jupyter_run_code

Déclenché dans : menubar.py

extension_manager.fire('jupyter_run_code',
                                                     code=command)

jupyter_run_system_command

Déclenché dans : JupyterNotebook.py

extension_manager.fire('jupyter_run_system_command', cmd=cmd)

jupyter_show_prompt

Déclenché dans : console_bridge.py

extension_manager.fire(u'jupyter_show_prompt')

jupyter_write

Déclenché dans : console_bridge.py

extension_manager.fire(u'jupyter_write', msg=s)

new_item

Déclenché dans : tree_overview.py

extension_manager.fire(u'new_item', name=item.name,
                _type=item.item_type)

new_linked_copy

Déclenché dans : tree_overview.py

extension_manager.fire('new_linked_copy', name=item_name)

notify

Déclenché dans : sequence.py

extension_manager.fire(u'notify',
                    message=_(u'Sequence contains non-existing item: %s')

Déclenché dans : qtitem.py

extension_manager.fire(u'notify',
                        message=_(u'"%s" is set to a variable or '
                        u'unknown value and can only be edited through '
                        u'the script.')

Déclenché dans : qtitem.py

extension_manager.fire(u'notify',
                        message=_(u'"%s" is defined using '
                        'variables and can only be edited through the '
                        'script.')

Déclenché dans : qtitem.py

extension_manager.fire(u'notify',
                        message=_(u'"%s" is defined using '
                        u'variables or has an invalid value, and can only be '
                        u'edited through the script.')

Déclenché dans : logger.py

extension_manager.fire(u'notify',
                    message=_(u'You have multiple unlinked loggers. This can lead to messy log files.')

Déclenché dans : sketchpad_widget.py

extension_manager.fire(u'notify', message=notification,
                category=u'info')

open_experiment

Déclenché dans : qtopensesame.py

extension_manager.fire(u'open_experiment', path=path)

open_item

Déclenché dans : qtitem.py

extension_manager.fire(u'open_item', name=self.name)

pause_experiment

Déclenché dans : base_runner.py

extension_manager.fire(u'pause_experiment')

prepare_change_experiment

Déclenché dans : general_properties.py

extension_manager.fire(u'prepare_change_experiment')

prepare_delete_item

Déclenché dans : qtitem_store.py

extension_manager.fire(u'prepare_delete_item', name=name)

prepare_open_item

Déclenché dans : qtitem.py

extension_manager.fire(u'prepare_open_item', name=self.name)

prepare_purge_unused_items

Déclenché dans : unused_widget.py

extension_manager.fire(u'prepare_purge_unused_items')

prepare_regenerate

Déclenché dans : qtopensesame.py

extension_manager.fire(u'prepare_regenerate')

prepare_rename_item

Déclenché dans : qtitem_store.py

extension_manager.fire(u'prepare_rename_item', from_name=from_name,
            to_name=to_name)

purge_unused_items

Déclenché dans : unused_widget.py

extension_manager.fire(u'purge_unused_items')

pyqode_clear_breakpoints

Déclenché dans : OpenSesameIDE.py

extension_manager.fire('pyqode_clear_breakpoints')

pyqode_resume_auto_backend_restart

Déclenché dans : OpenSesameIDE.py

extension_manager.fire('pyqode_resume_auto_backend_restart')

Déclenché dans : OpenSesameIDE.py

extension_manager.fire('pyqode_resume_auto_backend_restart')

Déclenché dans : OpenSesameIDE.py

extension_manager.fire('pyqode_resume_auto_backend_restart')

Déclenché dans : OpenSesameIDE.py

extension_manager.fire('pyqode_resume_auto_backend_restart')

pyqode_select_indentation_mode

Déclenché dans : menubar.py

extension_manager.fire('pyqode_select_indentation_mode')

pyqode_suspend_auto_backend_restart

Déclenché dans : OpenSesameIDE.py

extension_manager.fire('pyqode_suspend_auto_backend_restart')

Déclenché dans : OpenSesameIDE.py

extension_manager.fire('pyqode_suspend_auto_backend_restart')

Déclenché dans : OpenSesameIDE.py

extension_manager.fire('pyqode_suspend_auto_backend_restart')

Déclenché dans : OpenSesameIDE.py

extension_manager.fire('pyqode_suspend_auto_backend_restart')

regenerate

Déclenché dans : qtopensesame.py

extension_manager.fire(u'regenerate')

Déclenché dans : qtopensesame.py

extension_manager.fire(u'regenerate')

register_editor

Déclenché dans : qtplugin.py

extension_manager.fire(u'register_editor', editor=editor)

rename_item

Déclenché dans : qtitem_store.py

extension_manager.fire(u'rename_item', from_name=from_name,
            to_name=to_name)

resume_experiment

Déclenché dans : base_runner.py

extension_manager.fire(u'resume_experiment')

run_experiment_canceled

Déclenché dans : base_runner.py

extension_manager.fire('run_experiment_canceled')

save_experiment

Déclenché dans : qtopensesame.py

extension_manager.fire(u'save_experiment', path=self.current_path)

startup

Déclenché dans : qtopensesame.py

extension_manager.fire(u'startup')

unregister_editor

Déclenché dans : OpenSesameIDE.py

extension_manager.fire('unregister_editor', editor=editor)
Supported by