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

Vue hybride

luc pic Python, Tkinter et PostgreSQL 11/05/2025, 17h47
luc pic 667262 667263 667264... 11/05/2025, 22h02
wiztricks Salut, python, tkinter et... 12/05/2025, 14h40
papajoker bonjour Sans la moindre... 12/05/2025, 15h25
wiztricks Une fenêtre secondaire qui... 12/05/2025, 16h29
luc pic Salut à tous et merci pour... 12/05/2025, 19h21
wiztricks Lorsqu'on utilise une... 12/05/2025, 19h54
papajoker Déjà, je ne comprends pas cet... 12/05/2025, 21h21
Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    retraité
    Inscrit en
    Septembre 2010
    Messages
    113
    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 : 113
    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
    113
    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 : 113
    Par défaut
    Nom : Capture d’écran 2025-05-11 215305.jpg
Affichages : 101
Taille : 123,8 Ko
    Nom : Capture d’écran 2025-05-11 215426.jpg
Affichages : 99
Taille : 140,7 Ko
    Nom : Capture d’écran 2025-05-11 215532.jpg
Affichages : 99
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 710
    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 710
    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 321
    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 321
    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 710
    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 710
    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
    113
    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 : 113
    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 710
    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 710
    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 321
    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 321
    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
    113
    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 : 113
    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 : 62
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()

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