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 :

heriter d'un bouton tkinter


Sujet :

Tkinter Python

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 11
    Points : 7
    Points
    7
    Par défaut heriter d'un bouton tkinter
    Bonjour a tous,

    pour un interface graphique, j'ai besoin d'un bouton qui sera utilisé a plusieurs reprises.
    je pensait donc créer une classe qui herite / qui EST un bouton et placer dans le constructeur
    les points qui ne changent pas mais je n'y arrive pas.


    FICHIER : bouton.py

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    from tkinter import*
     
    class bp(Button):
        def __init__(self,affichage):
            super().__init__()
            appartien.text = affichage
            appartien.width = 50
            appartien.height = 2
            appartien.borderwidth = 5
            appartien.foreground = 'white'
            appartien.background = 'blue'
            appartien.font = ('Times', '16', 'bold')
    mais pour l'instancier je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    import bouton
    self.root = Tk()
    self.bp_manuel = bouton.bp(self.root, 'Mode Manuel')
    J'ai un soucis avec le passage de self.root
    il faut indiquer en premier parametre l'objet a qui appartiens le wodget ?

    merci pour votre aide

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

    Si vous avez une class A:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    class A:
         def __init__(self, a, b):
               self.a = a
               self.b = b
    puis que vous voulez fabriquer un B qui hérite de ce "A" mais qui va recevoir un seul argument à l'initialisation pour forcer le 2nd à la valeur 2 on va écrire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    class B(A):
         def __init__(self, a):
               super().__init__(a, 2)
    Pour le reste, ouvrez votre tuto. préféré sur les "class" avec Python pour y apprendre ce que sont "self", "super",... et apprenez à les utiliser avec des class à vous avant de vouloir spécialiser de vraies "class".

    note: les "class" ne sont pas indispensables à ce que vous voulez faire, une fonction suffirait lagement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    def my_button(master=None):
          return Button(master, ....)

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

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 11
    Points : 7
    Points
    7
    Par défaut
    Merci pour votre reponse mais cela ne resoud pas la question posée

    je sais ce que representent self et super
    c'est la meme chose qu'en C# et JAVA
    self = this -> l'instance courante
    super = la classe immediatement au dessus, la classe mere.

    la confusion viens certainement du fait que le code posté est hyper simplifié, j'ai a tord retiré tout ce qui me semblait inutile
    pour la question posée.

    je reprend donc :


    le projet est le suivant :

    un raspberry-pi 3 sur lequel j'ai monté l'afficheur 7 pouces tactile officiel de la fondation PI
    celui-ci, j'ajoute une carte electronique que j'ai developpée specialement pour le present projet
    elle va traiter des données en provenance d'un bus CAN (plus précisement d'un bus CAN-OPEN)
    pour cela j'ai utilisé un microcontroleur PIC24H 16bits dans lequele je fait tourner une stack can-open
    cadencée par un OS Temps-réél pré-emptif
    (j'ai besoin de taches temps réél, le bus can n'etant pas temps reel par essence)

    le code dans le microcontroleur est ecrit en C
    le code dans le raspberry pi est ecrit en python

    les deux entités communiquent entre elles par l'intermediaire d'une uart,
    j'ai remappé celle du pi presente sur les gpio qui est par defaut affectée a une console de debug.


    le microcontroleur va faire le temps reel, ce que linux est incapable de realiser
    linux fera la parte graphique, ce qu'il sait tres bien faire.

    conçernant la partie graphique en PYTHON donc qui est le sujet qui m'amene :
    il y aura plusieurs pages
    chaque page est un ecran
    chaque ecran est une classe Heritée d'une Frame de TKinter

    il y a donc plusieurs Frames qui seront projetées vers l'affichage au moment opportun.
    --page d'acceuil, page de reglage, page de visu etc ....

    je veux une 'charte graphique' cohérente
    pour cela l'orienté objet est ideal
    tous les boutons des pages auront le meme aspect, pour cela, au lieu d'en instancier un lorsque j'en ai besoin
    et d'en regler les propriétes A CHAQUE FOIS
    je declare une classe qui EST un boutton de TKINTER,
    dans le constructeur de cette classe je place le reglage des proriétés a ma convenance
    ainsi,
    a chaque instanciation j'aurai un bouton qui ressemble a son voisin.

    voici la classe bp héritée du bouton de TKINTER que j'ai placée dans un fichier nommé bouton.py
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    from tkinter import*
     
    class bp(Button):
        def __init__(self,racine,affichage):
            super().__init__(racine)
            racine.text = affichage
            racine.width = 50
            racine.height = 2
            racine.borderwidth = 5
            racine.foreground = 'white'
            racine.background = 'blue'
            racine.font = ('Times', '16', 'bold')

    voici maintenant une page dans laquelle est instancié un bouton de la classe ci-dessus

    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
     
    #!/usr/bin/env python3
     
    #fichiers python
    from tkinter import*
    import os
     
    #fichiers du projet
    import bouton
    import page_manuel
    import page_automatique
     
    class page_acceuil(Frame):
    le constructeur
        def __init__(self):
            self.root = Tk()
     
            self.bp_manuel = bouton.bp(self.root,'Mode Manuel')

    lors de l'instanciation du bouton bp le premier parametre fait passer l'élement racine
    necessaire a tout widget TKINTER pour lui signifier a qui il appartiens
    il correspond au 2nd parametre du constructeur de bp --> racine

    je sais que je trompe quelquepart avec le passage, ou l'utilisation de racine
    mais je ne sais pas ou est mon erreur ?

    evidement que je peut faire autrement mais je veux comprendre,
    c'est plus important que de 'reussir a faire marcher'.

    merci par avance a celui qui pourra m'eclairer

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

    Citation Envoyé par fab_lab Voir le message
    Merci pour votre reponse mais cela ne resoud pas la question posée
    Quand vous écrivez:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    class bp(Button):
        def __init__(self,racine,affichage):
            super().__init__(racine)
            racine.text = affichage
            ...
    vous ignorez que "self" est votre instance de Button, que "text" n'est pas un attribut de "racine" (ni de Button) donc çà ne peut pas fonctionner.
    Et si vous écrivez du code sans trop comprendre ce qu'il fait, vous vous posez de mauvaises questions sur le pourquoi il ne fait pas ce que vous vouliez auxquelles la seule réponse sera "commencez par ouvrir un tuto" (qui est un pré-requis avant de "poster") d'autant que vous pourriez faire cela avec une simple fonction (comme indiqué dans ma réponse précédente).

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

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 11
    Points : 7
    Points
    7
    Par défaut
    en general j'évite les tuto,
    je trouve que le livre de vincent le goff est super

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    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 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Citation Envoyé par fab_lab Voir le message
    en general j'évite les tuto,
    je trouve que le livre de vincent le goff est super
    Dans votre vie, seule votre langue maternelle a été apprise sans stratégie d'apprentissage. Tous les autres savoirs que vous avez acquis ont une stratégie (par où commencer, comment améliorer,...) qui vous aura été imposée ou que vous aurez découverte par vous même (et qui sera plus adaptée, moins ennuyeuse,... parce qu'elle tient compte de ce que vous savez déjà).
    Donc inutile d'envisager de faire de la POO avec Python sans avoir appris les bases (écrire un code que vous comprenez et le cas échéant poster un code qui montre que vous avez un peu potassé le sujet à défaut d'en avoir compris tous les détails).
    Et si vous savez déjà programmer, le chapitre sur les "class" du tuto. qui vient avec la documentation Python sera certainement plus adapté (d'autant qu'il a été traduit en français).
    Ceci dit avec tkinter (contrairement à d'autre GUI), vous avez aussi la chance de ne pas avoir trop besoin de créer vos propres classes. Ce qui est intéressant car vous pouvez réaliser un brouillon fonctionnel de votre application et regrouper certaines fonctionnalités en "class" (si cela fait sens) un peu plus tard. Dit autrement vous pouvez quand même avancer en séparant la difficulté d'apprendre à programmer avec un GUI de celle de l'apprentissage de la POO avec Python.

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

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 11
    Points : 7
    Points
    7
    Par défaut
    je fais de la poo depuis plusieurs années mon tres cher ami cher ami
    d'ailleurs vous avez raté le probleme
    je vous rappele que nous sommes sur un forum de discution, vos problesm d'EGO ne nous interesse pas
    le but est partager des solutions pour COMPRENDRE.

    le soucis ne venait pas du passage du pointeur d'instance mais tout betement de l'accés au parametres du bouton

    je pose la solution si cela peut AIDER quelqu'un


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    from tkinter import*
     
    class bp(Button):
        def __init__(self,racine,affichage):
            super().__init__(racine)
            self['text'] = affichage
            self['width'] = 17
            self['height'] = 6
            self['borderwidth'] = 0
            self['foreground'] = 'white'
            self['background']= 'blue'
            self['font'] = ('Times', '18', 'bold')

  8. #8
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    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 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Citation Envoyé par fab_lab Voir le message
    le soucis ne venait pas du passage du pointeur d'instance mais tout betement de l'accés au parametres du bouton
    Relisez ce que j'ai écrit:
    vous ignorez que "self" est votre instance de Button, que "text" n'est pas un attribut de "racine" (ni de Button) donc çà ne peut pas fonctionner.
    Votre nouveau jet tient compte de cela (même si vous ne l'avez ni lu ou compris) et donc fonctionne.

    Maintenant, çà serait bien plus simple d'écrire cela ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    import tkinter as tk
     
    class Button(tk.Button):
        def __init__(self, master=None, text=''):
            super().__init__(master, text=text, width=17, height=6)
    et vous y retrouvez aisément la construction suggérée dans mon premier post (avec des class A et B).
    Mais il aurait été aussi simple d'écrire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    def create_button(master=None, text=''):
        return tk.Button(master, text=text, width=17, height=6)
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

Discussions similaires

  1. [Python 3.X] Ecriture en début de fichier commandée par un bouton tkinter
    Par bineuf dans le forum Général Python
    Réponses: 3
    Dernier message: 29/06/2017, 16h28
  2. Couleur boutons tkinter
    Par StabiloHB dans le forum Tkinter
    Réponses: 1
    Dernier message: 22/07/2016, 11h05
  3. matplotlib masquer courbe avec bouton tkInter
    Par RyzenOC dans le forum Bibliothèques tierces
    Réponses: 3
    Dernier message: 09/04/2015, 09h04
  4. Boutons Tkinter et mouseover ?
    Par SkylL3r dans le forum Tkinter
    Réponses: 3
    Dernier message: 13/04/2013, 07h29

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