Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 16/11/2018, à 21:12

Roger-Gabriel

Créer un nouveau menu dans Gnumeric et le rendre fonctionnel. (Résolu)

J'ai fait un module en python 2.7 que j'arrive à faire fonctionner avec la console python.
en tapant les lignes suivantes  :
import sys
sys.path.insert(0,"/home/minodier/.gnumeric/1.12.35/plugins/myfuncs")
import produits

En créant dans  le répertoire  .gnumeric/1.12.35/plugins/myfuncs
2 fichiers : plugin.xlm et ui-Actualiser-menu.xml .
J'ai réussi à créer mon menu. Maintenant je voudrais que mon module fonctionne en cliquant sur mon menu.

Une idée ?

Sinon je voudrais connaitre les effets de mon clic de souris sur mon menu ?
Quelles procédures employées pour les connaitre ?
Une recherche sur internet n'a rien donner.

Je suis sous Lubuntu 18-04.

Dernière modification par Roger-Gabriel (Le 19/11/2018, à 14:00)

Hors ligne

#2 Le 17/11/2018, à 10:01

jbrefort

Re : Créer un nouveau menu dans Gnumeric et le rendre fonctionnel. (Résolu)

Bonjour,

Je ne vois pas bien ce que la console vient faire ici. Les fichiers plugins.xml et ui-Actualiser-menu.xml doivent renvoyer à une action à définir dans un fichier .py. Pour voir le menu apparaître, il suffit d'activer le plugin dans Outils/Greffons...

Maintenant, je ne suis pas un expert en Python et je ne sais pas s'il existe encore sur la toile un exemple de la chose. Cela a existé cependant et il n'y a pas de raison que cela ne puisse plus marcher.

Tu ne donnes pas assez de détails, en particulier sur ce que tu as mis dans tes fichiers pour que je puisse t'aider davantage.

Cordialement,
Jean

Hors ligne

#3 Le 17/11/2018, à 11:28

Roger-Gabriel

Re : Créer un nouveau menu dans Gnumeric et le rendre fonctionnel. (Résolu)

Merci pour votre réponse.
Petites précisions :
Quand je parle de console il s'agit de la console interne de gnumeric, le module Gnumeric.py est un module interne. C'est pourquoi la console python de gnumeric est un des moyens pour  avoir accès au module Gnumeric.
L'emplacement de mon module produits.py n'est pas renseigné dans le python path d'où :

import sys
sys.path.insert(0,"/home/minodier/.gnumeric/1.12.35/plugins/myfuncs")
import produits

De cette maniére mon module produits.py fonctionne.

Si on passe par le terminal on obtient cela :

minodier@gresse-HP-Compaq-dc7700-Convertible-Minitower:~$ python
Python 2.7.15rc1 (default, Apr 15 2018, 21:51:34) 
[GCC 7.3.0] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import Gnumeric
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named Gnumeric

Le contenu simplifier de mon module :

# -*- coding: utf-8 -*-
# produits.py
#
#from Gnumeric import GnumericError, GnumericErrorVALUE
import Gnumeric
# importer les produits
def ecrit_produits() :
    a = 0
    wb = Gnumeric.workbooks()[0]
    sheet = wb.sheets()[0]
    for x in  range(0,20,2):
        sheet.cell_fetch(0,a).set_text('%s' % a*a)
        sheet.cell_fetch(1,a).set_text('%s' % a*a +1)
        sheet.cell_fetch(2,a).set_text('%s' % a*a+2)                               
        a+=1                                         
ecrit_produits()

contenu de mon fichier ui-Actualiser-menu.xml :

<?xml version="1.0" encoding="UTF-8"?>
<ui>
  <menubar>
    <menu name="Tools" action="MenuTools">
      <menuitem action="Actualiser"/>
    </menu>
  </menubar>
</ui

contenu de mon fichier plugin.xml :

<?xml version="1.0" encoding="UTF-8"?>
<plugin id="Actualiser">
    <information>
        <name xml:lang="fr">Chargeur de produits</name>
    </information>
    <loader type="Gnumeric_PythonLoader:python">
        <attribute value="produits" name="module_file"/>
    </loader>
    <services>
        <service type="ui" id="actualiser" file="ui-Actualiser-menu.xml">
            <actions>
                <action name="Actualiser">
                    <label xml:lang="fr">actualiser</label>
                </action>
            </actions>
        </service>
    </services>
</plugin>

Je voudrais appeler mon script produits.py avec mon menu actualiser.
Sinon je voudrais connaitre l'événement qui se produit quand on clique sur le menu actualiser afin  d'essayer de le connecter à produits.py.

Merci pour votre aide.

Dernière modification par Roger-Gabriel (Le 18/11/2018, à 12:10)

Hors ligne

#4 Le 17/11/2018, à 11:29

xubu1957

Re : Créer un nouveau menu dans Gnumeric et le rendre fonctionnel. (Résolu)

Bonjour,

Pour ajouter toi-même les balises code à ton précédent message #3 :

  • Cliquer sur  le lien « Modifier » en bas à droite du message

  • Sélectionner le texte

  • Cliquer sur le <> de l'éditeur de message

1530289742.png

comme indiqué dans le : Retour utilisable de commande


Conseils pour les nouveaux demandeurs et pas qu'eux
Important : Pensez à passer vos sujets en [Résolu] lorsque ceux-ci le sont, au début du titre en cliquant sur Modifier sous le premier message, et un bref récapitulatif de la solution à la fin de celui-ci. Merci.                   Membre de Linux-Azur

En ligne

#5 Le 17/11/2018, à 11:47

jbrefort

Re : Créer un nouveau menu dans Gnumeric et le rendre fonctionnel. (Résolu)

L'action est bien définie dans les fichiers xml mais elle n'est implémentée nulle part. Il faut le faire dans le fichier Python. Je ne sais pas comment on définit la chose en Python, mais en C cela donnerait :

GnmModulePluginUIActions const Actualiser_ui_actions[] = {
    {"Actualiser", ecrit_produits},
    {NULL, NULL}
};

Hors ligne

#6 Le 18/11/2018, à 12:05

Roger-Gabriel

Re : Créer un nouveau menu dans Gnumeric et le rendre fonctionnel. (Résolu)

Votre message me donne une piste, malheureusement en dépit de recherches sur internet le terme implémenter reste obscur pour moi.

Sur le site :
https://help.gnome.org/users/gnumeric/s … ython.html

Il est expliqué de la maniére dont on créer des fonctions en python pour une cellule.
Mon module lui remplit  environ 80 cellules, il me semble qu'un menu est mieux adapté,
d'ou mon choix.

A la fin du module python ( voir site 18.3.4.2. Writing new spells)
présenté en example il y a un dictionnaire qui pourrait être cette implémentation.

example_functions = {
    'py_add': ('ff','num1,num2',func_add),
    'py_sum': ('r', 'values', func_sum)
}

Malheureusement il n'y a qu'un fichier plugin.xlm, pas de fichier ui.
voir(18.3.4.1. Prepare the spellbook)

contenu du fichier plugin.xlm :

<?xml version="1.0"?>
<plugin id="Gnumeric_MyFuncPlugin">
    <information>
        <name>Other Python functions from HOWTO</name>
        <description>A few extra python functions demonstrating the API.</description>
    </information>
    <loader type="Gnumeric_PythonLoader:python">
        <attribute name="module_name" value="my-func"/> 3
    </loader>
    <services>
        <service type="function_group" id="example"> 4
            <category>Local Python</category>
            <functions>
            </functions>
        </service>
    </services>
</plugin>

Le seul cas de menu auquel on peut se référer est dans le répertoire :
/usr/lib/gnumeric/1.12.35/plugins
C'est justement le menu console python, malhereusement elle lance une bibliothéque :
python_loader.so dont le contenu n'est lisible qu'avec un editeur Hexadécimal
incompréhensible pour moi.

J'aurai bien posé mes questions sur la liste gnumeric prévu à cet effet,mais  mes capacités en anglais
ne me le permettent pas.

Hors ligne

#7 Le 18/11/2018, à 17:00

jbrefort

Re : Créer un nouveau menu dans Gnumeric et le rendre fonctionnel. (Résolu)

Il faut associer la méthode ecrits_produits à l'action Actualiser dans le fichier Python.
J'essaierai quelque chose comme :
# -*- coding: utf-8 -*-
# produits.py
#
#from Gnumeric import GnumericError, GnumericErrorVALUE
import Gnumeric
# importer les produits
def ecrit_produits() :
    a = 0
    wb = Gnumeric.workbooks()[0]
    sheet = wb.sheets()[0]
    for x in  range(0,20,2):
        sheet.cell_fetch(0,a).set_text('%s' % a*a)
        sheet.cell_fetch(1,a).set_text('%s' % a*a +1)
        sheet.cell_fetch(2,a).set_text('%s' % a*a+2)                               
        a+=1 
Actualiser_ui_actions =
   "Actualiser", ecrit_produits
   None

Comme je suis nul en Python, je ne garantis pas la syntaxe, loin de là, mais l'idée est là, il faut associer l'action et la procédure.
Par contre l'appel ecrit_produits() dans le fichier me paraît totalement inutile, si je comprends bien les choses, il va s'exécuter au chargement du fichier alors qu'il ne devrait s'exécuter que lors de l'utilisation du menu.

Hors ligne

#8 Le 18/11/2018, à 20:12

Roger-Gabriel

Re : Créer un nouveau menu dans Gnumeric et le rendre fonctionnel. (Résolu)

A partir de votre proposition
Actualiser_ui_actions =
   "Actualiser", ecrit_produits
   None
J'ai fait des recherches sur internet.
Et j'ai trouvé ça :
/https://sourceforge.net/p/fborg/code/HEAD/tree/abc/

Ce que je cherche doit être quelque chose comme :

produits_ui_actions = {
    'Actualiser' : ecrit_produits}

Malheureusement pour l'instant ça ne fonctionne pas.
J'ai téléchargé les fichiers ui.xlm, plugin.xlm, abc.py du site. (https://sourceforge.net/p/fborg/code/HEAD/tree/abc/)

Je les ai mis dans le dossier /home/minodier/.gnumeric/1.12.35/plugins/abc.
J'ai bien le menu "Say hello".
Mais ça ne fonctionne pas non plus.
Mais je pense qu'il y a un problème entre gnumeric et python car je ne trouve pas mes fonctions python.
Quand j'aurai résolu ce problème je crois que ça va fonctionner.
Merci pour votre aide.

Dernière modification par Roger-Gabriel (Le 18/11/2018, à 20:43)

Hors ligne

#9 Le 18/11/2018, à 21:26

Roger-Gabriel

Re : Créer un nouveau menu dans Gnumeric et le rendre fonctionnel. (Résolu)

J'ai réinstallé les plugins de gnumeric.
J'ai activé les fonctions python qui apparaissent maintenant.
Mais aucun des menus créer ne consent à fonctionner, aussi bien celui que j'ai créer "Actualiser".
Que "Say hello" du site (https://sourceforge.net/p/fborg/code/HEAD/tree/abc/).
Je suis au bord de la déprime et je ne comprends pas pourquoi celui ci également se refuse à fonctionner.

Hors ligne

#10 Le 18/11/2018, à 23:12

jbrefort

Re : Créer un nouveau menu dans Gnumeric et le rendre fonctionnel. (Résolu)

Il se pourrait qu'il y ait un bug quelque part dans l'interface Python de gnumeric. J'obtiens des messages d'erreurs :

CRITICAL **: 22:06:09.794: gplp_func_exec_action: assertion '_PyGObject_API != NULL' failed

donc l'action est bien référencée mais il y a un souci avec cette variable qui ne semble pas être initialisée. Cela pourrait être ma faute, j'ai viré du code qui posait problème dans d'autres situations il y a des années de cela. Je vais chercher plus avant.

Pour info, il faut utiliser :
Actualiser_ui_actions = {
    'Actualiser' : ecrit_produits}

Hors ligne

#11 Le 19/11/2018, à 00:13

Roger-Gabriel

Re : Créer un nouveau menu dans Gnumeric et le rendre fonctionnel. (Résolu)

J'ai réussi à faire fonctionner le menu Say Hello du site (https://sourceforge.net/p/fborg/code/HEAD/tree/abc/)
Pour cela j'ai changer 2 choses dans le module python :
J'ai supprimé une ligne à laquelle je comprenais rien et qui n'avait aucune utilité pour moi.
et j'ai rajouté des parenthése à  f_abc_action1 ce qui donne f_abc_action1().
Et là youpie ça marche.

import Gnumeric, os

# Works when called from python console
def f_abc_action1():
    wb=Gnumeric.workbooks()[0]
    s=wb.sheets()[0]
    s.cell_fetch(0,0).set_text('hello')

 
abc_ui_actions = {
    'abc_action1' : f_abc_action1()
}

Je n'arrive toujours pas à faire fonctionner le mien pour l'instant.
Aussi je vais prendre exactement les mêmes variables et je vais remplacer la fonction abc par la mienne .
Je vous tiens au courant. J'aurai pu enlevé importé os dans le module.

Je viens de substituer la fonction abc du site par la mienne en gardant les 2 fichiers plugin.xml et  ui.xlm du site.
en renommant tout abc et j'ai mis la ligne abc_ui_actions = {
    'abc_action1' : f_abc_action1() } dans le module est miracle ça fonctionne.
Merci pour votre aide.
Comment fait on pour passer en résolu ?

Dernière modification par Roger-Gabriel (Le 19/11/2018, à 00:43)

Hors ligne

#12 Le 19/11/2018, à 08:43

jbrefort

Re : Créer un nouveau menu dans Gnumeric et le rendre fonctionnel. (Résolu)

Curieux que cela marche. Il y a des choses vraiment bizarres dans le code de gnumeric (du moins en ce qui concerne Python).

Cependant en bidouillant j'ai avancé mais votre code déclenche une erreur de Python :
E Exception Python (<type 'exceptions.TypeError'> : cannot concatenate 'str' and 'int' objects)

Hors ligne

#13 Le 19/11/2018, à 10:53

jbrefort

Re : Créer un nouveau menu dans Gnumeric et le rendre fonctionnel. (Résolu)

J'ai réussi à le faire fonctionner avec le code Python suivant :

# -*- coding: utf-8 -*-
# produits.py
#
import Gnumeric
# importer les produits
def ecrit_produits(wbc) :
    a = 0
    wb = Gnumeric.workbooks()[0]
    sheet = wb.sheets()[0]
    for x in  range(0,20,2):
        sheet.cell_fetch(0,a).set_text(str(a*a))
        sheet.cell_fetch(1,a).set_text(str(a*a +1))
        sheet.cell_fetch(2,a).set_text(str(a*a+2))                               
        a+=1

Actualiser_ui_actions = {
    'Actualiser' : ecrit_produits}

Je ne sais pas pourquoi il faut ajouter un paramètre (inutilisé) à la procédure

Hors ligne

#14 Le 19/11/2018, à 13:26

Roger-Gabriel

Re : Créer un nouveau menu dans Gnumeric et le rendre fonctionnel. (Résolu)

Afin que cela serve à d'autre je vais mettre le contenu des fichiers ui.xlm, plugin.xlm, abc.py qui fonctionnent :
ui.xlm :

<ui>
  <menubar>
    <menu name="Tools" action="MenuTools">
      <menuitem action="abc_action1"/>
    </menu>
  </menubar>
</ui>

plugin.xlm :

<?xml version="1.0"?>
<plugin id="Gnumeric_Abc">
  <information>
    <name>abc name</name>
    <description>abc description</description>
  </information>
  <loader type="Gnumeric_PythonLoader:python">
    <attribute name="module_name" value="abc"/>
  </loader>
  <services>
    <service type="ui" id="abc" file="ui.xml">
      <actions>
    <action name="abc_action1">
      <label>actualiser</label>
    </action>
      </actions>
    </service>
  </services>
</plugin>

abc.py :

# -*- coding: utf-8 -*-
# abc.py
#
import Gnumeric
# importer les produits
def f_abc_action1() : :
    a = 0
    wb = Gnumeric.workbooks()[0]
    sheet = wb.sheets()[0]
    for x in  range(0,20,2):
        sheet.cell_fetch(0,a).set_text(str(a*a))
        sheet.cell_fetch(1,a).set_text(str(a*a +1))
        sheet.cell_fetch(2,a).set_text(str(a*a+2))                               
        a+=1



abc_ui_actions = {
    'abc_action1' : f_abc_action1()
}

réflexion générale :
Je vois que vous avez mis un paramètre à la fonction écrit_produit c'est sans doute ce qui permet le fonctionnement
en l’absence des parenthèses devant écrit produits.
C'est quoi ce paramètre wbc.
Sur le module qui m'a servi d'exemple il y avait aussi un paramètre (a) et pas de parenthèses.
Roger

Dernière modification par Roger-Gabriel (Le 19/11/2018, à 13:30)

Hors ligne

#15 Le 19/11/2018, à 18:23

jbrefort

Re : Créer un nouveau menu dans Gnumeric et le rendre fonctionnel. (Résolu)

wbc est le Gui avec une méthode get_workbbok() pour récupérer le workbook. Si plusieurs fichiers sont ouverts, la commande ne sera pas forcément exécutée dans celui pour lequel elle a été appelée.

Il est donc préférable de remplacer

    wb = Gnumeric.workbooks()[0]

par
    wb = wbc.get_workbook()

Hors ligne

#16 Le 19/11/2018, à 20:02

jbrefort

Re : Créer un nouveau menu dans Gnumeric et le rendre fonctionnel. (Résolu)

Hmm, j'ai oublié l'argument !

    wb = wbc.get_workbook(wbc)

Hors ligne

#17 Le 20/11/2018, à 09:06

jbrefort

Re : Créer un nouveau menu dans Gnumeric et le rendre fonctionnel. (Résolu)

Oups, il semble que je fatigue, l'argument est déjà devant. La bonne syntaxe est donc bien la première.

wb = wbc.get_workbook()

Hors ligne

#18 Le 20/11/2018, à 21:35

Roger-Gabriel

Re : Créer un nouveau menu dans Gnumeric et le rendre fonctionnel. (Résolu)

Avec l'aide de IDLE et python 3.6 j'ai essayé de simuler l'appel de la fonction .py
Pour cela j'ai créer 2 modules un module bouton_fonction qui simule le menu
et un module fonction_bouton qui simule la fonction.py.
Bien sur sans utiliser le module Gnumeric qui est un module interne au tableur gnumeric.
J'ai utiliser un dictionnaire comme abc_ui_actions = {
    'abc_action1' : f_abc_action1()
}
et tkinter pour l'affichage

Module bouton_fonction  :

# -*- coding: utf-8 -*-
from tkinter import *
import fonction_bouton
fenetre = Tk()
bouton=Button(fenetre, text="Fonction", command=fonction_bouton.actions ['ecrit_produits'])
bouton.pack()
fenetre.mainloop(

Module fonction_bouton :

# -*- coding: utf-8 -*-
# produits.py
#
#from Gnumeric import GnumericError, GnumericErrorVALUE
# importer les produits
from tkinter import *
def ecrit_produits() :
    fenetre = Tk()
    # label
    label = Label(fenetre, text='salut', bg="yellow")
    label.pack()


actions = {
    'ecrit_produits' : ecrit_produits
}

Cela fonctionne sans les parenthèses, cela semble  lié à tkinter où elles sont inutiles pour appeler une fonction avec un bouton.
De cet essai si on prend l'exemple avec la fonction abc l'appel de la fonction doit être quelque chose comme :
abc.abc_ui_actions[ 'abc_action1']

Si tel est le cas je ne vois pas où on peut mettre un paramètre.

Dernière modification par Roger-Gabriel (Le 20/11/2018, à 21:43)

Hors ligne

#19 Le 21/11/2018, à 08:25

jbrefort

Re : Créer un nouveau menu dans Gnumeric et le rendre fonctionnel. (Résolu)

Le code qui fonctionne chez moi :

# -*- coding: utf-8 -*-
# produits.py
#
import Gnumeric
# importer les produits
def ecrit_produits(wbc) :
    a = 0
    wb = wbc.get_workbook()
    sheet = wb.sheets()[0]
    for x in  range(0,20,2):
        sheet.cell_fetch(0,a).set_text(str(a*a))
        sheet.cell_fetch(1,a).set_text(str(a*a +1))
        sheet.cell_fetch(2,a).set_text(str(a*a+2))                               
        a+=1

Actualiser_ui_actions = {
    'Actualiser' : ecrit_produits}

On devrait pouvoir encore l'améliorer en sélectionnant la feuille active plutôt que la première.

Hors ligne