IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

boucle for pour créer objet dans class [Python 3.X]


Sujet :

Python

  1. #1
    Membre éclairé
    Homme Profil pro
    BTS SN IR
    Inscrit en
    Mai 2017
    Messages
    513
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : BTS SN IR

    Informations forums :
    Inscription : Mai 2017
    Messages : 513
    Points : 700
    Points
    700
    Par défaut boucle for pour créer objet dans class
    bonjours, n'étant pas un expert en python j'ai un problème assez problématique.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
     
     
    class LigneDeSaisi:
     
    	def __init__(self, master, X, Y, taille, Xmax=1, Ymax=1):
    		self.saisi = StringVar()
    		self.saisi.set("0")
    		self.entry = Entry( master , textvariable = self.saisi , width = taille )
    		self.entry.grid( column = X , row = Y , columnspan = Xmax , rowspan = Ymax )
     
     
    def TexteCadre(master, text, X, Y, taille=12, Xmax=1, Ymax=1):
    	frame = Frame(master)
    	label = Label(frame, text=text, width=taille, fg='black')
    	frame.grid(column=X, row=Y, columnspan=Xmax, rowspan=Ymax, pady=1, padx=1)
    	label.pack()
     
    class caisse :
     
    	def __init__(self):
     
    		self.rootCaisse = Toplevel()
    		self.rootCaisse.focus()
    		self.rootCaisse.title("calcul caisse")
    		self.rootCaisse.config(background='#0099FF')
     
    		try :
    			self.rootCaisse.iconbitmap('icone'+os.sep+'caisse.ico')
    		except :
    			pass
     
    		self.cadreCaisse = LabelFrame(master=self.rootCaisse, text='caisse', padx=10, pady=10, background='#0099FF', labelanchor=N, font=("Times", 12, "bold"))
    		self.cadreCaisse.grid(column=0, row=0)
     
     
    		self.listeLigneDeSaisiCaisse = ["self.pieceDe1c", "self.pieceDe2c", "self.pieceDe5c", "self.pieceDe10c", "self.pieceDe20c", "self.pieceDe50c", "self.pieceDe1e", "self.pieceDe2e", "self.billetDe5e", "self.billetDe10e", "self.billetDe20e", "self.billetDe50e", "self.billetDe100e", "self.billetDe200e", "self.billetDe500e", "self.CB", "self.cheque"]
    		self.listeTexteCadreCaisse = ["pièce de 1c", "pièce de 2c", "pièce de 5c", "pièce de 10c", "pièce de 20c", "pièce de 50c", "pièce de 1€", "pièce de 2€", "billet de 5€", "billet de 10€", "billet de 20€", "billet de 50€", "billet de 100€", "billet de 200€", "billet de 500€", "CB", "chèque"]
     
    		for i in self.listeLigneDeSaisiCaisse:
     
    			TexteCadre(master=self.cadreCaisse, text=self.listeTexteCadreCaisse[self.listeLigneDeSaisiCaisse.index(str(i))], X=0, Y=self.listeLigneDeSaisiCaisse.index(str(i)))
    			globals()[i] = LigneDeSaisi(master=self.cadreCaisse, X=1, Y=self.listeLigneDeSaisiCaisse.index(str(i)), taille=6)
    le problème c'est que dans la suite de la classe je ne peut pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     self.pieceDe1c.saisi.get()
    , les lignes de saisi sont pourtant bien créées sur l'interface :'(


    edit : par contre cela marche ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    	for i in self.listeLigneDeSaisiCaisse:
    			globals()[i].entry.config(background='red')

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Salut,

    "self.pieceDe1c" est une chaîne de caractères.
    globals()["self.pieceDe1c"] = LigneDeSaisi(... crée une clef dans le dictionnaire globals() et lui assigne comme valeur le retour de la fonction "LigneDeSaisi".
    self.pieceDe1c... va chercher dans le dictionnaire correspondant à "self" puis dans celui de la classe l'attribut associé à la chaîne de caractères "pieceDe1c". Comme vous n'avez pas créé la clef dans ces dictionnaires là, çà doit planter.
    Tout çà est un peu n'importe quoi...

    Vous avez une liste self.listeLigneDeSaisiCaisse de chaînes de caractères: virez les "self.".
    On aura "pieceDe1c".
    Au lieu de fabriquer une association dans globals(), il faut la créer dans self.
    La fonction magique pour çà sera setattr i.e. remplacez globals()[i]... par setattr(self, i, LigneDeSaisi(...)).

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre éclairé
    Homme Profil pro
    BTS SN IR
    Inscrit en
    Mai 2017
    Messages
    513
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : BTS SN IR

    Informations forums :
    Inscription : Mai 2017
    Messages : 513
    Points : 700
    Points
    700
    Par défaut
    Merci, j'ai pas tout compris mais je vais voir tout ça
    je passerait le sujet en résolue si j'arrive à quelque chose se soir , sinon demain.
    Encore merci pour votre aide.

    EDIT: c'est vrai que à tête reposé c'est simple^^
    Est t'il possible de créé une nouvelle liste dans la boucle for de manière à ne plus avoir une liste de str mais un liste de mes LigneDeSaisi?

    dans les doc je n'est pas vus de méthode sur un str qui renvoie un nom de variable, et sur les forums que des solutions bizarres ou personne n'est d'accord :'(
    En faite mon idée c'est de faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    nouvelleListe.append(i.method() )
    où .method renvoie une variable avec un str
    Sinon je peut juste faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     nouvelleListe = [self.pieceDe1c, self.pieceDe2c, ect... ]
    mais ...

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Salut,

    Citation Envoyé par flapili Voir le message
    Est t'il possible de créé une nouvelle liste dans la boucle for de manière à ne plus avoir une liste de str mais un liste de mes LigneDeSaisi?

    dans les doc je n'est pas vus de méthode sur un str qui renvoie un nom de variable, et sur les forums que des solutions bizarres ou personne n'est d'accord :'(
    En faite mon idée c'est de faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    nouvelleListe.append(i.method() )
    où .method renvoie une variable avec un str
    Sinon je peut juste faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     nouvelleListe = [self.pieceDe1c, self.pieceDe2c, ect... ]
    mais ...
    On fait ce qu'on veut pour autant qu'on comprenne ce que çà veut dire.

    Ce que j'en comprends, c'est que vous avez une liste de "labels":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    listeTexteCadreCaisse = ["pièce de 1c", "pièce de 2c", "pièce de 5c", "pièce de 10c", "pièce de 20c", "pièce de 50c", "pièce de 1€", "pièce de 2€", "billet de 5€", "billet de 10€", "billet de 20€", "billet de 50€", "billet de 100€", "billet de 200€", "billet de 500€", "CB", "chèque"]
    qui va servir à construire une grille de saisie en associant chaque label à un objet LigneDeSaisi.
    Rien ne vous empêche de construire cette liste d'objets plutôt que de stocker chaque objet dans une variable avec un nom particulier. Mais lorsqu'on se retrouve à "associer" une liste de chaînes de caractères à des objets correspondant, on préfère créer un dictionnaire dédié plutôt que polluer "globals()" ou "self".
    D'autant que toutes les chaînes de caractères n'étant pas utilisables comme nom de variable, çà vous oblige à créer une liste de "labels" intermédiaires (["self.pieceDe1c", "self.pieceDe2c", ....]) alors que s'il y a bien une liste à créer ce serait plutôt [ 0.01, 0.02,... ] i.e. la valeur correspondant aux différentes pièces et billets.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Membre éclairé
    Homme Profil pro
    BTS SN IR
    Inscrit en
    Mai 2017
    Messages
    513
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : BTS SN IR

    Informations forums :
    Inscription : Mai 2017
    Messages : 513
    Points : 700
    Points
    700
    Par défaut
    bonjours, en faite la liste ["pièce de 1c", ect ..] permet juste de créer des labels avec comme texte les éléments de la liste, et la liste [self.pieceDe1c, ect...] me permet de faire ça dans la suite du programme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    for i in self.liste:
    	try:
    		int(i.saisi.get())
    		i.entry.config(background='white')
    	except ValueError:
    		i.entry.config(background='red')
    		self.Erreur = True
    je ne voit absolument pas comment faire ça avec un dictionnaire..

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Salut,

    Ben setattr(self, i, LigneDeSaisi(...)) ou mieux globals()[i] = LigneDeSaisi(... peuvent se remplacer par self.mon_dico[i] = LigneDeSaisi(... où self.mon_dico a été initialisé à dict().

    A partir de là, si self.liste est la liste des LigneDeSaisi, plutôt qu'écire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    for i in self.liste:
    	try:
    		int(i.saisi.get())
    		i.entry.config(background='white')
    	except ValueError:
    		i.entry.config(background='red')
    		self.Erreur = True
    on pourra écrire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    for ligne in self.mon_dico.values():
    	try:
    		int(ligne.saisi.get())
    		ligne.entry.config(background='white')
    	except ValueError:
    		ligne.entry.config(background='red')
    		self.Erreur = True
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  7. #7
    Membre éclairé
    Homme Profil pro
    BTS SN IR
    Inscrit en
    Mai 2017
    Messages
    513
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : BTS SN IR

    Informations forums :
    Inscription : Mai 2017
    Messages : 513
    Points : 700
    Points
    700
    Par défaut
    Vraiment merci, j'ai bien avancé dans mon programme, je le met en pièce jointe si quelqu'un veut y jeter un coup d'œil, il ne me reste plus que la partit sauvegarde dans un csv.
    Par contre avant que je me lance dans un code immonde de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    if var == "1":
    	var="01"
    elif var =="2": ...
    y'a t'il un moyen simple et beau que datetime.date.taday() renvoie JJ/MM/AAAA tout le temps même quand on est le 5 par exemple ?

    et comment faites vous pour afficher "setattr(self, i, LigneDeSaisi(...))" de cette manière ?
    Fichiers attachés Fichiers attachés
    • Type de fichier : 7z tmp.7z (14,6 Ko, 57 affichages)

  8. #8
    Membre confirmé

    Homme Profil pro
    Bidouilleur
    Inscrit en
    Avril 2016
    Messages
    721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bidouilleur

    Informations forums :
    Inscription : Avril 2016
    Messages : 721
    Points : 503
    Points
    503
    Billets dans le blog
    1
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    date = datetime.date.today()
    day = date.strftime('%d')
    month =  date.strftime('%m')
    Si j'ai bien saisi la demande.
    Le temps ronge l'amour comme l'acide.

  9. #9
    Membre éclairé
    Homme Profil pro
    BTS SN IR
    Inscrit en
    Mai 2017
    Messages
    513
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : BTS SN IR

    Informations forums :
    Inscription : Mai 2017
    Messages : 513
    Points : 700
    Points
    700
    Par défaut
    merci, en faite j'initialise 3 entry avec date.strftime('%d') , date.strftime('%m') , et date.strftime('%Y') , puis pour vérifier que si l'utilisateur à changer la date elle est toujours au bout format:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    for i in [self.DateJour, self.DateMois]:
    	if len(i.saisi.get()) == 2:			
    		try:
    			int(i.saisi.get())
    			i.entry.config(background='white')
    		except ValueError:
    			i.entry.config(background='red')
    			self.erreur = True
    	else:
    			i.entry.config(background='red')
    			self.erreur = True
    if len(self.DateAnnee.saisi.get()) == 4:			
    	try:
    		int(self.DateAnnee.saisi.get())
    		self.DateAnnee.entry.config(background='white')
    	except ValueError:
    		self.DateAnnee.entry.config(background='red')
    		self.erreur = True
    else:
    		self.DateAnnee.entry.config(background='red')
    		self.erreur = True
    Y'a t'il un moyen plus propre de procéder ?

    Au faites quelqu'un sait comment mettre une ligne de code comme Wiztricks ? genre surligner gris ?

  10. #10
    Membre confirmé

    Homme Profil pro
    Bidouilleur
    Inscrit en
    Avril 2016
    Messages
    721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bidouilleur

    Informations forums :
    Inscription : Avril 2016
    Messages : 721
    Points : 503
    Points
    503
    Billets dans le blog
    1
    Par défaut
    Déjà pour le mois, ce serait plus simple d'autoriser la saisie en spécifiant l'option validatecommand d'Entry, ou en le faisant via ta variable tkinter avec la méthode trace.

    C'est la même chose pour l'année, selon ce que tu autorises ou pas comme fourchette possible.
    Le temps ronge l'amour comme l'acide.

  11. #11
    Membre éclairé
    Homme Profil pro
    BTS SN IR
    Inscrit en
    Mai 2017
    Messages
    513
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : BTS SN IR

    Informations forums :
    Inscription : Mai 2017
    Messages : 513
    Points : 700
    Points
    700
    Par défaut
    Merci de votre aide, je passe le sujet en résolu, je pense que le titre ce celui ci n'est plus en raccord avec mes questions, à chaque problème sa solution son sujet, sa sera plus simple si quelqu'un d'autre fait une recherche

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Boucle for pour chercher le maximum dans une colonne
    Par khaoulagammoudi dans le forum R
    Réponses: 1
    Dernier message: 05/04/2017, 18h03
  2. [XL-2016] Réaliser une boucle for pour une donnée qui apparaît plusieurs fois dans un tableau
    Par bangibess dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 29/02/2016, 16h26
  3. Boucle for pour remplacer les virgules dans un userform
    Par floflo50100 dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 10/04/2015, 16h27
  4. Réponses: 5
    Dernier message: 05/02/2010, 19h04
  5. Classe générée pour un objet dans la bibliotheque
    Par tim974 dans le forum ActionScript 3
    Réponses: 2
    Dernier message: 31/08/2008, 14h37

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo