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 :

Python, Tkinter et PostgreSQL


Sujet :

Tkinter Python

  1. #1
    Membre confirm�
    Homme Profil pro
    retrait�
    Inscrit en
    Septembre 2010
    Messages
    116
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, H�rault (Languedoc Roussillon)

    Informations professionnelles :
    Activit� : retrait�
    Secteur : B�timent Travaux Publics

    Informations forums :
    Inscription : Septembre 2010
    Messages : 116
    Par d�faut Python, Tkinter et PostgreSQL
    Bonjour � tous,
    Je d�couvre le trio Python, Tkinter, PosgreSQL avec comme support d'exercice la base d'exemple 'Le_Comptoir'
    Je me mets dans la situation ou un gestionnaire souhaiterait avoir sous la main un �tat qui pourrait lui pr�senter toutes les commandes gr�ce � 2 listbox et un widget texte.
    La premi�re listbox afficherais les codes clients, la seconde tous les num�ros de commandes correspondant au choix du code client de la premi�re.
    Le widget texte afficherais le d�tail de la commande choisie.
    Je suppose que le gestionnaire aimerais aussi avoir dans un toplevel un aper�u r�sum� des produits habituellement achet�s par chaque clients et pour chaque produit, dans un autre toplevel d�pendant du pr�c�dent, l'historique des achats pour �ventuellement relancer les 'commerciaux' sur le terrain.
    Mon code fonctionne jusqu'au premier toplevel inclus mais est brouillon.
    Questions :
    - comment doit-on utiliser la manipulation du curseur ?
    doit-t �on l'ouvrir et le refermer apr�s chaque interrogation de la base ou peut-il rester ouvert jusqu'� la fermeture de l'application ?
    -dans le cas pr�sent j'ai choisi d'enregistrer une liste de tuples et d'it�rer dessus pour afficher les commandes. Est-ce la bonne m�thode ou aurais-du plut�t r�interroger la base � chaque choix ?
    - le premier toplevel qui affiche la liste des produits habituellement achet�s par le client dans un widget texte est d�pendant du code client s�lectionn� dans la premi�re listbox. C�est OK mais je souhaiterais remplacer le widget texte par une listbox pour permettre un choix dans cette liste et relancer une requ�te pour obtenir l'historique des achats du produit ainsi choisi.
    Comment fait-on pour lire une variable contenue dans un toplevel depuis un autre toplevel ?
    Merci d'avance.

  2. #2
    Membre confirm�
    Homme Profil pro
    retrait�
    Inscrit en
    Septembre 2010
    Messages
    116
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, H�rault (Languedoc Roussillon)

    Informations professionnelles :
    Activit� : retrait�
    Secteur : B�timent Travaux Publics

    Informations forums :
    Inscription : Septembre 2010
    Messages : 116
    Par d�faut
    Nom : Capture d��cran 2025-05-11 215305.jpg
Affichages : 115
Taille : 123,8 Ko
    Nom : Capture d��cran 2025-05-11 215426.jpg
Affichages : 114
Taille : 140,7 Ko
    Nom : Capture d��cran 2025-05-11 215532.jpg
Affichages : 116
Taille : 189,2 Ko
    copies d'�crans pour �tayer la discussion.

  3. #3
    Expert �minent
    Homme Profil pro
    Architecte technique retrait�
    Inscrit en
    Juin 2008
    Messages
    21 723
    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 723
    Par d�faut
    Salut,

    python, tkinter et postgresql, �a fait un tas de sujets qui ont � priori peu de rapport les uns avec les autres et pour lesquels tout m�langer n'aide pas � exposer les soucis que vous rencontrez (et l'aide qu'on peut vous apporter).


    Citation Envoy� par luc pic Voir le message
    - comment doit-on utiliser la manipulation du curseur ?
    doit-t �on l'ouvrir et le refermer apr�s chaque interrogation de la base ou peut-il rester ouvert jusqu'� la fermeture de l'application ?
    En supposant qu'il s'agit du "curseur" cr�e pour acc�der � la base de donn�es... il est g�r� par le pilote (le bout de code qui permet le dialogue entre le programmeur python et la base de donn�e). Avec PostGreSQL, on utilise souvent psycopg2... dont la une FAQ qui r�pond � cette question:
    Citation Envoy� par FAQ
    When should I save and re-use a cursor as opposed to creating a new one as needed?
    Cursors are lightweight objects and creating lots of them should not pose any kind of problem. But note that cursors used to fetch result sets will cache the data and use memory in proportion to the result set size. Our suggestion is to almost always create a new cursor and dispose old ones as soon as the data is not required anymore (call close() on them.) The only exception are tight loops where one usually use the same cursor for a whole bunch of INSERTs or UPDATEs.
    Citation Envoy� par luc pic Voir le message
    -dans le cas pr�sent j'ai choisi d'enregistrer une liste de tuples et d'it�rer dessus pour afficher les commandes. Est-ce la bonne m�thode ou aurais-du plut�t r�interroger la base � chaque choix ?
    Si vous aviez choisi comme base de donn�es sqlite3, la base de donn�e n'�tant pas partag�e (entre plusieurs utilisateurs) on sait quand son �tat sera modifi� et quand relire...

    Avec une base de donn�es multi-utilisateurs (comme PostgreSQL), on suppose que des mises � jours pourront �tre faites � l'insu du programme. On devra relire souvent si �a vaut le coup.
    Par exemple, la liste des commandes pass�e par X le mois dernier ne changera pas (avant la fin du mois), par contre les commandes en cours bougent...

    Quelque part, c'est une cons�quence de votre choix...

    Citation Envoy� par luc pic Voir le message
    Comment fait-on pour lire une variable contenue dans un toplevel depuis un autre toplevel ?
    Un toplevel est � priori une fen�tre secondaire qui peut contenir d'autres widgets. Un widget pourra afficher du texte. Pour ce qui est des variables, elles n'existent (et sont d�finies) que dans le code m�me si ce qui s'affiche a �t� r�cup�r� d'une ou de plusieurs variables.

    Apr�s on peut toujours faire des choses en structurant un peu affichage/code/... mais pour l'instant, la question n'est pas tr�s claire.

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

  4. #4
    Expert confirm� Avatar de papajoker
    Homme Profil pro
    D�veloppeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 323
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ni�vre (Bourgogne)

    Informations professionnelles :
    Activit� : D�veloppeur Web
    Secteur : High Tech - Multim�dia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 323
    Par d�faut
    bonjour
    Citation Envoy� par luc pic Voir le message
    Comment fait-on pour lire une variable contenue dans un toplevel depuis un autre toplevel ?
    Sans la moindre id�e de ton code et du r�el besoin, aucune id�e
    une piste ? si tu d�sires lire � la fermeture du "dialog"
    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
    import tkinter as tk
     
     
    class NewWindow(tk.Toplevel):
        """toplevel avec une variable `self.variable` a lire depuis l'appelant"""
     
        def __init__(self):
            super().__init__()
            self.minsize(400, 200)
            self.title("sous fenetre")
            self.variable = tk.StringVar(self, "editer ce texte")
            tk.Entry(self, textvariable=self.variable).pack()
     
     
    def lireInfo():
        print("variable dans MAIN fenetre après fermeture :", autre.variable.get())
        autre.destroy()
        #TODO ? mettre à jour ma fenetre principale en tenant compte de cette variable
     
     
    root = tk.Tk()
    root.title("root")
    root.minsize(800, 600)
     
    autre = NewWindow()
    autre.protocol("WM_DELETE_WINDOW", lireInfo)
    print("variable dans MAIN fenetre AVANT fermeture :", autre.variable.get())
     
    root.mainloop()
    m�me variante, mais la sous fenetre change une variable dans "main" (donc avant fermeture - plus besoin de lireInfo() ...)
    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
     
    import tkinter as tk
     
     
    class NewWindow(tk.Toplevel):
        """toplevel avec une variable du mainWin a lire depuis l'appelant"""
     
        def __init__(self, variable_a_transmettre):
            super().__init__()
            self.minsize(400, 200)
            self.title("sous fenetre")
            tk.Entry(self, textvariable=variable_a_transmettre).pack()
     
     
    def lireInfo():
        """ plus obligatoire dans ce cas """
        print("variable dans MAIN fenetre après fermeture :", truc.get())
        autre.destroy()
     
     
    root = tk.Tk()
    root.title("root")
    root.minsize(800, 600)
     
    truc = tk.StringVar(root, "editer ce texte")
     
    autre = NewWindow(variable_a_transmettre=truc)
    autre.protocol("WM_DELETE_WINDOW", lireInfo)
    print("variable dans MAIN fenetre AVANT fermeture :", truc.get())
     
    root.mainloop()
    Comme tu peux le voir dans mon exemple. C'est � nous de cr�er un code hyper minimaliste pour tester une nouvelle fonctionnalit� ! Uniquement lorsque l'on a trouv�, on l'int�gre dans notre projet.
    $moi= (:nono: !== :oops:) ? :king: : :triste: ;

  5. #5
    Expert �minent
    Homme Profil pro
    Architecte technique retrait�
    Inscrit en
    Juin 2008
    Messages
    21 723
    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 723
    Par d�faut
    Citation Envoy� par papajoker Voir le message
    m�me variante, mais la sous fenetre change une variable dans "main" (donc avant fermeture - plus besoin de lireInfo() ...)
    Une fen�tre secondaire qui fait de la saisie est une sorte de boite de dialogue.... et on a plut�t int�r�t � (apprendre �) utiliser les classes d�j� l�.

    Apr�s, c'est un dialogue souvent "modal" (on attend la r�ponse de l'utilisateur avant de continuer)... et dans ce cas, on peut coder cela en simple fonction:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    import tkinter as tk
     
    def on_window(master):
        w = tk.Toplevel()
        tk.Button(w, text="Done", command=w.destroy).pack()
        master.wait_window(w)
        return 'Ok'
     
    root = tk.Tk()
    root.update()    # pour que la fenêtre secondaire apparaisse au  dessus.
    print(on_window(root))
    D�sol� de ne pas avoir pris soin de faire transiter mes objets via des variables.... De toutes fa�ons, sans montrer comment il codait, impossible de se mettre � son niveau mais on peut se faire plaisir en jetant des cacahou�tes.

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

  6. #6
    Membre confirm�
    Homme Profil pro
    retrait�
    Inscrit en
    Septembre 2010
    Messages
    116
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, H�rault (Languedoc Roussillon)

    Informations professionnelles :
    Activit� : retrait�
    Secteur : B�timent Travaux Publics

    Informations forums :
    Inscription : Septembre 2010
    Messages : 116
    Par d�faut
    Salut � tous et merci pour vos r�ponses,
    Dans l�ordre et � propos du curseur,
    J�ai utilis�, il y a longtemps, Access ou le probl�me du curseur ne se posait pas c�est pourquoi aujourd�hui je ne sais pas trop comment le g�rer.
    En situation professionnelle, il est probable que l�application resterait ouverte toute la journ�e et je me pose la question de savoir s�il serait prudent de laisser ainsi ouverte la liaison avec la base. Bien s�r �a �vite les mises � jour en cas de multipostes.
    Pour moi c�est un exercice sans objectif mais dans le cas contraire il faudrait en tenir compte.
    - Merci pour le lien avec la FAQ, maintenant, j�ai la r�ponse.
    Pour le passage de valeurs entre toplevel, je n�ai r�ussi jusque l� qu�en contournant le probl�me avec des variables globales.
    Merci pour les exemples de code. Je vais essayer de les comprendre puis de les adapter.
    Le code qui correspond aux images n�est pas canonique mais il fonctionne tr�s bien. L�ajout de fen�tres suppl�mentaires pour affiner les d�tails dans l�historique des commandes sera un plus.
    Je reviendrai quand j�aurais remplac� le texte d�roulant de la nouvelle fen�tre par une listbox pour permettre les choix de produits et rajout� une toplevel d�pendante de la premi�re qui affichera les ventes chronologiques par produit par client.
    Encore merci.

  7. #7
    Expert �minent
    Homme Profil pro
    Architecte technique retrait�
    Inscrit en
    Juin 2008
    Messages
    21 723
    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 723
    Par d�faut
    Citation Envoy� par luc pic Voir le message
    Pour le passage de valeurs entre toplevel, je n�ai r�ussi jusque l� qu�en contournant le probl�me avec des variables globales.
    Lorsqu'on utilise une interface graphique comme tkinter, on se retrouve avec des fonctions appel�es callback (ou fonctions de rappels) qui sont appel�es par le GUI suite � certains �v�nements.

    Pour passer des donn�es r�cup�r�es dans ces fonctions � d'autres bouts du programme, difficile de ne pas passer par des variables globales. Ce n'est pas un contournement, c'est la solution d'autant qu'avec python les variables ne sont "globales" que pour le module qui les d�finit.

    L'autre option, c'est d'utiliser la POO avec attributs et relations d'instances.

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

  8. #8
    Expert confirm� Avatar de papajoker
    Homme Profil pro
    D�veloppeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 323
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ni�vre (Bourgogne)

    Informations professionnelles :
    Activit� : D�veloppeur Web
    Secteur : High Tech - Multim�dia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 323
    Par d�faut
    Citation Envoy� par luc pic Voir le message
    Pour le passage de valeurs entre toplevel...
    ...et rajout� une toplevel d�pendante de la premi�re qui ....
    D�j�, je ne comprends pas cet usage de "toplevel", tu vois souvent des applications comme cela ?
    $moi= (:nono: !== :oops:) ? :king: : :triste: ;

  9. #9
    Membre confirm�
    Homme Profil pro
    retrait�
    Inscrit en
    Septembre 2010
    Messages
    116
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, H�rault (Languedoc Roussillon)

    Informations professionnelles :
    Activit� : retrait�
    Secteur : B�timent Travaux Publics

    Informations forums :
    Inscription : Septembre 2010
    Messages : 116
    Par d�faut Python, Tkinter et PostgreSQL
    Bonjour � tous,
    J�ai remplac� le texte d�roulant par une listbox pour pouvoir s�lectionner des produits et comparer les commandes d'une ann�e sur l'autre.
    C'est Ok �a fonctionne mais au niveau des toplevel_2, je rencontre un probl�me � l'articulation des x.. fen�tres
    J�aurais souhait� qu�elles restent au premier plan jusqu�� l'appui sur le btn 'autre vue' pour redonner la main � top_1 afin de proc�der � un autre choix d'ann�e par exemple.
    L'id�al serait quelles reprennent le focus d�s qu�on les bouge.
    Pour ne pas encombrer le code et pour les essais j'ai cod� � part, juste l'interaction entre les fen�tres.
    Je souhaiterais avoir votre avis et vos conseils pour cette manip.
    Merci.
    Le bout de code pour les essais et la copie d��cran correspondent sans les d�tails d�interrogation de la base, � la premi�re copie d��cran.
    Nom : Capture d��cran 2025-05-18 112339.jpg
Affichages : 78
Taille : 210,9 Ko
    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
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
     
    from tkinter import *
     
    class Clients():
        "client choisi dans la liste pour comparer l'évolution de ses commandes"
        def __init__(self, cli):
            self.cli = cli
     
    class Produits():
        "nom du produit choisi pour les comparaisons"
        def __init__(self, nmp):
            self.nmp = nmp
     
    class DtAn():
        "Année choisie"
        def __init__(self, dateAn):
            self.dateAn = dateAn
     
    # ------------- fenetre 1 ---------------------------------------------------------------
    def open_Toplevel_1():
        top_1 = Toplevel()
        top_1.title("Fenetre Toplevel_1")
        top_1.geometry("400x400+600+200")
    #---
        top_1.transient(fen)    # Place la fenêtre fille au-dessus de la fenêtre parent
        top_1.grab_set()        # Empêche l'utilisateur d'interagir avec la fenêtre parent
        top_1.focus_set()       # Donne le focus à la fenêtre fille top_1
    #---
        v0=str(L0.get(L0.curselection())) # ; print(v0) #  Choix du client
        client.cli = v0 # modif de la valeur nom du client
    #---
        tx_l25_1 = "Les differents choix dans ces listes vont permettre de construire \n"
        tx_l25_2 = " plusieurs requetes SQL differentes afin de comparaisons \n"
        tx_l25_3 = " Les résultats  seront presentés dans les toplevel_2 multiples"
     
        label_25 = Label(top_1, text=tx_l25_1 + tx_l25_2 + tx_l25_3)
        label_25.place(x=10, y= 200)
     
        bt_1 = Button(top_1, text = "vers toplevel_2 pour voir les achats de cet article " \
        , state= "disabled", width=40, command = open_Toplevel_2)
        bt_1.pack()
     
        bt_2 = Button(top_1, text = "Quitter", width=12, command = top_1.destroy)
        bt_2.pack()
     
        L1=Listbox(top_1,width=15, height=4)
        L1.place(x=50 , y=100)
        produits=('Produit_Bleu','Produit_Blanc','Produit_Rouge','Produit_Vert')
     
        L2=Listbox(top_1,width=8, height=4)
        L2.place(x=150 , y=100)
        annees=('2022','2023','2024','2025')
     
        for item in produits:
            L1.insert(END, item)
     
        for item in annees:
            L2.insert(END, item)
    #---
        def choixP(evt): # choix des produits
            if not evt.widget.curselection(): # indispensable pour eviter une erreur
                return
     
            v1=str(L1.get(L1.curselection())) # ; print(v1)
            produit_p.nmp = v1 # modif de l'attribut d'instance  'nom du produit'
    #---
        def cxAn(evt): # choix de l'année'
            if not evt.widget.curselection(): # indispensable
                return
     
            v2=str(L2.get(L2.curselection())) # ; print(v2)
     
            date_a.dateAn = v2 # modif de l'attribut d'instance 'date'
     
            if date_a.dateAn !='' and produit_p.nmp !='': bt_1.config(state="active")
            """ evite l'erreur de non choix """
     
        L1.bind("<<ListboxSelect>>", choixP)
        L2.bind("<<ListboxSelect>>", cxAn)
    #---
        tx01=StringVar() ; tx01.set(v0)
        E0=Entry(top_1, textvariable=tx01, width=15) # affiche le nom du client (liste L0)
        E0.place(x=50, y=300)
    #---
        top_1.mainloop()
     
    #----------- fenetre 2 ------------------------------------------------------------------------
    def open_Toplevel_2():
        def autrechoix():
            "supprimer le transient de top_2 pour rendre la main à top_1"
    #        top_2.transient(parent=None)
    #        top_2.iconify(fen)
     
        top_2 = Toplevel()
        top_2.title("Fenetre Toplevel_2")
        top_2.geometry("300x200")
    #---
    ##    top_2.transient()    # Place la fenêtre fille au-dessus de la fenêtre parent
        top_2.focus_set()       # Donne le focus à la fenêtre fille top_2
    ##    top_2.grab_set()      # Empêche l'interaction avec la fenêtre parent
    #---
        label_2 = Label(top_2, text = "Fenetre TopLevel  N° 2 ")
        label_2.pack()
    #---
        txt25_1 = "Ici seront affichés les commandes de:   " + produit_p.nmp + '\n'
        txt25_2 = "effectués par le client:   " + client.cli + '\n'
        txt25_3 = " pendant toute l'année:   " + date_a.dateAn + '\n'
     
        label_25 = Label(top_2, text = txt25_1 + txt25_2 + txt25_3)
        label_25.pack()
     
        bt_1 = Button(top_2, text="Autre choix", width=10, command=autrechoix)
        bt_1.place(x=210, y= 170)
     
    #    print(fen.geometry()) # donne les coordonées et taille de 'fen' OK
    #    print(bt_2.winfo_x())              # -------  ne fonctionne pas ! ! ! ?
     
    ##    print(produit_p.nmp)
    ##    print(date_a.dateAn)
     
        top_2.mainloop()
    #==================================================================================================
    fen = Tk()
    fen.title("Fenetre principale 'fen'")
    fen.geometry("450x400+400+200")
     
    client = Clients      # 1 instanciation de la classe Clients
    produit_p = Produits  # 1 instanciation de la classe Produits
    date_a = DtAn         # 1 instanciation de la classe DtAn
    """ Pour éviter l'ultilisation de variables globales les attributs d'instance de ces trois classes
    accessibles partout, garderons en mémoire le résultat des differents choix de l'utilsateur """
     
    bt_0 = Button(fen, text = "vers toplevel_1 pour voir un article acheté", command = open_Toplevel_1)
    bt_0.place(x =140, y =50)
     
    label_0 = Label(fen, text = "Fenetre  'fen' ")
    label_0.pack()
     
    L0=Listbox(fen,width=10, height=4)
    L0.place(x=50, y=150)
     
    Clients=('Durand', 'Martin', 'Dupont', 'Smith')
    for item in Clients:
        L0.insert(END, item)
     
    fen.mainloop()

  10. #10
    Expert �minent
    Homme Profil pro
    Architecte technique retrait�
    Inscrit en
    Juin 2008
    Messages
    21 723
    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 723
    Par d�faut
    Salut,

    Citation Envoy� par luc pic Voir le message
    C'est Ok �a fonctionne mais au niveau des toplevel_2, je rencontre un probl�me � l'articulation des x.. fen�tres
    J�aurais souhait� qu�elles restent au premier plan jusqu�� l'appui sur le btn 'autre vue' pour redonner la main � top_1 afin de proc�der � un autre choix d'ann�e par exemple.
    Pourquoi partir sur des Toplevel plut�t que d�couper votre fen�tre principale en zones commande/affichage en utilisant de simples Frame's?
    On dirait que votre interface utilisateur est limit� par les widgets que vous connaissez, il y en a plein d'autres et la liste des wdigets de base avec des exemples est sur tkdocs (entre autres).

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

  11. #11
    Membre confirm�
    Homme Profil pro
    retrait�
    Inscrit en
    Septembre 2010
    Messages
    116
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, H�rault (Languedoc Roussillon)

    Informations professionnelles :
    Activit� : retrait�
    Secteur : B�timent Travaux Publics

    Informations forums :
    Inscription : Septembre 2010
    Messages : 116
    Par d�faut
    Salut Wiztricks et � tous,
    J'ai trouv�, quand je me suis lanc� dans cet exercice, l'id�e int�ressante de reproduire, comme sur un bureau, un ensemble non limit� de feuilles qui pr�sentent chacune des extraits comparables de states de commandes.
    L'intention serait d'aider � la prise de d�cision en politique commerciale, d'une hypoth�tique soci�t� d'import-export, comme semble l'�tre la base exemple Le_Comptoir trouv�e sur le web.
    La construction des requ�tes SQL diff�rentes � partir de 'briques' choisies dans les listbox me paraissait �tre un avantage pour un d�cideur. (et amusant pour le programmeur)
    Dans un cas r�el, un plus grand nombre de listbox (cat�gories de produits, pays, villes, saisons, etc.) permettrais des requ�tes instantan�es extr�mement utiles.
    Les r�ponses aux questions du genre : Qui achetait tel produit mais qui n�en ach�te plus ?
    Qui n�en ach�te jamais mais qui pourtant en ach�te d�autres dans la m�me cat�gorie ?
    Qui augmente en volume et qui diminue ? etc. etc.
    Sont primordiales pour un dir.com
    L'affichage d'histogrammes pourrait m�me venir compl�ter la pr�sentation, mais �a reste un exercice.
    L'articulation des toplevel entre elles n'est pas encore maitris�.
    La doc que j'ai trouv� n'est pas pl�thorique l�-dessus et les exemples manquent.
    A+

  12. #12
    Expert �minent
    Homme Profil pro
    Architecte technique retrait�
    Inscrit en
    Juin 2008
    Messages
    21 723
    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 723
    Par d�faut
    Citation Envoy� par luc pic Voir le message
    La construction des requ�tes SQL diff�rentes � partir de 'briques' choisies dans les listbox me paraissait �tre un avantage pour un d�cideur. (et amusant pour le programmeur)
    Afficher et choisir � partir de 3 listbox correspondant � client/ann�es/produits dans une Frame de la fen�tre principale serait plus simple que les distribuer dans des pseudo-pages r�alis�es avec des Toplevel (il faut r�aliser la gestion de la pagination en "plus").

    Citation Envoy� par luc pic Voir le message
    L'articulation des toplevel entre elles n'est pas encore maitris�.
    La doc que j'ai trouv� n'est pas pl�thorique l�-dessus et les exemples manquent.
    Le dialogue avec l'utilisateur pour saisir des valeurs dans N listbox pourra �tre r�aliser de tas de fa�ons diff�rentes. Dans un premier temps, vous avez plut�t int�r�t � utiliser ce qui existe (et que vous ma�trisez) quitte � changer plus tard.

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

  13. #13
    Membre confirm�
    Homme Profil pro
    retrait�
    Inscrit en
    Septembre 2010
    Messages
    116
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, H�rault (Languedoc Roussillon)

    Informations professionnelles :
    Activit� : retrait�
    Secteur : B�timent Travaux Publics

    Informations forums :
    Inscription : Septembre 2010
    Messages : 116
    Par d�faut
    re-Salut,
    J'ai compris en partie le fonctionnement des toplevel entre-elles.
    Dans le code de mise au point que j'ai publi� ce sont les lignes 25 et 26 qui sont en trop.

    ## top_1.transient(fen) # Place la fen�tre fille au-dessus de la fen�tre parent
    ## top_1.grab_set() # Emp�che l'utilisateur d'interagir avec la fen�tre parent

    L'application fonctionne maintenant, les fen�tres sont manipulables � souhait.
    Je vais inclure les liaisons avec la base et revenir plus tard car j'ai constat� un dysfonctionnement au niveau des Classes.
    Dans Le code succinct de d�veloppement, l'instanciation des Classes se passe normalement et les attributs sont consultables partout.
    Dans le code premier, celui qui acc�de � la base et qui pr�sente les vrais contenus des listbox, j'ai du donner des valeurs vides aux attributs ('') au moment de l'instanciation pour que les variables soient accessibles dans les toplevels. ! !
    Ca fonctionne mais ?
    A+

  14. #14
    Expert �minent
    Homme Profil pro
    Architecte technique retrait�
    Inscrit en
    Juin 2008
    Messages
    21 723
    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 723
    Par d�faut
    Citation Envoy� par luc pic Voir le message
    Ca fonctionne mais ?
    C�t� Listbox, on a un choix dans une liste de chaine de caract�res. Si on doit fabriquer une requ�te SQL avec un nom de client, un nom de produit et une ann�e, fabriquer un dictionnaire client=..., ann�e=..., produit=... suffira (dans un premier temps) pour construire une requ�te SQL.

    Citation Envoy� par luc pic Voir le message
    Dans le code premier, celui qui acc�de � la base et qui pr�sente les vrais contenus des listbox, j'ai du donner des valeurs vides aux attributs ('') au moment de l'instanciation pour que les variables soient accessibles dans les toplevels. ! !
    Les attributs d'une instance sont d�finis que lorsqu'un objet leur est assign� (comme pour les variables). On peut utiliser des attributs de classe pour d�finir des valeurs par d�faut. Dans votre code:

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #L3
    class Clients():
        "client choisi dans la liste pour comparer l'évolution de ses commandes"
        def __init__(self, cli):
            self.cli = cli
    #L28
        v0=str(L0.get(L0.curselection())) # ; print(v0) #  Choix du client
        client.cli = v0 # modif de la valeur nom du client
    #L25
    client = Clients      # 1 instanciation de la classe Clients
    "instancier", c'est comme un appel de fonction, il faut des parenth�ses et les �ventuels param�tres. Avec client = Clients vous avez juste cr�e l'alias client � l'objet associ� � la variable Clients (qui est la classe Clients). Puis avec client.cli = v0, vous cr�ez l'attribut de classe cli en lui assignant l'objet assign� � v0.

    Le code que vous �crivez � la chance de fonctionner mais comme il ne correspond pas � ce que vous pensez avoir �crit, c'est n'importe quoi.
    Bon courage.

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

  15. #15
    Membre confirm�
    Homme Profil pro
    retrait�
    Inscrit en
    Septembre 2010
    Messages
    116
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, H�rault (Languedoc Roussillon)

    Informations professionnelles :
    Activit� : retrait�
    Secteur : B�timent Travaux Publics

    Informations forums :
    Inscription : Septembre 2010
    Messages : 116
    Par d�faut
    Salut � tous,
    Merci pour les encouragements et pour la correction sur l'instanciation des Classes.
    Ca reste un passe temps.
    Le code avec extraction de la base fonctionne. les n toplevels affichent les commandes par produit soit par an ou pour l'ensemble.
    Ca a �t� tr�s amusant et passionnant.
    � mon Age je n'ai pas l'intention d'apprendre un nouveau m�tier.
    Encore merci pour tous vos bons conseils et votre patience.
    L.P

Discussions similaires

  1. Python Tkinter graphe
    Par Nifaste dans le forum Tkinter
    R�ponses: 17
    Dernier message: 22/12/2009, 11h19
  2. La POO avec python Tkinter
    Par alberth dans le forum Tkinter
    R�ponses: 2
    Dernier message: 06/05/2009, 14h53
  3. python, tkinter et les sockets (et les threads)
    Par bomberwaterman dans le forum R�seau/Web
    R�ponses: 6
    Dernier message: 02/01/2009, 19h53
  4. Conteneurs en Python Tkinter ?
    Par tuxout dans le forum Tkinter
    R�ponses: 2
    Dernier message: 09/04/2007, 18h46

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