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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    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
    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
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    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 741
    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 confirmé

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    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
    Membre confirmé
    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
    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
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    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 741
    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
    Membre confirmé
    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
    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
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    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 741
    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

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

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