# Autres langages > Python > GUI >  Rcuprer la valeur d'un checkbox dfini dans une def  partir d'une autre def

## CS91PARTY

Bonjour,
Encore un problme de dclaration de variable.
j'ai une def 'Parametrer' qui dfinit une fentre 'Parametrage' incluant un canvas, une checkbutton et 2 buttons.
l'un des boutons appelle une autre def pour rcuprer la valeur de la checkbutton en plus de fermer la fentre 'Parametrage'.
j'obtiens le message  d'erreur suivant indiquant que ma variable de sortie de la checkbutton n'est pas dfinie:
global name 'int_Param_Beep' is not defined

J'ai fait plusieurs essais en vain, j'ai aussi regard les questions autour de ce sujet dans le forum mais cela ne part jamais de 2 def diffrentes.
voici mon code contenant les diffrents essais en commentaire:


```

```

----------


## wiztricks

Salut,

Vous faites les mmes erreurs que dans le post prcdent.

Revisez la dclaration des variables globales:  ne sera pas du luxe.
Apprenez  programmer avec Tk: je vous ai dj indiqu un tuto.

- W

----------


## CS91PARTY

oui, merci pour cette invitation,
En effet, c'est le mme genre d'erreur. mais je n'arrive pas  dclarer la variable de rcupration de la valeur de la checkbutton de type IntVar() dans la def 'main' ni en global d'ailleurs.
j'ai bien lu le tuto mais cela ne rpond as  mon cas particulier.
merci,

----------


## wiztricks

> En effet, c'est le mme genre d'erreur. mais je n'arrive pas  dclarer la variable de rcupration de la valeur de la checkbutton de type IntVar() dans la def 'main' ni en global d'ailleurs.
> j'ai bien lu le tuto mais cela ne rpond as  mon cas particulier.


Il ne suffit pas de lire un tuto. il faut prendre le temps de comprendre ce que  implique dans vos codes.
Ce que vous faites se rsume :


```

```

Lancez g(), puis f()... et essayez de comprendre pourquoi  "NameError".
Pas la peine d'avoir tout votre code tkinter pour travailler sur ce dtail de construction.
note: si vous voulez apprendre c'est vous qui bossez  ::mrgreen:: 

- W

----------


## CS91PARTY

votre rsum, sorti de mon contexte actuel car je dois utiliser une variable de type IntVar() que je n'arrive pas  dclarer dans le main, est justement diffrent des exemples du tuto 'mask' ou 'monter' car il essaye de rcuprer une variable global d'une def dans une def et non d'une def dans le main.
je prcise que j'utilise python en graphique et non en commande: la commande print ne fonctionne pas dans ce cas. C'est pas gnant mais c'est une prcision  :;): 
Cepedant, pour rpondre  votre question afin de rsoudre le cas pos par votre rsum, il suffit de dclarer la variable 'bidon' en global dans la def 'g' pour  y mmoriser la valeur 'xyz' et la rendre disponible  partir de la def 'f'


```

```

Dans mon cas, la dclaration IntVar()  qui ne se dclare pas dans le main.
Je continue  chercher de mon ct  donc  bosser  ::mrgreen:: 
Mais un peu d'aide est toujours apprciable.
merci,

----------


## CS91PARTY

rien avoir avec tkinter mais j'arrive  utiliser la commande print dans python windows maintenant

----------


## wiztricks

> Cepedant, pour rpondre  votre question afin de rsoudre le cas pos par votre rsum, il suffit de dclarer la variable 'bidon' en global dans la def 'g' pour  y mmoriser la valeur 'xyz' et la rendre disponible  partir de la def 'f'
> 
> 
> ```
> 
> ```


Pour comprendre ce que vous faites, vous n'avez pas besoin de graphique. De plus la porte des variables est une question de rsolution de noms et de porte de variables: peut importe les objets associs  ces noms.
Effectivement, avec du "global" partout, c'est "ceinture" et "bretelles"... mais un peu bourrin.

La solution minimaliste serait:


```

```

i.e. vous avez besoin du mot cl "global" dans les fonctions qui crent/modifient "bidon", pas dans les autres.
bidon n'est pa definit avant qu'on appele "g":


```

```

L'appel  "g" cre la variable globale qui est accessible depuis "f":


```

```

- W

----------


## tyrtamos

Bonjour,

Juste un petit complment.

En fait, quand l'interprteur excute une fonction qui cite une variable, il cherche d'abord  trouver sa valeur dans les variables locales et dans les arguments passs. S'il ne trouve pas, il cherche au-dessus, ... jusqu'au niveau global.

Exemple:



```

```

C'est une "souplesse" que je n'aime pas du tout et qui est source de bug. Il suffit en effet d'une faute de frappe dans la dclaration d'une variable locale pour que ce soit la valeur d'une variable globale de mme nom qui soit prise. Ce n'est pas trs solide comme programmation.

En ce qui me concerne, je cherche toujours  rendre "tanches" mes fonctions vis--vis des variables utilises: soit elles sont locales, soit elles sont passes en argument. J'aimerais pour ma part qu'il y ait une instruction qui interdise la recherche automatique au niveau global. Et les variables globales doivent tre limites le plus possible: on en cre quand on ne sait pas faire autrement, mais ce n'est pas de la bonne programmation. 

Ou alors on les met dans une classe pour limiter les erreurs par faute de frappe. Exemple:



```

```

----------


## wiztricks

Salut,




> En ce qui me concerne, je cherche toujours  rendre "tanches" mes fonctions vis--vis des variables utilises: soit elles sont locales, soit elles sont passes en argument. J'aimerais pour ma part qu'il y ait une instruction qui interdise la recherche automatique au niveau global.


Le plus simple est de stocker ces fonctions "pures" dans un module  part: la porte d'une variable "globale" est limite au module. 




> Ou alors on les met dans une classe pour limiter les erreurs par faute de frappe. Exemple:
> 
> 
> 
> ```
> 
> ```


Pour tre cohrent avec ce que vous racontez, il faudrait dfinir "g" ainsi:


```

```

C'est une criture qui questionne quand  la promotion de "g" comme mthode.

Pour ce qui est du problme du PO, il gagnerait  inclure la dclaration de la fonction "Parametrer_Quitter" dans celle de "Parametrer": les variables locales  "Parametrer" seraient alors accessibles sans "global" par la magie des "closures" - qu'il utilise dj (sans trop savoir) avec "lambda" -.
Mais bon, pas facile de voir l'intrt de l'imparfait du subjonctif alors qu'on souque dj  construire des phrases simple avec: sujet-verbe-complment.

- W

----------


## tyrtamos

Bonjour wiztricks




> Pour tre cohrent avec ce que vous racontez, il faudrait dfinir "g" ainsi...


Je prfre aussi!




> C'est une criture qui questionne quand  la promotion de "g" comme mthode


Je ne comprends pas cette phrase. Puis-je avoir un complment?

----------


## wiztricks

> Je ne comprends pas cette phrase. Puis-je avoir un complment?


Cela crit:


```

```

on peut imaginer remplacer le nom du paramtre par un X:


```

```

"g" accde donc  un objet X devant avoir un attribut "bidon".
Ca tombe bien X = varblog!

Mais on peut aussi crire cela "plus conventionnellement":


```

```

ou:
CODE]def g(cls):
    print(cls.bidon)[/CODE]
On peut garder "g" fonction ou le pousser dans la dfinition de la classe et en faire une mthode.
Tout dpend de comment on voudra traduire la relation entre g et varglob (ce qui est toujours sujet  discussion car il y a des '+' et des '-'...)

- W

----------


## tyrtamos

Ok, merci!

----------

