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 :

Affichage d'un bouton avec héritage de canvas [Python 3.X]


Sujet :

Tkinter Python

  1. #1
    Membre du Club
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Mai 2018
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2018
    Messages : 47
    Points : 40
    Points
    40
    Par défaut Affichage d'un bouton avec héritage de canvas
    Bonjour,

    Je rencontre encore des difficultés avec Tk inter.

    Je n'arrive pas à faire afficher mon cadre et un bouton. En mettant button_start.pack(), j'ai le bouton mais plus le cadre.

    Sur le tuto de Swinnen, cela ne semble pas poser problème mais je ne vois pas ce qui me manque

    Des suggestions ?

    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
    from tkinter import * 
     
    CASE_SIZE = 20
    CASE_NUMBER = 20
     
    class Application(Canvas):   
        def __init__(self, boss=None):
            super().__init__()  
            self.terrain()    
            game_status = 0 
            button_start = Button(self, text ='Stop/Start',command =self.launch_game)
           # button_start.pack()
            self.pack()
     
        def terrain(self):
            size = CASE_NUMBER*CASE_SIZE
            self.configure(width=size, height=size, bg="black")   
     
        def launch_game(self):
            game_status = not(game_status)                        
     
    launch = Application()
    launch.mainloop()
    Merci

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

    Citation Envoyé par Kazvert Voir le message
    Des suggestions ?
    Si vous utilisez le Canvas comme une Frame, il se comportera comme une Frame et.... sa taille sera dimensionnée en fonction des widgets qu'il contient sauf à lui donner une dimension et interdire ce redimensionnement (via .pack_propagate(0)).

    - W

  3. #3
    Membre du Club
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Mai 2018
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2018
    Messages : 47
    Points : 40
    Points
    40
    Par défaut
    D'accord merci.

    J'essayais avant de mettre un bouton dans un canvas et ce n'est pas possible. J'hérite maintenant d'un frame au lieu d'un canvas et cela me permet de construire un canvas et un bouton dedans.

    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
    from tkinter import * 
     
    CASE_SIZE = 20
    CASE_NUMBER = 20
     
    class Application(Frame):   
        def __init__(self, boss =None):
            Frame.__init__(self)	
            self.terrain()   
            button_start = Button(self, text ='Stop/Start',command =self.launch_game)
            button_start.pack(side = RIGHT)
     
        def terrain(self):
            size = CASE_NUMBER*CASE_SIZE 
            self.can = Canvas(self, width=size, height=size, bg ="black")
            self.can.pack()
        def launch_game(self):
            print('hello')                    
     
    launch = Application()
    launch.pack(side = TOP)
    launch.mainloop()
    J'ai utilisé 3 pack : un pour l'objet que j'ai crée (launch.pack(side = TOP) et qui est un frame, un pour le canvas self.can.pack() contenu dans le frame et un troisième pour le bouton button_start.pack(side = RIGHT) qui est dans le frame. Pour le pack du frame, au lieu de launch.pack(side = TOP), j'aurai pu écrire self.pack() dans le init de la classe.

    - J'aurai pu aussi hériter de tk, est ce mieux que d'hériter de frame ?

    Dans Swinnen, parfois :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    class Application(Tk):
      def __init__(self):
          Tk.__init__(self)
    - Est ce préférable d'utiliser grid à la place de pack ou c'est à la convenance de chacun ?

    - super().__init__() marche si j'hérite de canvas mais plus maintenant (Frame.__init__(self)), est ce normal ?

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

    Pour mettre un widget dans un Canvas, il est préférable d'utiliser la méthode .create_window.

    - J'aurai pu aussi hériter de tk, est ce mieux que d'hériter de frame ?
    C'est surtout différent car une fenêtre n'est pas vraiment un widget.

    - Est ce préférable d'utiliser grid à la place de pack ou c'est à la convenance de chacun ?
    C'est surtout fonction de ce que vous voulez faire. "pack" permet de placer ses widgets en colonnes ou en ligne, "grid" c'est plutôt pour des grilles/tableaux. Et si vous voulez afficher plein de widgets, vous allez souvent utiliser les deux.

    super().__init__() marche si j'hérite de canvas mais plus maintenant (Frame.__init__(self)), est ce normal
    Chez moi çà fonctionne que l'on s/classe Frame ou Canvas. Postez le code en erreur pour voir.

    - W

  5. #5
    Membre du Club
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Mai 2018
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2018
    Messages : 47
    Points : 40
    Points
    40
    Par défaut
    Merci

    J'ai réessayé, cela marche. J'avais probablement une erreur.

    Je vais pouvoir finir mon jeu de la vie avec Numpy

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 24/05/2014, 13h18
  2. [WM18] Affichage d'un PDF avec des boutons associés par page
    Par fed1023 dans le forum Windev Mobile
    Réponses: 0
    Dernier message: 04/07/2013, 17h57
  3. affichage de radio bouton avec condition
    Par gamiel dans le forum Langage
    Réponses: 2
    Dernier message: 27/03/2012, 17h12
  4. Problème affichage de données avec héritage
    Par Saphir09 dans le forum Langage
    Réponses: 2
    Dernier message: 02/11/2011, 18h56

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