Créer une extension
- Qu'est-ce qu'une extension OpenSesame ?
- Fichiers pertinents
- Informations sur l'extension
- Écrire le code de l'extension
- Écoute des événements
- Créer un package et le télécharger sur pypi
- Exemples
- Aperçu des événements
- change_experiment
- change_item
- close
- delete_item
- heartbeat
- ide_jump_to_line
- ide_new_file
- ide_save_current_file
- image_annotations_detect
- jupyter_exception_occurred
- jupyter_execute_finished
- jupyter_execute_result_text
- jupyter_execute_start
- jupyter_interrupt
- jupyter_restart
- jupyter_run_code
- jupyter_run_system_command
- jupyter_show_prompt
- jupyter_write
- new_item
- new_linked_copy
- notify
- open_experiment
- open_item
- pause_experiment
- prepare_change_experiment
- prepare_delete_item
- prepare_open_item
- prepare_purge_unused_items
- prepare_regenerate
- prepare_rename_item
- purge_unused_items
- pyqode_clear_breakpoints
- pyqode_resume_auto_backend_restart
- pyqode_select_indentation_mode
- pyqode_suspend_auto_backend_restart
- regenerate
- register_editor
- rename_item
- resume_experiment
- run_experiment_canceled
- save_experiment
- startup
- unregister_editor
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 indexlist
. 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 :
- https://osdoc.cogsci.nl/4.0/fr/dev/plugin
- https://github.com/open-cogsci/opensesame-extension-example
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)