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 :

Appel d'une classe dans un bouton tkinter


Sujet :

Tkinter Python

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Chargé de référencement
    Inscrit en
    Septembre 2018
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Nouvelle-Zélande

    Informations professionnelles :
    Activité : Chargé de référencement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2018
    Messages : 61
    Points : 33
    Points
    33
    Par défaut Appel d'une classe dans un bouton tkinter
    Bonjour, j'ai le code suivant (qui permet de lier une fenêtre avec la molette de la souris) et je voudrais savoir comment je peut appeler à l'execution de la classe Scroll dans un bouton (dernière ligne du code) ? Lorsque j'execute ce code ça met énormément de temps et ça fait presque planter mon ordi.
    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
     
    from tkinter import *
    import numpy as np
    root = Tk()
    ....
    class Scroll():
     
        def __init__(self):
            # Fonction permettant de lier le déplacement de la fenêtre avec la molette de la souris
            def scrollEvent(event):
                print(event.delta)
                if event.delta >0:
                    print('déplacement vers le haut')
                    self.liste.yview_scroll(-2,'units')
                else:
                    print('déplacement vers le bas')
                    self.liste.yview_scroll(2,'units')
            # Lorsque l'on rentre dans la fenêtre, on active la molette
            def enrEnter(event):
                self.bind('<MouseWheel>', scrollEvent)
            # Lorsque l'on sort de la fenêtre, on désactive la liaison avec la molette
            def enrLeave(event):
                self.unbind('<MouseWheel>')
     
            self.bind('<Enter>',enrEnter)
            self.bind('<Leave>',enrLeave)
     
    # Création de la fenêtre principale
        self = Toplevel(root)
        self.geometry('400x350+400-520')
        # Création de la scrollbar
        self.scroll=Scrollbar(self,orient=VERTICAL)
        self.scroll.grid(row=0,column=1,sticky=N+S)
        self.scroll1=Scrollbar(self,orient=HORIZONTAL)
        self.scroll1.grid(row=1,column=0,sticky=E+W)
        # Création du canevas qui contient la frame qui contient les boutons
        self.liste =Canvas(self,yscrollcommand=self.scroll.set,xscrollcommand=self.scroll1.set)
     
        self.grid_columnconfigure(0,weight=1)
        self.grid_rowconfigure(0,weight=1)
     
        # Création de la frame, dans le canevas
        self.listeBout=Frame(self.liste)
        #Création du contenu 
        input = open('precipitation_diffusion_input_nom.txt','rt')
        for ligne in input.read().splitlines():
            ligne=ligne.split()
            label=Label(self.listeBout,text=ligne)
            label.grid(sticky=N)
            ce=np.loadtxt('precipitation_diffusion_input_data.txt',dtype=float)
            list=[]
            for i in range(91):
                for j in range(1):
                    var_float2 = DoubleVar(self.listeBout, ce[i])
                    ent = Entry(self.listeBout, textvariable= var_float2,width=4)
                    ent.grid(row=i,column=j+1)
                    list.append(ent)
            #for ligne in input.read().splitlines():
        #ligne=ligne.split()
        #label=Label(self.listeBout,text=ligne)
        #label.grid(row=0,column=0,rowspan=91)
        # Pack du canevas
        self.liste.grid(row=0,column=0)
        # Configuration de la scrollbar
        self.scroll.config(command=self.liste.yview)
        self.scroll1.config(command=self.liste.xview)
        # Positionnement du canevas au début
        self.liste.create_window(0,0,window=self.listeBout)
        self.listeBout.update_idletasks()
        self.liste.config(scrollregion=self.liste.bbox('all'))
        self.liste.yview_moveto(0)
        self.liste.xview_moveto(0)
     
        self.transient(root)
     
     
        barreDefil=Scroll()
     
     
    btn = Button(root, text="PRECIPITATION_DIFFUSION_input\n default data",command=Scroll,font=(None, 12)).grid(column=0,row=22)
    Est-ce qu'il y a aussi des incohérences dans le code ? Et je voudrais aussi agrandir la fenêtre du canevas j'ai essayer plusieurs chose mais sans succès.

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 778
    Points
    36 778
    Par défaut
    Salut,

    Citation Envoyé par TNema Voir le message
    je voudrais savoir comment je peut appeler à l'execution de la classe Scroll dans un bouton (dernière ligne du code) ?
    Appeler à l'éxécution d'une "class" ne veut rien dire: çà va dérouler la méthode __init__ qui est à priori là pour initialiser l'objet dont on pourra appeler les méthodes par la suite.

    Citation Envoyé par TNema Voir le message
    Lorsque j'execute ce code ça met énormément de temps et ça fait presque planter mon ordi.
    Si vous ne vous êtes pas planté en recopiant la définition de celle classe, la plupart des instructions sont dans la définition de la classe (et non dans une de ses méthodes). De plus, la dernière instruction recommence...
    Donc çà prend du temps mais est-ce que tout cela est utile?
    note: si vous ne savez pas encore programmer avec les classes, vous n'êtes pas obligé de les utiliser!

    Citation Envoyé par TNema Voir le message
    Et je voudrais aussi agrandir la fenêtre du canevas j'ai essayer plusieurs chose mais sans succès.
    Essayez d'ouvrir une documentation du Canvas et d'y trouver les attributs qui correspondent à çà: ce serait déjà un bon début.

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

  3. #3
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 301
    Points : 6 781
    Points
    6 781
    Par défaut
    Salut,

    Je vois mal ce que l'on pourrait faire avec ce code.

    Déjà sa structure est totalement érronée.
    En se limitant aux lignes principales on obtient ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    class Scroll():
        def __init__(self):
            def scrollEvent(event):
                ...
            def enrEnter(event):
                ...
            def enrLeave(event):
                ...
            self.bind('<Enter>',enrEnter)
            ...
        self = Toplevel(root)
        ...
    Comment explique-tu ces indentations ? Pour toi, est-ce-que cela a un sens ?

    Ensuite que représente self ici ? Rien dans ton code ne peut répondre à cette question.

    Tu termines en créant un bouton qui semble être le seul et unique widget de ton interface et qui paramètre command=Scroll mais Scroll est une classe et une classe ne peut servir de callback (ou slot).

    Je crois qu'une révision d'un cours sur la POO s'impose avant d'aller plus loin.

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Chargé de référencement
    Inscrit en
    Septembre 2018
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Nouvelle-Zélande

    Informations professionnelles :
    Activité : Chargé de référencement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2018
    Messages : 61
    Points : 33
    Points
    33
    Par défaut
    Salut,
    Citation Envoyé par VinsS Voir le message
    Comment explique-tu ces indentations ? Pour toi, est-ce-que cela a un sens ?
    Oui elles ont un sens mais comme l'a finalement dit wiztricks je ne vais pas utilisé de classe, ça m'a complement embrouillé et on peut très bien gérer sans en fait !
    Ensuite que représente self ici ? Rien dans ton code ne peut répondre à cette question.
    je voulais que self ici soit la deuxième fenêtre, une fenêtre transitoire au répertoire parent "root" (d'où l'utilisation de Toplevel )que j'ai mis en haut du code.
    Tu termines en créant un bouton qui semble être le seul et unique widget de ton interface et qui paramètre command=Scroll mais Scroll est une classe et une classe ne peut servir de callback (ou slot).
    le bouton n'étais pas le seul widget du code, je n'ai mis qu'une toute petite portion, celle qui me posait problème.
    J'ai finalement résolu mon problème, voici le code si ça intéresse:

    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
     
    .....
    root=Tk()
    .....
    def add():
        fen4 = Toplevel(root) # Création de la fenêtre racine
        fen4.title("PRECIPITATION & DIFFUSION input")
        fen4.geometry('350x350+400-520')
        a = Scrollbar(fen4, orient=VERTICAL)
        a.grid(row=0, column=1, sticky=N+S)
        b = Scrollbar(fen4, orient=HORIZONTAL)
        b.grid(row=1, column=0, sticky=E+W)
        c = Canvas(fen4,yscrollcommand=a.set, xscrollcommand=b.set)
        c.grid(row=0, column=0, sticky="news")
        a.config(command=c.yview)
        b.config(command=c.xview)
        fen4.grid_rowconfigure(0, weight=1)
        fen4.grid_columnconfigure(0, weight=1)
        fr = Frame(c)
     
        input = open('precipitation_diffusion_inputHMI1.txt','rt')
        ce=np.loadtxt('precipitation_diffusion_input.txt',dtype=float)
        list=[]
        for ligne in input.read().splitlines():
            ligne=ligne.split()
            label=Label(fr,text=ligne)
            label.grid(sticky=N+W)
        for i in range(91):
            for j in range(1):
                var_float2 = DoubleVar(fr, ce[i])
                ent = Entry(fr, textvariable= var_float2,width=4)
                ent.grid(row=i,column=j+1)
                list.append(ent)
        bouton1 = Button(fen4,text="Add")
        bouton1.grid(sticky=S)
        bouton2 = Button(fen4,text="Exit",command=fen4.destroy)
        bouton2.grid(sticky=S)
        c.create_window(0, 0,  window=fr)
        fr.update_idletasks()
        c.config(scrollregion=c.bbox("all"))
        fen4.transient(root)
     
    btn = Button(root, text="PRECIPITATION_DIFFUSION_input",command=add, height=2).grid(column=0,row=22)
    J'aurais une autre petite question, comment peut-on mettre la condition sur un bouton pour savoir Si l'utilisateur a cliqué dessus ou pas ?
    quelque chose comme :
    au début le bouton = False
    l'utilisateur clique dessus et alors le bouton = True , et là on peut émettre des conditions comme par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    if btn.click ==True:
       label.config(...)
    Merci encore je sais que j'ai l'air de galérer mais vos réponses m'aide beaucoup !

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 778
    Points
    36 778
    Par défaut
    Salut,

    Citation Envoyé par TNema Voir le message
    J'aurais une autre petite question, comment peut-on mettre la condition sur un bouton pour savoir Si l'utilisateur a cliqué dessus ou pas ?
    Par construction, un Button va déclencher l'appel à la "command"/fonction associé chaque fois qu'on clique dessus. Ce sera éventuellement le boulot de cette fonction de mémoriser quelque part l'évènement "a été cliqué au moins une fois".

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

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Chargé de référencement
    Inscrit en
    Septembre 2018
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Nouvelle-Zélande

    Informations professionnelles :
    Activité : Chargé de référencement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2018
    Messages : 61
    Points : 33
    Points
    33
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    l'évènement "a été cliqué au moins une fois"
    Et comment je pourrais écrire ça ? (l'évènement "cliqué" .click ne semble pas marcher)

  7. #7
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 778
    Points
    36 778
    Par défaut
    Citation Envoyé par TNema Voir le message
    Et comment je pourrais écrire ça ? (l'évènement "cliqué" .click ne semble pas marcher)
    Ce code là devrait fonctionner chez vous:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    import tkinter as tk
     
    def do_click():
          print ('clicked')
     
    tk.Button(text='click', command=do_click).pack()
    tk.mainloop()
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  8. #8
    Nouveau membre du Club
    Homme Profil pro
    Chargé de référencement
    Inscrit en
    Septembre 2018
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Nouvelle-Zélande

    Informations professionnelles :
    Activité : Chargé de référencement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2018
    Messages : 61
    Points : 33
    Points
    33
    Par défaut
    Oui ça c'est juste la définition d'un bouton simple, mais maintenant dans def do_click() comment je peux écrire la condition "si c'est le bouton1 qui a été cliqué :" ?
    imaginons que la fonction do_click() soit appeler par plusieurs bouton comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    import tkinter as tk
     
    def do_click():
          "si c'est le bouton1 qui a été cliqué":
          print ('clicked')
          "si c'est le bouton2 qui a été cliqué":
          print('blabla')
    bouton1=tk.Button(text='click', command=do_click).pack()
    bouton2=tk.Button(text='click', command=do_click).pack()
    tk.mainloop()

  9. #9
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 778
    Points
    36 778
    Par défaut
    Dans ce cas, il faut passer quelque chose en paramètre de do_click pour identifier le Button par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    import tkinter as tk
     
    def do_click(btn):
          print (btn['text'], 'clicked')
     
    for i in range(2):
        btn = tk.Button(text='btn-%d' % i)
        btn['command'] = lambda btn=btn: do_click(btn)
        btn.pack()
    tk.mainloop()
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  10. #10
    Nouveau membre du Club
    Homme Profil pro
    Chargé de référencement
    Inscrit en
    Septembre 2018
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Nouvelle-Zélande

    Informations professionnelles :
    Activité : Chargé de référencement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2018
    Messages : 61
    Points : 33
    Points
    33
    Par défaut
    pardon mais je ne vois toujours pas le moyen de mettre la condition "si j'ai cliqué sur le btn-0 : " dans le do_click() enfin dans le cas de votre code je comprend comment ça marche mais dès qu'il faut changer un Label ou une Entry je ne vois plus.. par exemple dans mon code moi j'ai ça :
    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
    from element_liste import * #importer les éléments du tableau périodique 
    ....
    def add(btn0,btn1,btn2,label0,label1,label2,Z0,Z1,Z2,M0,M1,M2,texte,varZ0,varZ1,varZ2,varM0,varM1,varM2):
        #Si l'utilisateur clique sur le bouton btn0:
            M0.config(textvariable=varM0)
            Z0.config(textvariable=varZ0)
            label0.config(text=texte,font=(None, 10),width=2,height=2)
     
        #Ou si l'utilisateur clique sur le bouton btn1:
            M1.config(textvariable=varM1)
            Z1.config(textvariable=varZ1)
            label1.config(text=texte,font=(None, 10))
     
         #Ou si l'utilisateur clique sur le bouton btn2:
            M2.config(textvariable=varM2)
            Z2.config(textvariable=varZ2)
            label2.config(text=texte,font=(None, 10))
     
     
    def elem(x):
        element=Tk()
        element.title("Proprietes")
        listbox=Listbox(element,height=10,width=40,highlightbackground="#070942")
        listbox.pack() #sert à ajuster la fenêtre
        listbox.insert(tkinter.END)
        for item in tableau[x]:
            listbox.insert(tkinter.END,item)
        ajouter0 = Button(element,text='Add',command=partial(add,btn0,btn1,btn2,label0,label1,label2,Z0,Z1,Z2,M0,M1,M2,texte=listbox.get(1,None),varM0=DoubleVar(f1,listbox.get(3,None)),varM1=DoubleVar(f1,listbox.get(3,None)),varM2=DoubleVar(f1,listbox.get(3,None)),varZ0=IntVar(f1,x),varZ1=IntVar(f1,x),varZ2=IntVar(f1,x)))
        ajouter0.pack(side=BOTTOM)
        quitter = Button(element,text='Exit',command=element.destroy)
        quitter.pack(side=BOTTOM)
        element.mainloop()
     
     
    def clicked():
        #exec(open("Tableau_periodique.py").read())
        fen1=Toplevel(root)
        fen1.title("Periodic table")
        #création des boutons du tableau
        bou_list=[]
        for item in tableau[1:]:
            bou=Button(fen1,text=item[1],command=lambda x=item[2]:elem(x),height=2,width=3,highlightbackground=item[6])
            bou.grid(row=item[4],column=item[5]) #grid est utilisé pour classer les bouttons par rangée et colonne
            bou_list.append(bou)
        frame= Frame(fen1, height=200, width= 300)
        autre = Message(frame, text="Others", width=300, font="Arial 15", bg="white")
        metauxtransition= Message(frame, text="Transition metals", width=300, font="Arial 15", bg="#FFCCCC")
        metauxtransition.pack()
        gazrare = Message(frame, text="Noble gases", width=300, font="Arial 15", bg="#00CCFF")
        gazrare.pack()
        nonmetaux= Message(frame, text="Nonmetals", width=300, font="Arial 15", bg="#00FF66")
        nonmetaux.pack()
        metauxalcalins= Message(frame, text="Alkali metals", width=300, font="Arial 15", bg="#FF9900")
        metauxalcalins.pack()
        metauxalcalinoterreux= Message(frame, text="Alkaline earth metals", width=300, font="Arial 15", bg="#FFFF33")
        metauxalcalinoterreux.pack()
        lanthanides= Message(frame, text="Lanthanoids", width=300, font="Arial 15", bg="#CCCC66")
        lanthanides.pack()
        actinides= Message(frame, text="Actinoids", width=300, font="Arial 15", bg="#FF3300")
        actinides.pack()
        metaux= Message(frame, text="Metalloids", width=300, font="Arial 15", bg="#9999FF")
        metaux.pack()
        frame.grid(row=0,column=7,rowspan=3,columnspan=5)
        centre=Listbox(fen1)
        centre.grid(row=0,column=1,rowspan= 1,columnspan=6)
        centre.insert(END)
        for item in ["Name:","Symbol:", "Atomic number:","Molar mass:","Row:","Column:","Color in the P.table:"]:
            centre.insert(END,item)
        mainloop()
        fen1.transient(root)
     
     
    #####
    ### MOLECULAR ATOM ######
    ##### Création du frame
    f1 = Frame(root, bd=1, relief='solid')
    varZ0=IntVar(f1,0)
    varZ1=IntVar(f1,0)
    varZ2=IntVar(f1,0)
    varM0=DoubleVar(f1,0.0)
    varM1=DoubleVar(f1,0.0)
    varM2=DoubleVar(f1,0.0)
     
    label = Label(f1, text='Molecular atom').grid(column=0,row=8)
     
    label = Label(f1, text='Z').grid(column=2,row=8)
    label = Label(f1, text='M').grid(column=3,row=8)
    label = Label(f1, text='Number').grid(column=4,row=8)
     
    #LES BOUTONS
    btn0 = Button(f1, text="1↘︎",width=2,command=clicked)
    btn0.grid(column=0,row=9)
    btn1 = Button(f1, text="2↘︎",width=2,command=clicked)
    btn1.grid(column=0,row=10)
    btn2 = Button(f1, text="3↘︎",width=2,command=clicked)
    btn2.grid(column=0,row=11)
     
    Z0 = Entry(f1,textvariable=varZ0,width=4)
    Z0.grid(column=2,row=9)
    Z1 = Entry(f1,textvariable=varZ1,width=4)
    Z1.grid(column=2,row=10)
    Z2 = Entry(f1,textvariable=varZ2,width=4)
    Z2.grid(column=2,row=11)
     
    M0 = Entry(f1,textvariable=varM0,width=4)
    M0.grid(column=3,row=9)
    M1 = Entry(f1,textvariable=varM1,width=4)
    M1.grid(column=3,row=10)
    M2 = Entry(f1,textvariable=varM2,width=4)
    M2.grid(column=3,row=11)
     
    varN0 =IntVar(f1,0)
    varN1 =IntVar(f1,0)
    varN2 =IntVar(f1,0)
    ent = Entry(f1,textvariable=varN0,width=4).grid(column=4,row=9)
    ent = Entry(f1,textvariable=varN1,width=4).grid(column=4,row=10)
    ent = Entry(f1,textvariable=varN2,width=4).grid(column=4,row=11)
     
    label0 = Label(f1, text='..',font=(None, 20))
    label0.grid(column=1,row=9)
    label1 = Label(f1, text='..',font=(None, 20))
    label1.grid(column=1,row=10)
    label2 = Label(f1, text='..',font=(None, 20))
    label2.grid(column=1,row=11)
    #placement du frame sur l'interface
    f1.grid(row=8,column=0,columnspan=4,rowspan=11)
    #### FIN MOLECULAR ATOM
    Il est un peut long mais pas dur à comprendre , sur l'interface ça donne ça :
    Nom : Capture d’écran 2018-11-06 à 13.22.42.png
Affichages : 1882
Taille : 14,7 Ko
    Quand on clique sur un bouton on doit changé les valeurs de Z et M sur la ligne du bouton où on a cliqué. (En faisant apparaître le tableau périodique)
    Mon problème se situe dans add() , si c'est le bouton 1 qui est cliqué on change '..' Z0 et M0 etc.. merci bcp pour votre patience

  11. #11
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 778
    Points
    36 778
    Par défaut
    Salut,

    Votre soucis est retrouver les widgets qui sont sur la même ligne de votre tableau pour pouvoir les mettre à jour. Autrement dit passer du Button aux widgets associés...
    Imaginez avoir stocké vos widgets dans une liste de listes (un tableau quoi) ou dans un dictionnaire, vous auriez matérialisé cette association et auriez la possibilité de passer du Button aux widgets correspondants.

    dictionnaires, liste de listes sont les structures de bases de tout programme. Vous vous rendez compte qu'en programmant une interface un peu complexe, vous vous retrouvez avec un tas de widgets qu'il faut ranger un peu pour s'y retrouver.

    Çà, c'est ce que vous devriez savoir faire avant de vous lancer dans ce genre de code.

    Et lorsque vous aurez codé cela une ou deux fois, vous vous apercevrez que c'est répétitif et donc qu'il doit bien avoir une meilleure solution pour retrouver l'indice (i, j) de la case sur laquelle on a cliqué ainsi que les widgets de la colonne j et de la ligne j.
    Ce qui devrait vous motiver pour ouvrir la documentation de "grid" pour y trouver ce qui pourrait vous aider à faire çà (et y trouver .grid_info, .grid_slaves).

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

  12. #12
    Nouveau membre du Club
    Homme Profil pro
    Chargé de référencement
    Inscrit en
    Septembre 2018
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Nouvelle-Zélande

    Informations professionnelles :
    Activité : Chargé de référencement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2018
    Messages : 61
    Points : 33
    Points
    33
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Votre soucis est retrouver les widgets qui sont sur la même ligne de votre tableau pour pouvoir les mettre à jour.
    Je vois ce que vous dites mais je ne sais pas si ça va m'aider , mon code marche très bien comme ça en fait. J'ai tester en mettant : btn0.click = False et une fois dans le def add():.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if bt0.click == False:
       M0.config(textvariable=varM0)
       Z0.config(textvariable=varZ0)
       label0.config(text=texte,font=(None, 10),width=2,height=2)
    et ça marche très bien. C'est juste que je ne sais pas gérer quand il y a plusieurs bouton qui appel une même fonction.

    imaginer que je vous ai demandé ça :

    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
    import tkinter as tk
    from functools import partial
     
    def do_click():
     
          "si c'est le bouton1 qui a été cliqué":
          label1.config(text='bonjour')
          "si c'est le bouton2 qui a été cliqué":
          label2.config(text='hola')
     
    label1=tk.Label(text='blabla')
    label2=tk.Label(text='bloblo')
    bouton1=tk.Button(text='click', command=do_click).pack()
    bouton2=tk.Button(text='click', command=do_click).pack()
    tk.mainloop()
    Comment écrire la condition "si c'est le bouton1/2 qui a été cliqué" ?

  13. #13
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 778
    Points
    36 778
    Par défaut
    C'est pas plus compliqué que d'écrire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    >>> def f(n):
    ...     if n == a: print('A')
    ...     elif n == b: print('B')
    ...
    >>> a = 1
    >>> b = 2
    >>> f(a)
    A
    et çà fonctionne aussi avec d'autres objets à la place d'entiers.

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

  14. #14
    Nouveau membre du Club
    Homme Profil pro
    Chargé de référencement
    Inscrit en
    Septembre 2018
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Nouvelle-Zélande

    Informations professionnelles :
    Activité : Chargé de référencement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2018
    Messages : 61
    Points : 33
    Points
    33
    Par défaut
    Ça doit être quelque chose comme ça non ? :
    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
    import tkinter
    from tkinter import *
    from functools import partial
    root = Tk()
     
    def do_click(n):
        if n == bouton1:
            label1.config(text='bonjour')
        if n == bouton2:
            label2.config(text='hola')
     
    label1=Label(root,text='blabla').grid(row=3,column=0)
    label2=Label(root,text='bloblo').grid(row=4,column=0)
    bouton1=Button(root,text='click')
    bouton1['command'] = lambda n=bouton1: do_click(n)
    bouton1.grid(row=0,column=0)
    bouton2=Button(root,text='click')
    bouton2['command'] = lambda n=bouton2: do_click(n)
    bouton2.grid(row=1,column=0)
    root.mainloop()
    Mais ça me met :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        label1.config(text='bonjour')
    AttributeError: 'NoneType' object has no attribute 'config'
    quand je clique sur le bouton1

  15. #15
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 778
    Points
    36 778
    Par défaut
    Citation Envoyé par TNema Voir le message
    Mais ça me met :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        label1.config(text='bonjour')
    AttributeError: 'NoneType' object has no attribute 'config'
    quand je clique sur le bouton1
    Cà c'est parce que vous avez mis None dans vos variables labelX. A vous de réfléchir un peu à ce que vous avez écrit lors de leur assignation.

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

  16. #16
    Nouveau membre du Club
    Homme Profil pro
    Chargé de référencement
    Inscrit en
    Septembre 2018
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Nouvelle-Zélande

    Informations professionnelles :
    Activité : Chargé de référencement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2018
    Messages : 61
    Points : 33
    Points
    33
    Par défaut
    J'ai trouvé ! Mon programme marche très bien c nickel ! merci de m'avoir aidé et merci de m'avoir un peu laisser cherché même si je commençais à avoir super mal à la tête

    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
    import tkinter
    from tkinter import *
    root = Tk()
     
    def do_click(n):
        if n == bouton1:
            label1.config(text='bonjour')
        if n == bouton2:
            label2.config(text='hola')
     
    label1=Label(root,text='blabla')
    label1.grid(row=3,column=0)
    label2=Label(root,text='bloblo')
    label2.grid(row=4,column=0)
    bouton1=Button(root,text='click')
    bouton1['command'] = lambda n=bouton1: do_click(n)
    bouton1.grid(row=0,column=0)
    bouton2=Button(root,text='click')
    bouton2['command'] = lambda n=bouton2: do_click(n)
    bouton2.grid(row=1,column=0)
    root.mainloop()

  17. #17
    Nouveau membre du Club
    Homme Profil pro
    Chargé de référencement
    Inscrit en
    Septembre 2018
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Nouvelle-Zélande

    Informations professionnelles :
    Activité : Chargé de référencement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2018
    Messages : 61
    Points : 33
    Points
    33
    Par défaut
    Pardon de vous re-déranger wiztricks, y-a-til un moyen (une méthode) pour sauvegarder ce que l'utilisateur rentre dans une Entry quand la fenêtre (sous fenêtre via Toplevel)se ferme ?
    C'est-à-dire quand je ré-ouvre la sous-fenêtre il y a ce que l'utilisateur à mis dans l'Entry. (J'ai penser à récupérer la valeur par .get() puis faire un .config pour modifier l'Entry mais c'est un peu lourd il doit y avoir bcp plus simple)

  18. #18
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 778
    Points
    36 778
    Par défaut
    Citation Envoyé par TNema Voir le message
    Pardon de vous re-déranger wiztricks, y-a-til un moyen (une méthode) pour sauvegarder ce que l'utilisateur rentre dans une Entry quand la fenêtre (sous fenêtre via Toplevel)se ferme ?
    Si la Toplevel est parent de l'Entry, alors l'Entry sera détruite avec la Toplevel.
    Donc, il va falloir récupérer quelque chose et ajouter un paramètre à la fonction/méthode qui la créé pour initialiser l'Entry avec.
    Les méthodes de bases pour faire çà sont décrites dans les tutos d'effbot et une fois compris, vous pouvez allez regarder ce que fait le module tkinter.commondialog pour le réutiliser, l'adapter.

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

  19. #19
    Nouveau membre du Club
    Homme Profil pro
    Chargé de référencement
    Inscrit en
    Septembre 2018
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Nouvelle-Zélande

    Informations professionnelles :
    Activité : Chargé de référencement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2018
    Messages : 61
    Points : 33
    Points
    33
    Par défaut
    bonjour ,
    Oui Toplevel est parent de l'Entry, récupérer la valeur placer dans l'entry ok.
    "ajouter un paramètre à la fonction/méthode qui la créé pour initialiser l'Entry avec" , oui c'est exactement ça !
    pardon mais je suis perdu avec les liens que vous m'avez envoyé.. il n'y a pas quelque chose de plus simple .. (sans les classes)?

  20. #20
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 778
    Points
    36 778
    Par défaut
    Salut,

    Citation Envoyé par TNema Voir le message
    pardon mais je suis perdu avec les liens que vous m'avez envoyé.. il n'y a pas quelque chose de plus simple .. (sans les classes)?
    Hélas, il serait beaucoup plus compliqué de faire sans les class qu'avec. Et c'est pas un hasard si la programmation des interfaces graphiques est une bonne introduction à la POO: elle est utile même pour programmer des choses "simples" compte tenu de la multitude d'objets à gérer et des relations à construire entre eux.

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

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Appel d'une classe dans un JavaBean
    Par lamur dans le forum Servlets/JSP
    Réponses: 3
    Dernier message: 07/10/2010, 15h58
  2. Appel d'une classe dans une jsp
    Par _ash_ dans le forum Servlets/JSP
    Réponses: 5
    Dernier message: 05/07/2009, 13h56
  3. Appel d'une classe dans un autre répertoire
    Par frites.saucisse dans le forum Général Python
    Réponses: 2
    Dernier message: 08/07/2008, 16h05
  4. appel d'une classe dans une fonction
    Par fraisa1985 dans le forum Général Java
    Réponses: 7
    Dernier message: 27/03/2008, 12h11

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