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 08/05/2008, à 21:02

The_true_power

Condition zenity

Salut, j'aimerais faire une condition.
donc avec zenity je fais :

memo() {
title="Temps Primitifs"
text="Choisissez un verbe"
reponse=`zenity --title="$title" --window-icon="/home/geecko/emblem-question.png" --height=500 --width=500 --text="$text" --list --column="liste" "Accipere" "Addere" "Agere" "Audire" "Capere" "Cavere" "Cavere" "Cognoscere" "Colere" "Condere" "Cupere" `
}
while true ; do
memo

if [ "$?" != 0 ] ; then
exit
fi

if [ "$reponse" = "Accipere" ] ;
then Accipere=$(zenity --entry --text "Donnez moi le TH² de Accipere"); echo $Accipere
if $accipere=accepi
then zenity --info --text "Bien joué !"
fi
fi
done

Mon but est donc que une fois "Accipere" selectionné dans la liste, il me demande le TH² de Accipere (c'est du latin pour ceux qui voudraient savoir wink ) et que si la valeur entrée = accepi, il me dise "bien joué!"



Seulement je ne sais pas comment faire... je ne vais pas plus loin que la fenêtre où il me demande d'entrer la valeur.

Merci

PS : si quelqu'un pouvait me donner un script zenity utilisant plein de fonctions plus profondes que dans le man, ce serait cool smile

Dernière modification par The_true_power (Le 08/05/2008, à 21:03)

Hors ligne

#2 Le 09/05/2008, à 02:59

garnier

Re : Condition zenity

Bonsoir,

ton code avec une petite modification :

#!/bin/bash

memo (){

        title="Temps Primitifs"
        text="Choisissez un verbe"
        reponse=`zenity --title="$title" --window-icon="/home/geecko/emblem-question.png" --height=500 --width=500 --text="$text" --list --column="liste" "Accipere" "Addere" "Agere" "Audire" "Capere" "Cavere" "Cavere" "Cognoscere" "Colere" "Condere" "Cupere" `
}

while true
do
        memo

        if [ "$?" != 0 ]
        then
                exit
        fi

        if [ "$reponse" = "Accipere" ]
        then
                accipere=`zenity --entry --text "Donnez moi le TH² de Accipere"`

                if [ "${accipere}" = "accepi"  ]
                then
                        echo "${accipere}"
                        zenity --info --text "Bien joué !"
                else
                        echo "${accipere}" 
                        zenity --info --text "Bip ! mauvaise réponse"
                fi
        fi
done

codialement benoit

#3 Le 09/05/2008, à 18:15

The_true_power

Re : Condition zenity

merci beaucoup ! big_smile
Maintenant si j'ai envie que dans la condition

if [ "$reponse" = "Accipere" ]

il me pose une question au hasard... en gros qu''il puisse me demander aussi bien le th1 que le th2 ou la traduction. Et le tout aléatoirement.
Comment puis-je faire ? smile

Dernière modification par The_true_power (Le 09/05/2008, à 18:15)

Hors ligne

#4 Le 09/05/2008, à 21:03

garnier

Re : Condition zenity

Bonsoir,

un début de réponse avec la generation d'un nombre aleatoire dans la fourchette [0,2]:

#!/bin/bash
aleatoire=0
conversion=""
memo ()
{

        title="Temps Primitifs"
        text="Choisissez un verbe"
        reponse=`zenity --title="$title" --window-icon="/home/geecko/emblem-question.png" --height=500 --width=500 --text="$text" --list --column="liste" "Accipere" "Addere" "Agere" "Audire" "Capere" "Cavere" "Cavere" "Cognoscere" "Colere" "Condere" "Cupere" `
}
# ---------------------------------------------------------------
#
# function de conversion MAJUSCULE -> MINUSCULE
#
# ---------------------------------------------------------------
toLower()
{

        conversion=`echo $1 | tr  '[A-Z]' '[a-z]'`
        echo $conversion
}
aleatory()
{
        aleas=$((RANDOM%3))
        echo $aleas
}
# ---------------------------------------------------------------
#
# fin des fonctions
#
# ---------------------------------------------------------------
while true
do
        memo

        if [ "$?" != 0 ]
        then
                exit
        fi

        case $reponse in
                Accipere )
                        case `aleatory` in
                                0) #---------------- cas TH² --------------
                                rep=`zenity --entry --text "Donnez moi le TH² de Accipere"`
                                if [ "accepi" = `toLower $rep` ]
                                then
                                        zenity --info --text "TH² Bien joué !"
                                else
                                        zenity --info --text "Bip ! mauvaise réponse pour TH²"
                                fi
                                ;;
                                1)  #---------------- cas TH1 --------------
                                rep=`zenity --entry --text "Donnez moi le TH1 de Accipere"`
                                if [ "truc" = `toLower $rep` ]
                                then
                                        zenity --info --text "TH1 Bien joué !"
                                else
                                        zenity --info --text "Bip ! mauvaise réponse pour TH1"
                                fi
                                ;;
                                2) #-------------- Tradution ----------------------
                                rep=`zenity --entry --text "Donnez moi la traduction de Accipere"`
                                if [ "traduction" = `toLower $rep` ]
                                then
                                        zenity --info --text "Traduction Bien joué !"
                                else
                                        zenity --info --text "Bip ! mauvaise traduction"
                                fi
                                ;;
                        esac
                        ;;
                Addere )
                        case `aleatory` in
                                0) #---------------- cas TH² --------------
                                rep=`zenity --entry --text "Donnez moi le TH² de Addere"`
                                if [ "adderi" = `toLower $rep` ]
                                then
                                        zenity --info --text "TH² Bien joué !"
                                else
                                        zenity --info --text "Bip ! mauvaise réponse pour TH²"
                                fi
                                ;;
                                1)  #---------------- cas TH1 --------------
                                rep=`zenity --entry --text "Donnez moi le TH1 de Addere"`
                                if [ "truc" = `toLower $rep` ]
                                then
                                        zenity --info --text "TH1 Bien joué !"
                                else
                                        zenity --info --text "Bip ! mauvaise réponse pour TH1"
                                fi
                                ;;
                                2) #-------------- Tradution ----------------------
                                rep=`zenity --entry --text "Donnez moi la traduction de Addere"`
                                if [ "traduction" = `toLower $rep` ]
                                then
                                        zenity --info --text "Traduction Bien joué !"
                                else
                                        zenity --info --text "Bip ! mauvaise traduction"
                                fi
                                ;;
                        esac
                        ;;
        esac
done

je te laisse faire la correction des temps et des traduction, puis à developper pour les autres mots en latin.

Ce script peut être amelioré, par l'ajout de fonction etc ....


cordialement benoit

#5 Le 09/05/2008, à 21:13

garnier

Re : Condition zenity

Bonsoir,

je viens de me relire, aie !

La fonction qui genere le nombre aléatoire est la fonction aleatory().

Pour la phrase ci-dessous :

je te laisse faire la correction des temps et des traduction, puis à developper pour les autres mots en latin.

il faut comprendre que je te laisse développer le code shell pour la liste des mots ainsi que la correction des bonnes réponses pour Accipere et Addere.

cordialement benoit.

#6 Le 09/05/2008, à 21:50

garnier

Re : Condition zenity

Bonsoir,

Le script avec une petite amelioration

#!/bin/bash
aleatoire=0
conversion=""
memo ()
{

        title="Temps Primitifs"
        text="Choisissez un verbe"
        reponse=`zenity --title="$title" --window-icon="/home/geecko/emblem-question.png" --height=500 --width=500 --text="$text" --list --column="liste" "Accipere" "Addere" "Agere" "Audire" "Capere" "Cavere" "Cavere" "Cognoscere" "Colere" "Condere" "Cupere" `
}
# ---------------------------------------------------------------
#
# function de conversion MAJUSCULE -> MINUSCULE
#
# ---------------------------------------------------------------
toLower()
{

        conversion=`echo $1 | tr  '[A-Z]' '[a-z]'`
        echo $conversion
}
# ---------------------------------------------------------------
#
# genere un nombre aleatoire entre 0 et 2  
#
# ---------------------------------------------------------------
aleatory()
{
        aleas=$((RANDOM%3))
        echo $aleas
}
# ---------------------------------------------------------------
#
# good answer
#
# ---------------------------------------------------------------
good()
{
        case $1 in
                0)
                        zenity --info --text "TH² Bien joué pour $2 !"
                        ;;
                1)
                        zenity --info --text "TH1 Bien joué pour $2 !"
                        ;;
                2)
                        zenity --info --text "Traduction Bien joué pour $2!"
                        ;;
        esac
}
# ---------------------------------------------------------------
#
# bad answer
#
# ---------------------------------------------------------------
bad()
{
        case $1 in
                0)
                        zenity --info --text "Bip ! TH2 mauvaise réponse pour $2, attendu $3"
                        ;;
                1)
                        zenity --info --text "Bip ! TH1 mauvaise réponse pour $2, attendu $3"
                        ;;
                2)
                        zenity --info --text "Bip ! mauvaise traduction pour $2, attendu $3"
                        ;;
        esac

}
# ---------------------------------------------------------------
#
# fin des fonctions
#
# ---------------------------------------------------------------
while true
do
        memo

        if [ "$?" != 0 ]
        then
                exit
        fi

        case $reponse in
                Accipere )
                        case `aleatory` in
                                0) #---------------- cas TH² --------------
                                rep=`zenity --entry --text "Donnez moi le TH² de Accipere"`
                                if [ "accepi" = `toLower $rep` ]
                                then
                                        good 0  "Accipere"
                                else
                                        bad 0 "Accipere" "accepi"
                                fi
                                ;;
                                1)  #---------------- cas TH1 --------------
                                rep=`zenity --entry --text "Donnez moi le TH1 de Accipere"`
                                if [ "truc" = `toLower $rep` ]
                                then
                                        good 1 "Accipere"
                                else
                                        bad 1 "Accipere" "truc"
                                fi
                                ;;
                                2) #-------------- Tradution ----------------------
                                rep=`zenity --entry --text "Donnez moi la traduction de Accipere"`
                                if [ "traduction" = `toLower $rep` ]
                                then
                                        good 2 "Accipere"
                                else
                                        bad 2  "Accipere" "traduction"
                                fi
                                ;;
                        esac
                        ;;
                Addere )
                        case `aleatory` in
                                0) #---------------- cas TH² --------------
                                rep=`zenity --entry --text "Donnez moi le TH² de Addere"`
                                if [ "adderi" = `toLower $rep` ]
                                then
                                        good 0 "Addere"
                                else
                                        bad 0 "Addere" "adderi"
                                fi
                                ;;
                                1)  #---------------- cas TH1 --------------
                                rep=`zenity --entry --text "Donnez moi le TH1 de Addere"`
                                if [ "truc" = `toLower $rep` ]
                                then
                                        good 1 "Addere"
                                else
                                        bad 1 "Addere" "truc"
                                fi
                                ;;
                                2) #-------------- Tradution ----------------------
                                rep=`zenity --entry --text "Donnez moi la traduction de Accipere"`
                                if [ "traduction" = `toLower $rep` ]
                                then
                                        good 2 "Addere"
                                else
                                        bad 2 "Addere" "traduction"
                                fi
                                ;;
                        esac
                        ;;

        esac
done

cordialement benoit

#7 Le 10/05/2008, à 09:03

The_true_power

Re : Condition zenity

Encore merci big_smile
Mais je suis confronté à un autre problème :
Lorcequ'une traduction fait plusieurs mots comme par exemple "prendre garde".
Ca donne :

                                2) #-------------- Tradution ----------------------
                                rep=`zenity --entry --text "Donnez moi la traduction de Cavere"`
                                if [ "prendre garde'" = `toLower $rep` ]

Mais j'ai beau donner prender garde, il me dit toujours que c'est faux.
Comment résoudre ce problème ?

S'il te plaît ne modifie par le script mais explique moi simplement comment wink

Encore merci

Hors ligne

#8 Le 10/05/2008, à 21:38

garnier

Re : Condition zenity

Bonsoir,

La raison de ce comportement est toute bête, à l'origine c'est une simple omission:

dans le test "if [ "......" = `........` ]" la valeur de droite du signe égal, (ici  ` ` connu sous l'intitulé "remplacement de commandes" ) retourne sur la sortie standard, après son évalutation, son résultat en remplacement du texte de la commande.

A savoir l'expression entre `....` après évaluation, est remplacée par l'execution de la commande echo $conversion.

exemple :
avec rep="ACCEPI"

if [ "accepi" = `toLower $rep` ] donne après évaluation du "remplacement de commandes" if [ "accepi" = accepi ].

L'incident dans notre cas est le suivant :

avec rep="prendre garde"

if [ "prendre garde" = `toLower $rep` ] donne if [ "prendre garde" = prendre garde ].

La comparaison ( condition du if ) est évaluée sur le mot 'prendre' et non sur la chaîne de caractères "prendre garde", d'où l'affichage par zenity d'une erreur de traduction.

De plus le bash retourne, si tu le lance avec l'option -x un message du type :

<nom du script>: line <numero de ligne correpondant au if>: [: trop d'arguments.

Le  mot 'garde '  est considéré comme un argument supplémentaire en dehors de la comparaison.

La solution :

mettre entre des guillemets ("")  le remplacement de commandes afin que l'évaluation porte sur la chaîne de caractères en entier.

soit :

if [ "prendre garde" = `toLower $rep` ] à remplacer par if [ "prendre garde" = "`toLower $rep`" ]

cordialement benoit

#9 Le 11/05/2008, à 14:47

The_true_power

Re : Condition zenity

Encore merci Garnier, mais lorsque je fais cette modification, il n'y a aucun changement. J'ai fais l'exacte modification que tu m'as décrite mais rien n'y fait...

Hors ligne

#10 Le 11/05/2008, à 17:01

garnier

Re : Condition zenity

Salut,

big_smile, voici ce qu'il faut faire :

remplacer les if [ "......" = "`toLower $rep`" ] par if [ "....." = "`toLower "$rep"`" ]

cordialement Benoit

#11 Le 11/05/2008, à 19:17

The_true_power

Re : Condition zenity

Merci beaucoup garnier ! big_smile

edit : bon le script marche (on va dire la 1.0 smile ) mais j'aimerai l'améliorer.
J'aimerai savoir comment on fait une variable numérique (qui contient un nombre donc) et comment la manipuler (augmenter la variable Y de X, la diviser par Z, ... ) merci

Dernière modification par The_true_power (Le 11/05/2008, à 19:57)

Hors ligne

#12 Le 12/05/2008, à 03:23

garnier

Re : Condition zenity

The_true_power a écrit :

Merci beaucoup garnier ! big_smile

edit : bon le script marche (on va dire la 1.0 smile ) mais j'aimerai l'améliorer.
J'aimerai savoir comment on fait une variable numérique (qui contient un nombre donc) et comment la manipuler (augmenter la variable Y de X, la diviser par Z, ... ) merci

Les variables Bash et sh ne sont pas typées.

La syntaxe n'est pas la même si tu utilise le shell "/bin/sh" ou le shell "/bin/bash" :

/bin/sh ( à lancer par sh <nom du script> ):

#!/bin/sh
var1=2
var2=10

# Addition
nombre=`expr $var1 + $var2`
echo "$var1 + $var2 = $nombre"

# ou

nbr=$( expr $var1 + $var2 )
echo "$var1 + $var2 = $nbr"

# Soustraction
nombre=`expr $var2 - $var1`
echo "$var2 - $var1 = $nombre"

# ou

nbr=$( expr $var2 - $var1 )
echo "$var2 - $var1 = $nbr"

# Multiplication
nombre=`expr $var2 '*' $var1` # Attention à mettre entre quote le signe *
echo "$var2 * $var1 = $nombre"

# ou

nbr=$( expr $var2 '*' $var1 )
echo "$var2 * $var1 = $nbr"

# Division entiere
nombre=`expr $var2 / $var1`    # ne donne jamais le reste de la division
echo "$var2 / $var1 = $nombre"

# ou

nbr=$( expr $var2 / $var1 )
echo "$var2 / $var1 = $nbr"

# Modulo ou reste de la division
nombre=`expr $var2 % $var1`
echo "$var2 % $var1 = $nombre"

# ou

nbr=$( expr $var2 % $var1 )
echo "$var2 % $var1 = $nbr"

# Incrementation
nombre=0
nombre=`expr $nombre + 1`  # Incrementation avec un pas de 1
echo "Incrementation de nombre  = $nombre"

# ou

nbr=0
nbr=$( expr $nbr + 1 )
echo "Incrementation de nbr  = $nbr"

# Decrementation
nombre=`expr $nombre - 1`
echo "Decrementation de nombre  = $nombre"

# ou

nbr=$( expr $nbr - 1 )
echo "Decrementation de nbr  = $nbr"

NB: il est impératif de laisser un caractère <espace> autour des opérateurs + - / * %

/bin/bash :

#!/bin/bash
# ----------------------
let var1=2
let var2=10

# -----------------------------------------------------
# Les syntaxes possibles sont :
# -----------------------------------------------------
# let "nombre=$var1 <operateur> $var2"
# let nombre="$var1 <operateur> $var2"
# let "nombre=$var1<operateur>$var2"
# let nombre=$var1<operateur>$var2
# -----------------------------------------------------

# Addition
let nombre="$var1+$var2"
echo "$var1 + $var2 = $nombre"

# Soustraction
let nombre="$var2-$var1"
echo "$var2 - $var1 = $nombre"

# Multiplication
let nombre="$var1*$var2"
echo "$var1 * $var2 = $nombre"

# Division entiere
let nombre="$var2/$var1"
echo "$var2 / $var1 = $nombre"

# Modulo ou reste de la division entiere
let nombre="$var2%$var1"
echo "$var2 % $var1 = $nombre"

# Operateur etendu +=
# Syntaxe equivalente à : let var2="$var2 + $var1" 
let "var2 += $var1"
echo "10 += $var1 = $var2"

# Operateur etendu -=
# Syntaxe equivalente à : let var2="$var2 - $var1"  
let "var2 -= $var1"
echo "12 -= $var1 = $var2"

# Operateur etendu /=
# Syntaxe equivalente à : let var2="$var2 / $var1" 
let "var2 /= $var1"
echo "10 /= $var1 = $var2"

# Operateur etendu %=
# Syntaxe equivalente à : let var2="$var2 % $var1"
let "var2 %= $var1"
echo "5 %= $var1 = $var2"

# Incrementation
# Equivalent à : let var2="$var2 + 1"
let "var2 += 1"
echo "Incrementation de var2 = $var2"

# Decrementation
# equivalent à : let var2="$var2 - 1"
let "var2 -= 1"
echo "Decrementation de  = $var2"

Utilisation de declare -i <nom d'un variable> ( equivalent à typeset ) :
syntaxe :  <variable>=<operande 1><operateur><operande 2>

#!/bin/bash
declare -i var2=10
declare -i var1=2
declare -i nombre=0

# Addition
nombre=$var1+$var2
echo "$var1 + $var2 = $nombre"

# Soustraction
nombre=$var2-$var1
echo "$var2 - $var1 = $nombre"

# Multiplication
nombre=$var2*$var1
echo "$var2 * $var1 = $nombre"

# Division entiere
nombre=$var2/$var1
echo "$var2 / $var1 = $nombre"

# Modulo ou reste de la division entiere
nombre=$var2%$var1
echo "$var2 % $var1 = $nombre"

# Incrementation
nombre=$nombre+1
echo "Incrementation de nombre = $nombre"

# Decrementation
nombre=$nombre-1
echo "Decrementation de nombre = $nombre"

Voilà wink.

cordialement Benoit

#13 Le 14/05/2008, à 16:11

The_true_power

Re : Condition zenity

ok, maintenant grace à toi je sais faire des variables bash et mon script est fini smile
encore merci wink

Hors ligne