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 :

Script Tkinter pour créer un cercle et l'effacer à volonté


Sujet :

Tkinter Python

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes de Haute Provence (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Avril 2011
    Messages : 58
    Points : 39
    Points
    39
    Par défaut Script Tkinter pour créer un cercle et l'effacer à volonté
    Bonsoir,

    J'essaie de faire un script qui fait apparaître ou disparaître un cercle en appuyant sur un bouton "Interrupteur" - mais ceci en m'imposant d'utiliser 2 classes dont une ne fait que créer ou effacer ce cercle.

    Malgré de multiples tentatives, je n'arrive pas à effacer le cercle après l'avoir créé.

    Pourriez-vous me dire où se situe mon erreur.

    En vous remerciant.



    Voici le script:


    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
    from tkinter import *
     
    class Application(Frame):
     
        def __init__(self):
     
            #création d'une variable booléenne
            self.bool = 0
     
            # création de l'encart contenant le bouton
            Frame.__init__(self)
            self.pack(side=BOTTOM)
     
            # création du canevas
            self.can = Canvas(fen, width=400, height=400, bg='white')
            self.can.pack()
     
            # création d'un bouton
            Button(self, text='Interrupteur', command=self.interrupteur).pack(side=LEFT)
     
            # création d'un objet Cercle
            self.crcl = Cercle()
     
     
        def interrupteur(self):
            self.crcl.interrupt(self.can, self.bool)
            if self.bool:
                self.bool=0
            else:
                self.bool=1
     
     
    class Cercle(object):
     
        def __init__(self):
            self.boul = 0
     
     
        def interrupt(self, cnv, boul):
            if boul:
                cnv.delete(self)
            else:
                cnv.create_oval(100, 100, 150, 150)
     
     
        # ---------------- Programme principal ------------------------
     
    fen = Tk()
    Application().mainloop()
    Désolé mais je ne sais pas comment indenter le script

  2. #2
    Expert éminent

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

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

    Merci de penser aux balises codes, pour la lecture et les copier coller.

    Pour ton cercle, Ta classe Cercle(), du moins son instance, N'est PAS le cercle, mais son créateur-destructeur, il faut donc conserver une référence de ce cercle.

    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
     
    # -* coding: utf-8-*-
     
    from Tkinter import *
     
    class Application(Frame):
     
        def __init__(self):
     
            #création d'une variable booléenne
            self.bool = 0
     
            # création de l'encart contenant le bouton
            Frame.__init__(self)
            self.pack(side=BOTTOM)
     
            # création du canevas
            self.can = Canvas(fen, width=400, height=400, bg='white')
            self.can.pack()
     
            # création d'un bouton
            Button(self, text='Interrupteur', command=self.interrupteur).pack(side=LEFT)
     
            # création d'un objet Cercle
            self.crcl = Cercle(self)
     
     
        def interrupteur(self):
            self.crcl.interrupt(self.bool)
            self.bool = not self.bool
            #if self.bool:
                #self.bool=0
            #else:
                #self.bool=1
     
     
    class Cercle(object):
     
        def __init__(self, main):
            self.main = main
            #self.boul = 0
     
     
        def interrupt(self, b):
            if b:
                self.main.can.delete(self.crc)
            else:
                self.crc = self.main.can.create_oval(100, 100, 150, 150)
     
     
    # ---------------- Programme principal ------------------------
     
    fen = Tk()
    Application().mainloop()

    Regarde les simplifications aussi.

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes de Haute Provence (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Avril 2011
    Messages : 58
    Points : 39
    Points
    39
    Par défaut Re:
    Merci beaucoup pour ta réponse, ça marche super bien.

    Cependant, je ne suis pas sûr d'avoir tout compris de ce que tu as fais, et j'aurais quelques questions:

    1) Le "self" du constructeur de "Application" (ligne 8) est-il bien un Frame puisqu'il est construit à partir de la classe parent "Frame" (ligne 6)?

    2) Le "self.can" (ligne 18) est -il créé dans le Frame ci-dessus?
    2-bis) Si oui, en effaçant ce "Frame" je vais effacer mon canevas créé dedans?

    3) "L'instance du cercle" est-elle stockée dans self.main (ligne 40) ou bien est-ce que c'est le Frame de la class Application qui est stockée dans "self.main"?

    4) le "self" de la "class Cercle" (ligne 39) contient quel objet?

    5) Encore une question, comment on met des "balises codes" en copiant le script?

    Je suis désolé pour toutes ces questions qui te sembleront sûrement simplistes mais je suis un débutant et je galère beaucoup pour comprendre comment marche Python.

    Encore merci pour ton aide VinsS et bonne soirée à toi.

  4. #4
    Expert éminent

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 302
    Points : 6 782
    Points
    6 782
    Par défaut
    1) Le self de Application désigne l'instance de Application que tu crées à la dernière ligne de ton script.

    2) self.can signifie que can est un attribut de Application

    2bis) Je ne vois pas comment tu peux effacer la Frame, mais essayes, tu verras.

    3) + 4) self.crcl est aussi un attribut de Application, tu peux utiliser des print pour ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    class Cercle(object):
     
        def __init__(self, main):
            self.main = main
            print "Cercle self:", self
            print "Cercle main:", main
    Cercle self: <__main__.Cercle object at 0x94f382c>
    Cercle main: .3077359948L
    Le résultat de main est dût à des bisarreries de Tkinter

    5) On met les balises code ... en cliquant sur l'icône 'Balises code'.

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes de Haute Provence (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Avril 2011
    Messages : 58
    Points : 39
    Points
    39
    Par défaut
    Bonjour Vincent,

    Je te remercie pour l'aide ainsi que toutes les réponses que tu m'as apportées.

    C'est rassurant de savoir qu'on peut compter sur des personnes qui n'hésitent pas à aider même les débutants.

    Encore mille mercis pour le temps que tu as pris à répondre à mes questions et à mes problèmes.

    Amicalement.

    Eric

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

Discussions similaires

  1. Script sécurisé pour créer une banque en ligne ?
    Par cheboy dans le forum Langages de programmation
    Réponses: 2
    Dernier message: 28/04/2015, 17h44
  2. script linux pour créer une table sur Oracle
    Par ledawa dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 19/08/2008, 11h29
  3. Réponses: 2
    Dernier message: 04/08/2008, 16h33
  4. Script pour créer un fond d'écran en toute simplicité
    Par Olivier Regnier dans le forum Linux
    Réponses: 5
    Dernier message: 30/11/2006, 11h45
  5. Réponses: 3
    Dernier message: 17/08/2006, 11h30

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