Problème utilisation instance de classe par un programme externe
Résolu
NeoPython
-
yg_be Messages postés 23541 Date d'inscription Statut Contributeur Dernière intervention -
yg_be Messages postés 23541 Date d'inscription Statut Contributeur Dernière intervention -
Bonjour à tous
J'ai un problème d'utilisation des instances de classes dans une fonction qui est écrit dans un fichier externe.
J'ai fabriqué deux petits programmes de test pour mieux me faire comprendre.
Imaginez une classe "Rectangle" qui contient deux variables : "Longueur" et "Largeur"
Un Objet "Rectangle_Rouge" donnera donc les instances "Rectangle_Rouge.Longueur" et "Rectangle_Rouge.Largeur"
Les variables sont sous format IntVar() car je vais les utiliser sous forme de graphique "tkinter".
Je peux utiliser les instances de classe "Rectangle" sous différentes formes : par des fonction et par l'instruction exec(), sans problème tant que le programme est contenu dans un même fichier.
Voici le programme nommé Etude.py :
Mon problème est que tout ce qui fonctionnait dans un fichier unique, ne fonctionne pas dans un fichier extérieur :
Voici ci dessous un fichier externe : Etude_suite.py
Pour être précis la ligne programme qui ne fonctionne pas est celle ci : exec(Nom_objet_a_modifier + "." + Nom_variable_a_modifier + ".set(999)",globals(),dico)
J'ai un défaut, NameError: name 'Rectangle_Rouge' is not defined
Quelqu'un pourrait il me renseigner sur une solution de bon fonctionnement?
Avec tous mes remerciements.
J'ai un problème d'utilisation des instances de classes dans une fonction qui est écrit dans un fichier externe.
J'ai fabriqué deux petits programmes de test pour mieux me faire comprendre.
Imaginez une classe "Rectangle" qui contient deux variables : "Longueur" et "Largeur"
Un Objet "Rectangle_Rouge" donnera donc les instances "Rectangle_Rouge.Longueur" et "Rectangle_Rouge.Largeur"
Les variables sont sous format IntVar() car je vais les utiliser sous forme de graphique "tkinter".
Je peux utiliser les instances de classe "Rectangle" sous différentes formes : par des fonction et par l'instruction exec(), sans problème tant que le programme est contenu dans un même fichier.
Voici le programme nommé Etude.py :
from tkinter import * from Etude_suite import Modification_rectangle_suite class Rectangle : def __init__(self): Longueur, Largeur = IntVar(), IntVar() Valeur_Initiale = "0" Longueur.set(Valeur_Initiale) # Chargement valeur initiale self.Longueur = Longueur Largeur.set(Valeur_Initiale) # Chargement valeur initiale self.Largeur = Largeur def Modification_rectangle() : print(Rectangle_Rouge.Longueur.get()) Rectangle_Rouge.Longueur.set(444) print(Rectangle_Rouge.Longueur.get()) Nom_objet_a_modifier = "Rectangle_Rouge" Nom_variable_a_modifier = "Longueur" exec(Nom_objet_a_modifier + "." + Nom_variable_a_modifier + ".set(555)") print(Rectangle_Rouge.Longueur.get()) def Modification_rectangle_bis (Rectangle_Choisi) : print(Rectangle_Choisi.Longueur.get()) Rectangle_Choisi.Longueur.set(666) print(Rectangle_Choisi.Longueur.get()) Nom_objet_a_modifier = "Rectangle_Rouge" Nom_variable_a_modifier = "Longueur" exec(Nom_objet_a_modifier + "." + Nom_variable_a_modifier + ".set(777)") print(Rectangle_Choisi.Longueur.get()) # ------ DEBUT DU PROGRAMME PRINCIPAL ------ fenetre = Tk() global Rectangle_Rouge Rectangle_Rouge = Rectangle () print(Rectangle_Rouge.Longueur.get()) Rectangle_Rouge.Longueur.set(111) print(Rectangle_Rouge.Longueur.get()) Nom_objet_a_modifier = "Rectangle_Rouge" Nom_variable_a_modifier = "Longueur" exec(Nom_objet_a_modifier + "." + Nom_variable_a_modifier + ".set(333)") print(Rectangle_Rouge.Longueur.get()) Modification_rectangle() Modification_rectangle_bis (Rectangle_Rouge) Modification_rectangle_suite (Rectangle_Rouge)
Mon problème est que tout ce qui fonctionnait dans un fichier unique, ne fonctionne pas dans un fichier extérieur :
Voici ci dessous un fichier externe : Etude_suite.py
Pour être précis la ligne programme qui ne fonctionne pas est celle ci : exec(Nom_objet_a_modifier + "." + Nom_variable_a_modifier + ".set(999)",globals(),dico)
J'ai un défaut, NameError: name 'Rectangle_Rouge' is not defined
def Modification_rectangle_suite (Rectangle_Choisi) : print(Rectangle_Choisi.Longueur.get()) Rectangle_Choisi.Longueur.set(888) print(Rectangle_Choisi.Longueur.get()) Nom_objet_a_modifier = "Rectangle_Rouge" Nom_variable_a_modifier = "Longueur" dico = {} exec(Nom_objet_a_modifier + "." + Nom_variable_a_modifier + ".set(999)",globals(),dico) print(Rectangle_Choisi.Longueur.get())
Quelqu'un pourrait il me renseigner sur une solution de bon fonctionnement?
Avec tous mes remerciements.
A voir également:
- Problème utilisation instance de classe par un programme externe
- Utilisation chromecast - Guide
- Chkdsk disque dur externe - Guide
- Télécharger gratuitement notice d'utilisation - Guide
- Classer par ordre alphabétique excel plusieurs colonnes - Guide
- Programme demarrage windows - Guide
2 réponses
yg_be
Messages postés
23541
Date d'inscription
Statut
Contributeur
Dernière intervention
Ambassadeur
1 584
je n'ai pas testé, mais il me semble que, dans Etude_suite.py, la variable Rectangle_Rouge est inconnue.
ne devrais-tu pas écrire Nom_objet_a_modifier = "Rectangle_Choisi"?
ne devrais-tu pas écrire Nom_objet_a_modifier = "Rectangle_Choisi"?
Salut,
C'est dommage d'utiliser
Je ne comprends pas bien le problème, mais, tu as essayé sans tkinter ? Si tu fais de la prog modulaire (multi fichiers) il faut bien gérer les importations, or, dans tes codes, aucune trace de
C'est dommage d'utiliser
globalquand on sait (Swinnen) que l'utilisation de classes permet de ne plus l'utiliser.
Je ne comprends pas bien le problème, mais, tu as essayé sans tkinter ? Si tu fais de la prog modulaire (multi fichiers) il faut bien gérer les importations, or, dans tes codes, aucune trace de
import # fichier1, ...
J'ai essayé avec Nom_objet_a_modifier = "Rectangle_Choisi", j'ai le même défaut.
De toute façon j'aurai besoin d'utiliser des formes chaines de caractères dans mon vrai programme ( Rectangle_Rouge , Rectangle_Bleu, Rectangle_Vert, ...)
Le plus fort, c'est que cela fonctionne tant que l'on ne quitte pas le programme principal (Etude.py) :
exec(Nom_objet_a_modifier + "." + Nom_variable_a_modifier + ".set(555)") dans la ligne 20
J'ai lu que la fonction exec() se comporte différemment dans les programmes externes, mais je ne vois pas comment l'écrire correctement.
Merci pour la proposition, j'ai essayé avec un troisième fichier mais pas mieux.
Finalement je m'en suis sorti en remplaçant la ligne à problème par :
Instance_voulue = getattr(Rectangle_Choisi, Nom_variable_a_modifier) #Adresse instance partiellement paramétrable
Instance_voulue.set(999)
print(Rectangle_Choisi.Longueur.get())
Merci encore.
je vais le faire pour toi.