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 :

Ouvrir une deuxième fenetre en cliquant sur une image


Sujet :

Tkinter Python

  1. #1
    Nouveau membre du Club
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Mars 2017
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 33
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Mars 2017
    Messages : 4
    Par défaut Ouvrir une deuxième fenetre en cliquant sur une image
    Bonjour,

    Novice en python j’apprends tout doucement à faire mon premier gui.

    Voici ce que j'ai actuellement(fonctionnel).
    Il s'agit d'une interface permettant de :
    1) ouvrir une première fenetre avec un bouton "Choisir dans la liste des opportunités à l'étude"
    2) se connecter à la base de donnée postgres
    3)Ouvrir une seconde fenetre avec deux comboboxes (dont une disabled) permettant de requêter une table sur un champ "statut"
    4) Selon le statut choisi par l'utilisateur un script python "script.bat" se déclenche et lance une série d'opérations


    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
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    #!/usr/bin/env python
    #-*- coding: utf-8 -*-
    from tkinter import *
    import tkinter as tk
    import tkinter.ttk
    from tkinter import ttk
    import os
    import re
    import psycopg2
    import sys
    import pprint
    from subprocess import Popen
    from PIL import ImageTk
     
     
     
    def ListeChoix():
     
        #Define our connection string
        conn_string = "host='localhost' dbname='dbb' user='postgres' password='secret' port=5678"
        # print the connection string we will use to connect
        print ("Connecting to database")
     
        # get a connection, if a connect cannot be made an exception will be raised here
        conn = psycopg2.connect(conn_string)   
        # conn.cursor will return a cursor object, you can use this cursor to perform queries
        cursor = conn.cursor()
     
     
     
        # executer la requete pour obtenir la liste des statuts
        cursor.execute("SELECT  statut FROM coordination.opportunite group by statut")
        # Récupérer les résultats depuis la bdd
        records_statut = cursor.fetchall()
        # Enlever les accolades
        records_statut=[x for xs in records_statut for x in xs]
     
        # executer la requete pour obtenir la liste des opportunités
        #cursor.execute("SELECT  id_opp FROM coordination.opportunite group by id_opp")
        # Récupérer les résultats depuis la bdd
        #records_id_opp = cursor.fetchall()
        # enelever les accolades
        #records_id_opp=[x for xs in records_id_opp for x in xs]
     
        def updateSQLView(event):
            # executer la requete pour copier les csv depuis le serveur postgres de metis
            val = CategoryCombo.get()
            cursor.execute(
                    """
                SELECT ROW_NUMBER() OVER(ORDER BY id_opp) id, * 
                FROM(
                SELECT 
                   a.id_opp,
                   a.nom,
                   a.com_dep,
                   a.emprise,
                   a.travaux,
                   e.prev_starr,
                   a.cables,
                   a.typ_cable,
                   a.prog_dsp,
                   CASE WHEN a.debut_trvx IS NULL THEN 'Inconnue'::character varying ELSE a.debut_trvx END AS debut_trvx,
                   a.moa,
                   d.nb_suf,
                   f.longueur_max as longueur,
                   CASE WHEN b.nb_chb_exists IS NULL THEN 0 ELSE b.nb_chb_exists END AS  nb_chb_exists,
                   CASE WHEN g.nb_chb_a_creer IS NULL THEN 0 ELSE g.nb_chb_a_creer END AS  nb_chb_a_creer,
                   CASE WHEN g.nb_chb_desserte IS NULL THEN 0 ELSE g.nb_chb_desserte END AS  nb_chb_desserte,
                   CASE WHEN g.nb_chb_transport IS NULL THEN 0 ELSE g.nb_chb_transport END AS  nb_chb_transport,
                   CASE WHEN g.nb_chb_indef IS NULL THEN 0 ELSE g.nb_chb_indef END AS  nb_chb_indef
                FROM coordination.opportunite a
                LEFT JOIN rip1.vue_chambres_adn b ON a.id_opp like b.id_opp
                LEFT JOIN administratif.vue_nb_suf_opp d ON a.id_opp like d.id_opp
                LEFT JOIN coordination.vue_rapport_prev_starr e ON a.id_opp like e.id_opp
                LEFT JOIN coordination.vue_rapport_longueur f ON a.id_opp like f.id_opp
                LEFT JOIN coordination.vue_nb_chb_a_creer g ON a.id_opp like g.id_opp
                where statut like '""" +val+
                """' GROUP BY 
                a.id_opp,a.nom, a.com_dep,a.emprise, a.travaux,e.prev_starr, a.cables, 
                a.typ_cable, a.prog_dsp, a.debut_trvx, a.moa, d.nb_suf, b.nb_chb_exists, 
                f.longueur_max, g.nb_chb_a_creer, g.nb_chb_desserte,g.nb_chb_transport, g.nb_chb_indef
                order by id_opp DESC
                )vue;
                    """
                    """
                SELECT 
     
                    row_number() over () AS id,
                    a.id_opp, 
                    prev_starr,
                    lg_prev_st,
                    gc_typ_mut,
                    sum(CASE WHEN a.gc_typ_mut IS null THEN null ELSE longueur END) as lg_typ_mut,
                    gc_typ_int,
                    sum(CASE WHEN a.gc_typ_int IS null THEN null ELSE longueur END) as lg_typ_int,
                    sum(longueur) as longueur,
                    a.com_dep
                FROM coordination.opportunite as a
                LEFT JOIN  rip1.vue_chambres_adn as b on a.id_opp=b.id_opp 
                LEFT JOIN  administratif.vue_nb_suf_opp as d on a.id_opp=d.id_opp
                where statut like '""" +val+
                 """'GROUP BY
                a.id_opp, com_dep, prev_starr,lg_prev_st, gc_typ_mut, gc_typ_int
                ORDER BY id_opp
                ;
                    """
            )
     
            p = Popen("script.bat", cwd=os.getcwd())
            stdout, stderr = p.communicate()
     
     
     
        def getUpdateData(event):
            cursor.execute("SELECT  id_opp FROM coordination.opportunite where statut LIKE '"+CategoryCombo.get()+"' group by id_opp")
            res=cursor.fetchall()
            res = [x for xs in res for x in xs]        
            AccountCombo['values'] = res        
     
     
        top=Toplevel(root) # créer la fenêtre (instancier)
        # Creation labels pour les combobox
        message = "Selectionner un statut"  #définir le texte de l'étiquette
        lab=Label(top, text=message).grid(row = 2,column = 1,padx = 1, pady=0) # définir l'étiquette
        message = "Selectionner une opportunité\n (A venir)"  #définir le texte de l'étiquette
        labo=Label(top, text=message).grid(row = 4,column = 1,padx = 1, pady=0) # définir l'étiquette
        # Creation des combobox
        AccountCombo = tkinter.ttk.Combobox( top, width = 15)
        sqlData = ListeChoix    
        CategoryCombo = tkinter.ttk.Combobox(top,  values = records_statut)
     
     
        # Ajouter les combobox
        CategoryCombo.bind('<<ComboboxSelected>>', updateSQLView)
        #AccountCombo.bind('<<ComboboxSelected>>', updateSQLView)
        CategoryCombo.grid(row = 3,column = 1,padx = 10,pady = 25)
        AccountCombo.grid(row = 5,column = 1,pady = 25,padx = 10)
     
     
     
    class App:
     
     
     
        def __init__(self, master):
            fm = Frame(master)
     
            Button(fm, text="Choisir dans la liste des opportunités à l\'étude",command=ListeChoix).pack(side=TOP, anchor=W, fill=X, expand=YES)
            fm.pack(fill=BOTH, expand=YES)
     
     
     
    root = Tk()
    root.option_add('*font', ('verdana', 12, 'bold'))
    root.title("Générateur de rapports - GUI")
    display = App(root)
    root.mainloop()
    J'aimerais pouvoir rajouter une image dès lors que l'utilisateur lance le script python Nom : rapports.png
Affichages : 1295
Taille : 2,1 Ko

    J'ai un bout de code trouvé ici mais je ne sais pas comment l'introduire dans le mien de façon à ce qu'en cliquant sur l'image, la fenetre contenant l'image se ferme, et une seconde fenetre s'ouvre avec le bouton "Choisir dans la liste des opportunités à l'étude", et ainsi de suite..

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    import tkinter as tk
    from PIL import ImageTk
     
    root = tk.Tk()
    def make_button():
        b = tk.Button(root)
        image = ImageTk.PhotoImage(file="C:/Users/jean-Noel-11/Desktop/temp/rapports.png")
        b.config(image=image)
        b.image = image
        b.pack()
    make_button()
    root.mainloop()

    J'espère que mes explications sont à peu près claires...Pourriez vous m'aider?

    Merci d'avance,

    Marine

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

    Citation Envoyé par bruhnild Voir le message
    J'espère que mes explications sont à peu près claires...
    Pourriez vous m'aider?
    Si le scenario/cas d'utilisation que vous voulez construire est "en cliquant sur l'image, la fenetre contenant l'image se ferme, et une seconde fenetre s'ouvre avec le bouton "Choisir dans la liste des opportunités à l'étude", et ainsi de suite..", il faut commencer par essayez d'écrire juste cet enchaînement là.

    Et comme le plus compliqué n'est pas d'afficher une image dans un Button mais d'écrire la fonction/callback qui ira remplacer le Button par autre chose....
    C'est peut être là dessus qu'il faudrait travailler, non?
    Donc çà donne un truc du genre:
    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
     
    root = tk.Tk()
    def do_go():
        go_btn.pack_forget()
        quit_btn.pack()
     
    go_btn = tk.Button(root, text='Go', command=do_go)
    go_btn.pack()
    quit_btn = tk.Button(root, text='Quit', command=root.quit)
    tk.mainloop()
    Et le plus compliqué va être de décortiquer la mécanique de la chose pour l'intégrer à votre code (çà c'est votre boulot).

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

  3. #3
    Nouveau membre du Club
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Mars 2017
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 33
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Mars 2017
    Messages : 4
    Par défaut
    Merci pour ta réponse wiztricks.

    Je suis parvenue à intégrer mon image dans le code, seulement à présent une deuxième fenêtre vide s'ouvre en même temps que mon image, et je ne sait pas ce qui la déclenche.
    Pour finir, je n'ai pas réussi à intégrer la fonction de call back qui permet d'ouvrir et fermer une fenetre...



    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
    147
    148
    149
    150
    151
    152
    153
    from tkinter import *
    import tkinter as tk
    import tkinter.ttk
    from tkinter import ttk
    import os
    import re
    import psycopg2
    import sys
    import pprint
    from subprocess import Popen
    from PIL import ImageTk
    from tkinter import font
     
    def ListeChoix():
     
        #Define our connection string
        conn_string = "host='localhost' dbname='ddb' user='postgres' password='secret' port=5678"
        # print the connection string we will use to connect
        print ("Connecting to database")
     
        # get a connection, if a connect cannot be made an exception will be raised here
        conn = psycopg2.connect(conn_string)   
        # conn.cursor will return a cursor object, you can use this cursor to perform queries
        cursor = conn.cursor()
     
     
     
        # executer la requete pour obtenir la liste des statuts
        cursor.execute("SELECT  statut FROM coordination.opportunite group by statut")
        # Récupérer les résultats depuis la bdd
        records_statut = cursor.fetchall()
        # Enlever les accolades
        records_statut=[x for xs in records_statut for x in xs]
     
        # executer la requete pour obtenir la liste des opportunités
        #cursor.execute("SELECT  id_opp FROM coordination.opportunite group by id_opp")
        # Récupérer les résultats depuis la bdd
        #records_id_opp = cursor.fetchall()
        # enelever les accolades
        #records_id_opp=[x for xs in records_id_opp for x in xs]
     
        def updateSQLView(event):
            # executer la requete pour copier les csv depuis le serveur postgres de metis
            val = CategoryCombo.get()
            cursor.execute(
                    """
                SELECT ROW_NUMBER() OVER(ORDER BY id_opp) id, * 
                FROM(
                SELECT 
                   a.id_opp,
                   a.nom,
                   a.com_dep,
                   a.emprise,
                   a.travaux,
                   e.prev_starr,
                   a.cables,
                   a.typ_cable,
                   a.prog_dsp,
                   CASE WHEN a.debut_trvx IS NULL THEN 'Inconnue'::character varying ELSE a.debut_trvx END AS debut_trvx,
                   a.moa,
                   d.nb_suf,
                   f.longueur_max as longueur,
                   CASE WHEN b.nb_chb_exists IS NULL THEN 0 ELSE b.nb_chb_exists END AS  nb_chb_exists,
                   CASE WHEN g.nb_chb_a_creer IS NULL THEN 0 ELSE g.nb_chb_a_creer END AS  nb_chb_a_creer,
                   CASE WHEN g.nb_chb_desserte IS NULL THEN 0 ELSE g.nb_chb_desserte END AS  nb_chb_desserte,
                   CASE WHEN g.nb_chb_transport IS NULL THEN 0 ELSE g.nb_chb_transport END AS  nb_chb_transport,
                   CASE WHEN g.nb_chb_indef IS NULL THEN 0 ELSE g.nb_chb_indef END AS  nb_chb_indef
                FROM coordination.opportunite a
                LEFT JOIN rip1.vue_chambres_adn b ON a.id_opp like b.id_opp
                LEFT JOIN administratif.vue_nb_suf_opp d ON a.id_opp like d.id_opp
                LEFT JOIN coordination.vue_rapport_prev_starr e ON a.id_opp like e.id_opp
                LEFT JOIN coordination.vue_rapport_longueur f ON a.id_opp like f.id_opp
                LEFT JOIN coordination.vue_nb_chb_a_creer g ON a.id_opp like g.id_opp
                where statut like '""" +val+
                """' GROUP BY 
                a.id_opp,a.nom, a.com_dep,a.emprise, a.travaux,e.prev_starr, a.cables, 
                a.typ_cable, a.prog_dsp, a.debut_trvx, a.moa, d.nb_suf, b.nb_chb_exists, 
                f.longueur_max, g.nb_chb_a_creer, g.nb_chb_desserte,g.nb_chb_transport, g.nb_chb_indef
                order by id_opp DESC
                )vue;
                    """
                    """
                SELECT 
     
                    row_number() over () AS id,
                    a.id_opp, 
                    prev_starr,
                    lg_prev_st,
                    gc_typ_mut,
                    sum(CASE WHEN a.gc_typ_mut IS null THEN null ELSE longueur END) as lg_typ_mut,
                    gc_typ_int,
                    sum(CASE WHEN a.gc_typ_int IS null THEN null ELSE longueur END) as lg_typ_int,
                    sum(longueur) as longueur,
                    a.com_dep
                FROM coordination.opportunite as a
                LEFT JOIN  rip1.vue_chambres_adn as b on a.id_opp=b.id_opp 
                LEFT JOIN  administratif.vue_nb_suf_opp as d on a.id_opp=d.id_opp
                where statut like '""" +val+
                 """'GROUP BY
                a.id_opp, com_dep, prev_starr,lg_prev_st, gc_typ_mut, gc_typ_int
                ORDER BY id_opp
                ;
                    """
            )
     
            p = Popen("script.bat", cwd=os.getcwd())
            stdout, stderr = p.communicate()
     
     
     
        def getUpdateData(event):
            cursor.execute("SELECT  id_opp FROM coordination.opportunite where statut LIKE '"+CategoryCombo.get()+"' group by id_opp")
            res=cursor.fetchall()
            res = [x for xs in res for x in xs]        
            AccountCombo['values'] = res        
     
     
        top=Toplevel(root) # créer la fenêtre (instancier)
        # Creation labels pour les combobox
        message = "Selectionner un statut"  #définir le texte de l'étiquette
        lab=Label(top, text=message).grid(row = 2,column = 1,padx = 1, pady=0) # définir l'étiquette
        message = "Selectionner une opportunité\n (A venir)"  #définir le texte de l'étiquette
        labo=Label(top, text=message).grid(row = 4,column = 1,padx = 1, pady=0) # définir l'étiquette
        # Creation des combobox
        AccountCombo = tkinter.ttk.Combobox( top, width = 15)
        sqlData = ListeChoix    
        CategoryCombo = tkinter.ttk.Combobox(top,  values = records_statut)
     
     
        # Ajouter les combobox
        CategoryCombo.bind('<<ComboboxSelected>>', updateSQLView)
        #AccountCombo.bind('<<ComboboxSelected>>', updateSQLView)
        CategoryCombo.grid(row = 3,column = 1,padx = 10,pady = 25)
        AccountCombo.grid(row = 5,column = 1,pady = 25,padx = 10)
     
     
    def do_go():
     
     
        ListButton.pack(fill=BOTH, expand=YES)
    IconButton = Button( command=ListeChoix)
    image = ImageTk.PhotoImage(file="C:/github_repo/github_repo_python/gui/rapports_color.png")
    IconButton.config(image=image)
    IconButton.image = image
    IconButton.pack(fill=BOTH, expand=YES)
    colorfont = font.Font(family='verdana', size=10, weight=font.BOLD)
    ListButton = Button(text="Choisir dans la liste des opportunités à l\'étude", command=ListeChoix,font=colorfont, height=3  ).pack(side=TOP, anchor=W, fill=X, expand=YES)
     
     
    root = Tk()
    root.option_add('*font', ('verdana', 12, 'bold'))
    root.title("Générateur de rapports - GUI")
    root.mainloop()

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 743
    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 743
    Par défaut
    Citation Envoyé par bruhnild Voir le message
    Je suis parvenue à intégrer mon image dans le code, seulement à présent une deuxième fenêtre vide s'ouvre en même temps que mon image, et je ne sait pas ce qui la déclenche.
    Certes mais "programmer", c'est d'abord comprendre les instructions que l'ordinateur d'exécuter...
    Et comme ces instructions là, c'est vous qui les avez écrites, il faut apprendre à vous relire plutôt que d'écrire plus ou moins n'importe quoi et venir ici demander des explications.
    Votre code se comporte comme ces quelques lignes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    import tkinter as tk
    tk.Button(text='foo').pack()
    tk.Tk()
    tk.mainloop()
    Si vous aviez ouvert n'importe quel tuto sur tkinter, ou une documentation, vous verriez qu'on s'applique à créer la fenêtre principale, puis les widget qu'on veut y placer dedans.
    Et... pour résoudre le problème des 2 fenêtres, il suffit d'inverser la ligne 3 et la ligne 2.

    Citation Envoyé par bruhnild Voir le message
    Pour finir, je n'ai pas réussi à intégrer la fonction de call back qui permet d'ouvrir et fermer une fenetre...
    SI vous n'avez pas encore pris le temps d'apprendre à utiliser une interface graphique comme tkinter, c'est normal.
    A vous de prendre le temps d'ouvrir un tuto. (comme celui que je vous ai indiqué) et d'apprendre les bases et le comportement de l'engin.

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 04/05/2016, 12h00
  2. Copier une image sur une feuille et la coller sur une autre feuille
    Par Hierog dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 17/03/2011, 12h21
  3. DHCP sur une @IP 1 et DNS sur une @IP 2
    Par polls dans le forum Réseau
    Réponses: 1
    Dernier message: 20/08/2010, 12h27
  4. [XL-2002] Ecouter un evenement sur une cellule et le reproduire sur une autre cellule
    Par kulnae dans le forum Macros et VBA Excel
    Réponses: 28
    Dernier message: 17/08/2009, 21h21
  5. Réponses: 9
    Dernier message: 03/07/2006, 18h32

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