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

Tkinter Python Discussion :

exec et grid


Sujet :

Tkinter Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Profil pro
    IT Manager
    Inscrit en
    Décembre 2009
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : IT Manager

    Informations forums :
    Inscription : Décembre 2009
    Messages : 3
    Par défaut exec et grid
    Bonjour,
    Je sèche...
    Je cherche à générer en python (2.6.2), dans une fonction une toplevel qui me présente les données d'une base (SQLite).
    Je voudrais pouvoir utiliser le même gabarit pour ensuite modifier ou ajouter une entrée dans la table.
    Je voudrais aussi que les champs soient nommés automatiquement en fonction de la structure de la table.
    En gros, dans ma fenêtre, je veux voir ligne par ligne :
    un Label avec le nom du champ et une Entry avec la valeur. L'entry doit pouvoir être configuré par la suite (DISABLED,..)donc il faut la nommer.

    Je suis passé par un dictionnaire qui me fournit les StringVar():
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    vardic=dict((self.lst_champs[i],StringVar()) for i in range(nb_champs))
    et par des "exec() in globals" pour attribuer automatiquement un nom à mes entry.

    dans une boucle, (liée au nombre de champs):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    for i in range(nb_champs):
    	my_ent=self.lst_champs[i]+"=Entry(frm,textvar=vardic['"+self.lst_champs[i]+"'])"
            grid_my_ent=self.lst_champs[i]+".grid(column=1,row="+str(i)+")"
    	my_lab="Label(frm,text='"+self.lst_champs[i]+"').grid(column=0,row="+str(i)+")"
     
    	exec (my_lab) in globals()
            exec (my_ent) in globals()
            exec (grid_my_ent) in globals()
    PROBLEME : selon que je lance l'exec du Label en premier ou en dernier, il apparait (centré par dessus mon entry) ou pas (en dessous ?).
    Comme si la valeur de column dans grid n'était pas prise en compte alors que celle de row l'est.
    Si quelqu'un a une petite idée de ce qu'il m'arrive...
    un peu d'aide serait bienvenue !
    Merci !

  2. #2
    Membre expérimenté
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    222
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 222
    Par défaut
    Bonjour,
    Ta façon n'est vraiment pas "propre". On peut (presque) toujours se passer du exec pour ce genre de chose.

    Je pense qu'il est temps pour toi de découvrir les joies de POO.
    Je suis pas sûr d'avoir bien compris ce que tu veux faire, mais voici un exemple en utilisant la programmation objet pour le toplevel.

    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
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
     
    # -*- coding: utf-8 -*-
    import sqlite3
    import Tkinter as tk
     
     
    class ViewTable(tk.Toplevel):
    	def __init__(self):
    		tk.Toplevel.__init__(self)
    		conn = sqlite3.connect('bdd.sqlite')
    		cur = conn.cursor()
    		self.listEntree = cur.execute("SELECT rowid, * FROM mytable ORDER BY rowid").fetchall()
    		self.listeChamp = [desc[0] for desc in cur.description]
    		cur.close()
    		self.curEntree = 0
    		self.listStringVar = []
    		self.listEntry = []
    		self.createObject()
     
    	def createObject(self):
    		for i, champ in enumerate(self.listeChamp):
     
    			tk.Label(self, text=champ+": ").grid(row=i, column=0, sticky=tk.E)
    			varia = tk.StringVar()
    			self.listStringVar.append(varia)
    			entry = tk.Entry(self, textvariable=varia)
    			entry.grid(row=i, column=1)
    			self.listEntry.append(entry)
    			tk.Checkbutton(self, text="disable", command=lambda x=i: self.onDisable(x)).grid(row=i, column=3)
     
    		tk.Button(self, text="précédent", command=self.precedent).grid(row=i+1, column=0)
    		tk.Button(self, text="suivant", command=self.suivant).grid(row=i+1, column=1, sticky=tk.W)
    		self.showValues()
     
    	def suivant(self):
    		if self.curEntree+1 < len(self.listEntree):
    			self.curEntree += 1
    			self.showValues()
     
    	def precedent(self):
    		if self.curEntree > 0:
    			self.curEntree -= 1
    			self.showValues()
     
    	def onDisable(self, i):
    		if self.listEntry[i].cget("state") == "normal":
    			self.listEntry[i].config(state="disabled")
    		else:
    			self.listEntry[i].config(state="normal")
     
    	def showValues(self):
    		infoEntree = self.listEntree[self.curEntree]
    		for var, value in zip(self.listStringVar, infoEntree):
    			var.set(str(value))
     
     
    root = tk.Tk()
     
    tk.Button(root, text="voir la table", command=ViewTable).pack()
    tk.Button(root, text="fermer", command=quit).pack()
     
    root.mainloop()

  3. #3
    Membre à l'essai
    Profil pro
    IT Manager
    Inscrit en
    Décembre 2009
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : IT Manager

    Informations forums :
    Inscription : Décembre 2009
    Messages : 3
    Par défaut Merci !
    Merci !
    Je sais que mon code n'est pas encore très propre, je pense qu'à force je finirai par m'améliorer ! Merci en tout cas pour ton aide, je suis moi aussi passé par une classe mais j'avais gardé les "mauvais" exec, je vais reprendre ça à la lueur de tes explications.

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

Discussions similaires

  1. Comment utiliser Site Exec sous FTP
    Par phig dans le forum Développement
    Réponses: 2
    Dernier message: 12/08/2003, 17h11
  2. capter l'evenement clic sur une cellule d'un string grid
    Par lasconic dans le forum Composants VCL
    Réponses: 3
    Dernier message: 25/06/2003, 10h51
  3. [POSTGRESQL] exec function
    Par peuh dans le forum Requêtes
    Réponses: 5
    Dernier message: 23/05/2003, 15h15
  4. Centrer un texte dans un string Grid
    Par christine dans le forum C++Builder
    Réponses: 5
    Dernier message: 22/10/2002, 22h33
  5. String Grid et choix d'une couleur pour une ligne
    Par Gigottine dans le forum C++Builder
    Réponses: 12
    Dernier message: 17/05/2002, 15h23

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