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

Python Discussion :

Bouton activé sans clic, de classe à classe


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut Bouton activé sans clic, de classe à classe
    Bonjour

    Il y a un problème d'exécution instantanée dans ce code
    Le "print" s'exécute sans aucune intervention de l'utilisateur

    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
    # !/usr/bin/env python 3.5
    # -*- coding: utf-8 -*-
     
    from tkinter import *
     
    class Gammic(Tk):
        def __init__(self):
            Tk.__init__(self)
            self.title(' :')
            self.ccc = None
            self.btc = Button(self, text='Comic', width=15, command=self.comic)
            self.btc.pack()
     
        def comic(self):
            if self.ccc is not None:
                self.ccc.destroy()
            self.ccc = Toplevel(self)
            self.ccc.geometry('600x666')
            self.btc2 = Button(self.ccc, text='Comic2', width=15, command=Gam2.brnch(self))
            self.btc2.pack()
     
    class Gam2(Gammic):
        def __init__(self):
            Gammic.__init__(self)
        def brnch(self):
            print('o')
     
    Gammic().mainloop()
    Dernière modification par Invité ; 07/05/2016 à 17h47.

  2. #2
    Membre chevronné
    Homme Profil pro
    Développeur banc de test
    Inscrit en
    Mai 2014
    Messages
    199
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur banc de test
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mai 2014
    Messages : 199
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    self.btc2 = Button(self.ccc, text='Comic2', width=15, command=Gam2.brnch(self))
    Bonjour,

    c'est là que vient le problème.

    En passant la commande avec les parenthèses (et les arguments requis) ça appelle la fonction plutôt que de pointer sur la fonction qui sera appelée au moment de cliquer.

    Malheureusement tkinter ne dispose pas d'argument permettant de faire passer les arguments qui seront appelés par commande.

    De plus j'y vois un autre problème, Game2 doit être instancié avant de pouvoir appeler la fonction brnch.

    Si vous ne souhaitez pas garder l'instance vous pouvez utiliser lambda :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    self.btc2 = Button(self.ccc, text='Comic2', width=15, command=lambda: Gam2().brnch())
    L'argument self de brnch est passé automatiquement par l'instance Game2()

    Mais le mieux serait de créer une fonction dans la classe Gammic pour conserver l'instance de Game2 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
        def comic(self):
            if self.ccc is not None:
                self.ccc.destroy()
            self.ccc = Toplevel(self)
            self.ccc.geometry('600x666')
            self.btc2 = Button(self.ccc, text='Comic2', width=15, command=self.cb_game2)
            self.btc2.pack()
     
        def cb_game2(self):
            self.gam2 = Gam2()
            self.gam2.brnch()
    Pour plus d'informations sur les callbacks tkinter : http://effbot.org/zone/tkinter-callbacks.htm

  3. #3
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 753
    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 753
    Par défaut
    Citation Envoyé par toumic Voir le message
    Le "print" s'exécute sans aucune intervention de l'utilisateur
    "Gam2.brnch(self)" appelle la fonction Gam2.brnch avec pour argument "self". Si vous voulez que ce soit la méthode "brnch" associé à l'objet "self", il faudrait écrire "self.brnch" - sans parenthèses - après avoir instancié "Gam2" et non "Gammic". Si tout ce que je raconte vous semble étrange, (re)lisez votre tuto. sur les classes.

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

  4. #4
    Invité
    Invité(e)
    Par défaut
    Merci pour vos éclaircissements qui ont permis d'accéder à la solution

    La fonction brnch fonctionne maintenant.
    Tout d'abord le retrait de "(self)", puis "@staticmethod" pour instancier je ne sais pas quoi

    Mais çà fonctionne

    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
    # !/usr/bin/env python 3.5
    # -*- coding: utf-8 -*-
     
    from tkinter import *
     
    class Gammic(Tk):
        def __init__(self):
            Tk.__init__(self)
            self.title(' :')
            self.ccc = None
            self.btc = Button(self, text='Comic', width=15, command=self.comic)
            self.btc.pack()
     
        def comic(self):
            if self.ccc is not None:
                self.ccc.destroy()
            self.ccc = Toplevel(self)
            self.ccc.geometry('600x666')
            self.btc2 = Button(self.ccc, text='Comic2', width=15, command=Gam2.brnch)
            self.btc2.pack()
     
    class Gam2(Gammic):
        def __init__(self):
            Gammic.__init__(self)
     
        @staticmethod
        def brnch():
            print('o')
     
    Gammic().mainloop()

  5. #5
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    "Gam2.brnch(self)" appelle la fonction Gam2.brnch avec pour argument "self". Si vous voulez que ce soit la méthode "brnch" associé à l'objet "self", il faudrait écrire "self.brnch" - sans parenthèses - après avoir instancié "Gam2" et non "Gammic". Si tout ce que je raconte vous semble étrange, (re)lisez votre tuto. sur les classes.

    - W
    J'ai finalement instancié "Gam2" et non "Gammic", car vos conseils fonctionnent.
    Comme "pycharm" corrige au fur et à mesure mes disfonctionnements, et qui en allant plus vite que la musique.
    Je ne fais que suivre ses arrangements de structuration, en ayant modifié l'instanciation "Gam2" par "Gammic"
    la correction me propose l'utilisation d'une super classe.

    Je vais essayer de comprendre pourquoi utiliser une super classe
    Voir bout de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    class Commatique(Gammique):
        """Branchement commatique"""
     
        def __init__(self):
            Commatique.__init__(self)
            super().__init__()
     
        @staticmethod
        def brnch_1():
            print('n')
     
    # class Gammique
    Gammique().mainloop()

  6. #6
    Membre très actif

    Homme Profil pro
    Bidouilleur
    Inscrit en
    Avril 2016
    Messages
    721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bidouilleur

    Informations forums :
    Inscription : Avril 2016
    Messages : 721
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par toumic Voir le message
    La fonction brnch fonctionne maintenant.
    Tout d'abord le retrait de "(self)", puis "@staticmethod" pour instancier je ne sais pas quoi
    Pourquoi utiliser une méthode statique ?

    Citation Envoyé par toumic Voir le message
    Voir bout de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    class Commatique(Gammique):
        """Branchement commatique"""
     
        def __init__(self):
            Commatique.__init__(self)
            super().__init__()
     
        @staticmethod
        def brnch_1():
            print('n')
     
    # class Gammique
    Gammique().mainloop()
    Si tu instancies Commatique, il risque d'y avoir un problème

  7. #7
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par bistouille Voir le message
    Pourquoi utiliser une méthode statique ?



    Si tu instancies Commatique, il risque d'y avoir un problème
    J'ai retiré la méthode statique, et remis l'instance "gammic" à la place de "Gam2"
    (j'en reviens au programme court)

    Mais je me retrouve à utiliser une fonction sans le "self" entre les "()"
    Là j'entre dans un domaine qui m'est inconnu

    Est-ce viable ?
    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
    # !/usr/bin/env python 3.5
    # -*- coding: utf-8 -*-
     
    from tkinter import *
     
    class Gammic(Tk):
        def __init__(self):
            Tk.__init__(self)
            self.title(' :')
            self.ccc = None
            self.btc = Button(self, text='Comic', width=15, command=self.comic)
            self.btc.pack()
     
        def comic(self):
            if self.ccc is not None:
                self.ccc.destroy()
            self.ccc = Toplevel(self)
            self.ccc.geometry('600x666')
            self.btc2 = Button(self.ccc, text='Comic2', width=15, command=Gam2.brnch)
            self.btc2.pack()
     
    class Gam2(Gammic):
        def __init__(self):
            Gammic.__init__(self)
     
        def brnch():
            print('o')
     
    Gammic().mainloop()
    En essayant "" la fonction est devenue "normale" avec le "(self)"

    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
    # !/usr/bin/env python 3.5
    # -*- coding: utf-8 -*-
     
    from tkinter import *
     
    class Gammic(Tk):
        def __init__(self):
            Tk.__init__(self)
            self.title(' :')
            self.ccc = None
            self.btc = Button(self, text='Comic', width=15, command=self.comic)
            self.btc.pack()
     
        def comic(self):
            if self.ccc is not None:
                self.ccc.destroy()
            self.ccc = Toplevel(self)
            self.ccc.geometry('600x666')
            self.btc2 = Button(self.ccc, text='Comic2', width=15,
                               command=lambda : Gam2.brnch(self))
            self.btc2.pack()
     
    class Gam2(Gammic):
        def __init__(self):
            Gammic.__init__(self)
     
        def brnch(self):
            print('o')
     
    Gammic().mainloop()
    Dernière modification par Invité ; 08/05/2016 à 10h44.

  8. #8
    Membre très actif

    Homme Profil pro
    Bidouilleur
    Inscrit en
    Avril 2016
    Messages
    721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bidouilleur

    Informations forums :
    Inscription : Avril 2016
    Messages : 721
    Billets dans le blog
    1
    Par défaut
    Bah non.

    Pour moi le but de passer une méthode à une commande de button, c'est de pouvoir travailler avec différents attributs/méthodes d'un objet, sinon, autant passer une simple fonction.
    Mais comme je ne sais ce que tu veux obtenir au final.

    Y'a t-il lieu d'avoir un héritage de Gammic par Gam2 ?
    A-priori non.

    Donc je pense que c'est plutôt une composition dont tu as besoin ici et non un héritage.
    Mais n'étant pas un foudre de guerre en objet, je me trompe peut-être

  9. #9
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 753
    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 753
    Par défaut
    Citation Envoyé par toumic Voir le message
    J'ai retiré la méthode statique, et remis l'instance "gammic" à la place de "Gam2"
    (j'en reviens au programme court)

    Mais je me retrouve à utiliser une fonction sans le "self" entre les "()"
    Là j'entre dans un domaine qui m'est inconnu

    Est-ce viable ?
    Pour que ce soit viable, il faudrait que vous compreniez ce que vous faites et pour çà, passer du temps à travaillez avec un tuto. est indispensable mais "apprendre à programmer" est visiblement une musique qui vous passe par dessus la tête.
    Si vous leviez un peu la tête de votre guidon, vous écririez une chose équivalente:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    >>> class A:
    ...    def f(self):
    ...        self.g()
    ...
    Dans ce cas, si la méthode "g" pas définie dans A, c'est que vous laissez le boulot à la classe qui en héritera:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    >>> class B(A):
    ...     def g(self):
    ...        print('g')
    ...
    >>> B().f()
    g
    Et vous pourriez même faire de g une méthode "abstraite" de A histoire qu'on oublie pas:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    >>> class A:
    ...    def f(self):
    ...        self.g()
    ...    def g(self):
    ...        raise NotImplementedError
    ...
    >>> A().f()
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "<stdin>", line 3, in f
      File "<stdin>", line 5, in g
    NotImplementedError
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

Discussions similaires

  1. ArrayList<Class> class class.setString()
    Par Onelove dans le forum Collection et Stream
    Réponses: 2
    Dernier message: 31/08/2014, 19h42
  2. Créer une classe Activity sans l'afficher
    Par Nicopilami dans le forum Android
    Réponses: 6
    Dernier message: 06/12/2013, 21h43
  3. Exécutable sans besoin de ses classes
    Par Triste dans le forum Débuter
    Réponses: 4
    Dernier message: 25/10/2007, 11h52
  4. Agir sur un bouton sans clic
    Par barbiche dans le forum Interfaces Graphiques en Java
    Réponses: 4
    Dernier message: 04/04/2007, 11h32
  5. Réponses: 14
    Dernier message: 17/11/2006, 19h17

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