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

GUI Python Discussion :

TKinter : scinder son programme en modules


Sujet :

GUI Python

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 125
    Points : 45
    Points
    45
    Par défaut TKinter : scinder son programme en modules
    Bonjour,

    J'essaie de réaliser une interface graphique avec TKinter. Cette interface devant afficher un certain nombre d'infos sur un petit écran, j'ai choisi d'organiser tout ça sous forme d'onglets ce qui ne pose pas de problème en soit.
    Sauf qu'inévitablement, le programme de cette interface graphique va rapidement grossir et devenir illisible. En conséquence je cherche donc à organiser mon programme en modules.
    Un module pour le programme principal de l'UI (main_UI.py) qui se charge de créer la fenêtre et le widget notebook.
    Un module par onglet (onglet1_UI.py, onglet2_UI.py et onglet3_UI.py) qui crée les widgets dans l'onglet et contient les fonctions associées.

    L'appel des modules fonctionne bien et l'affichage se fait comme il faut.

    Le problème : je ne sais pas comment executer les fonctions associées aux widgets.

    Exemple, dans l'onglet3 je crée un widget text nommé log et des fonctions nommées clrlog() pour effacer log, tstlogtx() et tstlogrx() pour écrire dans log... sauf qu'elles ne peuvent fonctionner pusqu'elle ne reconnaisse pas log qui est créé dans la fonction datalog()


    main_UI.py :
    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
    #! /usr/bin/python3
    #  -*- coding: utf-8 -*-
     
    # importer Tkinter
    from tkinter import *
    from tkinter import ttk
     
     
    # importer le contenu des onglets
    import onglet1_UI
    import onglet2_UI
    import onglet3_UI
     
     
    # Creation de la fiche
    form = Tk()
    form.title("exemple_TKinter_modules")
    form.geometry('800x480')
     
     
    # organisation en onglets
    tabs = ttk.Notebook(form)
    # Tab1
    tab1 = ttk.Frame(tabs)
    tabs.add(tab1, text='    [Onglet 1]    ')
    # Tab2
    tab2 = ttk.Frame(tabs)
    tabs.add(tab2, text='    [Onglet 2]    ')
    # Tab3
    tab3 = ttk.Frame(tabs)
    tabs.add(tab3, text='    [Onglet 3]    ')
     
    tabs.pack(expand=1, fill="both")
     
    # -------------------------------- WIDGETS ONGLET 1 --------------------------------
    onglet1_UI.plan(tab1)
     
    # -------------------------------- WIDGETS ONGLET 2 --------------------------------
    onglet2_UI.conso(tab2)
     
    # -------------------------------- WIDGETS ONGLET 3 --------------------------------
    onglet3_UI.datalog(tab3)
     
     
    # On démarre la boucle Tkinter qui s'interompt quand on ferme la fenêtre
    form.mainloop()
    onglet3_UI.py :
    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
    #! /usr/bin/python3
    #  -*- coding: utf-8 -*-
     
    from tkinter import *
     
     
    def datalog(tabnumber):
        log = Text(tabnumber, width=30, height=10, bg='black', fg='limegreen')
        log.pack(side=LEFT, fill='y')  # log.pack(anchor='w', fill='y', expand=True)
     
        # bouton qui efface le journal
        btnclrlog = Button(tabnumber, text="Effacer", command=clrlog)
        btnclrlog.pack(side=LEFT, anchor='n', padx=10, pady=10)
     
        # boutons provisoirs destinés à simuler l'émission/reception de données dans le log
        btntestrx = Button(tabnumber, text="sim_rx", command=tstlogrx)
        btntestrx.pack(side=LEFT, anchor='n', padx=10, pady=10)
        btntesttx = Button(tabnumber, text="sim_tx", command=tstlogtx)
        btntesttx.pack(side=LEFT, anchor='n', padx=10, pady=10)
     
     
    def clrlog():
        log.delete('1.0', END)
     
     
    def tstlogrx():
        log.insert(END, "Test Reception\n")
     
     
    def tstlogtx():
        log.insert(END, "Test Emission\n")
    Et si je test ça j'aurais une erreur de type :
    NameError: name 'log' is not defined
    Je ne sais pas vraiment comment procéder pour rectifier ça.
    Quelqu'un pour m'expliquer ?

    Merci.

  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,

    Citation Envoyé par fred7 Voir le message
    Je ne sais pas vraiment comment procéder pour rectifier ça.
    Essayez de fabriquer un programme d'exemple ou vous incluez le code de onglet3_UI.py dans main_UI.py, vous devriez constater le même soucis.

    Le problème n'a rien à voir avec tkinter ou le découpage en module mais avec la portée des variables et pour çà, ouvrez votre tuto préféré au chapitre qui parle des fonctions...

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

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 125
    Points : 45
    Points
    45
    Par défaut
    Bonjour et merci de vous intéresser à mon problème.

    Quand tout est dans le même fichier ça fonctionne.
    Forcément puisque la fonction datalog() n'existe pas.

    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
    #! /usr/bin/python3
    #  -*- coding: utf-8 -*-
     
    # importer Tkinter
    from tkinter import *
    from tkinter import ttk
     
     
    # importer le contenu des onglets
    import onglet1_UI
    import onglet2_UI
    import onglet3_UI
     
     
    def clrlog():
        log.delete('1.0', END)
     
     
    def tstlogrx():
        log.insert(END, "Test Reception\n")
     
     
    def tstlogtx():
        log.insert(END, "Test Emission\n")
     
     
    # Creation de la fiche
    form = Tk()
    form.title("exemple_TKinter_modules")
    form.geometry('800x480')
     
     
    # organisation en onglets
    tabs = ttk.Notebook(form)
    # Tab1
    tab1 = ttk.Frame(tabs)
    tabs.add(tab1, text='    [Onglet 1]    ')
    # Tab2
    tab2 = ttk.Frame(tabs)
    tabs.add(tab2, text='    [Onglet 2]    ')
    # Tab3
    tab3 = ttk.Frame(tabs)
    tabs.add(tab3, text='    [Onglet 3]    ')
     
    #tabs.select(tab2) # A RETIRER (focus sur onglet 2)
    tabs.pack(expand=1, fill="both")
     
    # -------------------------------- WIDGETS ONGLET 1 --------------------------------
    onglet1_UI.plan(tab1)
     
    # -------------------------------- WIDGETS ONGLET 2 --------------------------------
    onglet2_UI.conso(tab2)
     
    # -------------------------------- WIDGETS ONGLET 3 --------------------------------
     
    log = Text(tab3, width=30, height=10, bg='black', fg='limegreen')
    log.pack(side=LEFT, fill='y')  # log.pack(anchor='w', fill='y', expand=True)
     
    # bouton qui efface le journal
    btnclrlog = Button(tab3, text="Effacer", command=clrlog)
    btnclrlog.pack(side=LEFT, anchor='n', padx=10, pady=10)
     
    # boutons provisoirs destinés à simuler l'émission/reception de données dans le log
    btntestrx = Button(tab3, text="sim_rx", command=tstlogrx)
    btntestrx.pack(side=LEFT, anchor='n', padx=10, pady=10)
    btntesttx = Button(tab3, text="sim_tx", command=tstlogtx)
    btntesttx.pack(side=LEFT, anchor='n', padx=10, pady=10)
     
     
    # On démarre la boucle Tkinter qui s'interompt quand on ferme la fenêtre
    form.mainloop()

    Mais pour créer déplacer le morceau de programme voulu dans un module, je suis bien obligé de le mettre dans une fonction (a moins que non ? mais c'est comme ça que m'apprenne les tutos)... Et donc je me retrouve coincé.
    Et franchement j'ai beau revoir "mon tuto préféré" sur la création de fonctions et de module, j'ai pas plus d'infos qui me permettrait de me débrouiller.

  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 fred7 Voir le message
    Mais pour créer déplacer le morceau de programme voulu dans un module, je suis bien obligé de le mettre dans une fonction (a moins que non ? mais c'est comme ça que m'apprenne les tutos)...
    Si une fonction doit accéder à une variable crée par une autre fonction, elle devra être globale. Et si votre tuto. ne vous parle pas de portée des variables dans le chapitre fonction, trouvez un meilleur tuto.

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

Discussions similaires

  1. [Executable]Comment lancer son programme sans fenêtre DOS
    Par the_ugly dans le forum Général Java
    Réponses: 11
    Dernier message: 09/11/2005, 07h16
  2. Programmation par module : applications multilingues
    Par argoet dans le forum Langages de programmation
    Réponses: 13
    Dernier message: 03/02/2004, 11h28
  3. [DiVERS] -> Arrêter et redemarrer son programme ?
    Par MaTHieU_ dans le forum C++Builder
    Réponses: 5
    Dernier message: 20/08/2003, 15h25
  4. Mettre son programme dans Envoyer Vers ?
    Par MaTHieU_ dans le forum C++Builder
    Réponses: 11
    Dernier message: 29/07/2003, 19h09
  5. Réponses: 13
    Dernier message: 11/05/2003, 13h25

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