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 :

Attribution du focus ineffective


Sujet :

Tkinter Python

  1. #1
    Membre à l'essai
    Homme Profil pro
    Médecin
    Inscrit en
    Avril 2017
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Médecin
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2017
    Messages : 33
    Points : 22
    Points
    22
    Par défaut Attribution du focus ineffective
    Bonsoir à tous,
    Je refais mon appli de gestion de mon cabinet sous Python.
    Je crains de poser ici une question basique, mais je n'arrive pas à comprendre ce qui ne fonctionne pas dans le code.

    J'ai une fiche pour chaque personne venant consulter, et quand je passe d'un dossier à l'autre, je souhaiterais que s'affiche la première page de la boîte à onglets où figurent mes infos.
    Je mets un code ci-dessous, tiré de ce que je fais dans mon code complet. En ligne 53-55, manifestement l'instruction focus_set() est tout à fait ineffective, le focus restant sur le dernier bouton pressé. Quelle ânerie ai-je commise ? Je souhaiterais que, si je suis sur un autre onglet que le 1, et sur changement de dossier (un des quatre boutons en bas à gauche), on revienne sur l'onglet 1 après affichage du nouveau dossier.

    Merci pour votre aide, et désolé pour cette question tellement basique, mais je coince.

    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
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
     
    import tkinter as tk
    from tkinter import ttk
     
    # Base de dossiers et indice de balayage de la table (part de 0)
    # Nom, Prénom, Date de naissance, Type
    listeDossiers=[("DUCK","Donald","1934-06-09","M","Canard"),("MOUSE","Mickey","1928-11-18","M","Souris"),("GOOFY","Dingo","1932-05-25","M","Chien"),("COW","Clarabelle","1929-06-28","M","Vache"),("MOUSE","Miss Kitty","1986-07-02","F","Souris"),("DUCK","Daisy","1937-01-09","F","Canard")]
     
    def presentationDate(dateAPresenter):
        """
        Parameters
        ----------
        dateAPresenter : TYPE date en format aaaa-mm-jj
            DESCRIPTION.
     
        Returns
        -------
        la date en format jj/mm/aaaa
     
        """
        if len(dateAPresenter)==10:
            return dateAPresenter[-2:]+"/"+dateAPresenter[5:7]+"/"+dateAPresenter[0:4]    
     
    def btn_PremierDossier():
        # On met l'indice de dossier affiché au début
        idPersoCourant.set("0")
        affichagePersoCourant()
    def btn_DossierPrecedent():
        # On décrémente l'indice de dossier affiché, sauf si déjà sur premier enregistrement
        if int(idPersoCourant.get())>0:
            idPersoCourant.set(str(int(idPersoCourant.get())-1))
        affichagePersoCourant()
    def btn_btn_DossierSuivant():
        # On incrémente l'indice de dossier affiché, sauf si déjà sur dernier enregistrement
        if int(idPersoCourant.get())<len(listeDossiers)-1:
            idPersoCourant.set(str(int(idPersoCourant.get())+1))
        affichagePersoCourant()
     
    def btn_DernierDossier():
        # On met l'indice de dossier affiché à la fin   
        idPersoCourant.set(str(len(listeDossiers)-1))
        affichagePersoCourant()
     
    def affichagePersoCourant():
        # On remplit les Stringvar avec les valeurs correspondantes
        refPersoCourant=listeDossiers[int(idPersoCourant.get())] 
        NomPerso.set(refPersoCourant[0])
        PrenomPerso.set(refPersoCourant[1])
        SexePerso.set(refPersoCourant[3])
        DtNPerso.set(presentationDate(refPersoCourant[2]))
        TypePerso.set(refPersoCourant[4])
     
        # On revient au premier onglet de la boîte
        #chNomPerso.focus_set()
        Onglet1.focus_set()
     
    # Ouverture de la fenêtre de base
    FenetreBC_root = tk.Tk()
    FenetreBC_root.geometry('1280x777')
    FenetreBC_root.title('Cabinet de Phoniatrie Bruno')
     
    # Entrée de mémorisation du personnage en cours d'affichage
    idPersoCourant=tk.StringVar()
    idPersoCourant_ent=ttk.Entry(FenetreBC_root,textvariable=idPersoCourant)
    idPersoCourant_ent.place(x=0,y=0,width=0,height=0)
    idPersoCourant.set("0")
     
     
    FenetreGestion_DossiersP = ttk.Frame(FenetreBC_root)
    FenetreGestion_DossiersP.place(x = 0, y = 0, width = 1280, height = 877)
     
    # Ecriture des boutons
    # bouton Premier dossier
    btn_PremierDossier = ttk.Button(FenetreGestion_DossiersP, text="Prem", command=btn_PremierDossier)
    btn_PremierDossier.place(x = 50, y = 600, width = 50, height = 50)
    # bouton Dossier précédent
    btn_DossierPrecedent = ttk.Button(FenetreGestion_DossiersP, text="Préc", command=btn_DossierPrecedent)
    btn_DossierPrecedent.place(x = 100, y = 600, width = 50, height = 50)
    # bouton Recherche dossier
    # bouton Dossier suivant
    btn_DossierSuivant = ttk.Button(FenetreGestion_DossiersP, text="Suiv", command=btn_btn_DossierSuivant)
    btn_DossierSuivant.place(x = 250, y = 600, width = 50, height = 50)
    # bouton Dernier dossier
    btn_DernierDossier = ttk.Button(FenetreGestion_DossiersP, text="Dern", command=btn_DernierDossier)
    btn_DernierDossier.place(x = 300, y = 600, width = 50, height = 50)
     
    # bouton Quitter
    btn_Quitter = ttk.Button(FenetreGestion_DossiersP, text="Quitter", command=FenetreBC_root.destroy)
    btn_Quitter.place(x = 750, y = 600, width = 100, height = 50)
     
    # Construction Table à onglets
    OngletAffichageBase = ttk.Notebook(FenetreGestion_DossiersP)
    OngletAffichageBase.place(x = 50, y = 100, width = 800, height = 500)
    Onglet1 = ttk.Frame(OngletAffichageBase)
    Onglet1.place(x = 0, y = 0, width = 795, height = 495)
    OngletAffichageBase.add(Onglet1, text = "Etat-civil")
    Onglet2 = ttk.Frame(OngletAffichageBase)
    Onglet2.place(x = 0, y = 0, width = 795, height = 495)
    OngletAffichageBase.add(Onglet2, text = "Diagnostic et correspondants")
    Onglet3 = ttk.Frame(OngletAffichageBase)
    Onglet3.place(x = 0, y = 0, width = 795, height = 495)
    OngletAffichageBase.add(Onglet3, text = "Actes")
    Onglet4 = ttk.Frame(OngletAffichageBase)
    Onglet4.place(x = 0, y = 0, width = 795, height = 495)
    OngletAffichageBase.add(Onglet4, text = "Courriers")
    Onglet5 = ttk.Frame(OngletAffichageBase)
    Onglet5.place(x = 0, y = 0, width = 795, height = 495)
    OngletAffichageBase.add(Onglet5, text = "Photos")
     
    # Définition des StringVar
    NomPerso= tk.StringVar()
    PrenomPerso= tk.StringVar()
    SexePerso= tk.StringVar()
    TypePerso= tk.StringVar()
    DtNPerso= tk.StringVar()
     
    # Définition des widgets
    # Onglet1
    etNomPerso=ttk.Label(Onglet1,text="Nom")
    etNomPerso.place(x=30,y=60,width=80,height=22)
    etPrenomPerso=ttk.Label(Onglet1,text="Prénom")
    etPrenomPerso.place(x=380,y=60,width=60,height=22)
    chNomPerso=ttk.Entry(Onglet1,textvariable=NomPerso)
    chNomPerso.place(x=140,y=60,width=230,height=22)
    chPrenomPerso=ttk.Entry(Onglet1,textvariable=PrenomPerso)
    chPrenomPerso.place(x=450,y=60,width=200,height=22)
    etSexePerso=ttk.Label(Onglet1,text="Sexe")
    etSexePerso.place(x=660,y=60,width=40,height=22)
    chSexePerso=ttk.Entry(Onglet1,textvariable=SexePerso)
    chSexePerso.place(x=700,y=60,width=20,height=22)
    etDtNPerso=ttk.Label(Onglet1,text="Date de naissance")
    etDtNPerso.place(x=30,y=110,width=110,height=22)
    chDtNPerso=ttk.Entry(Onglet1,textvariable=DtNPerso)
    chDtNPerso.place(x=140,y=110,width=100,height=22)
    # Onglet2 - Juste pour changer d'onglet pour la démo
    etTypePerso=ttk.Label(Onglet2,text="Type de personnage")
    etTypePerso.place(x=30,y=60,width=120,height=22)
    chTypePerso=ttk.Entry(Onglet2,textvariable=TypePerso)
    chTypePerso.place(x=160,y=60,width=100,height=22)
     
    # Premier affichage de perso avant lancement de la boucle
    affichagePersoCourant()
     
    FenetreBC_root.mainloop()

  2. #2
    Nouveau membre du Club
    Femme Profil pro
    Bordeaux
    Inscrit en
    Juillet 2012
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Bordeaux
    Secteur : Bâtiment

    Informations forums :
    Inscription : Juillet 2012
    Messages : 24
    Points : 36
    Points
    36
    Par défaut
    Bonjour,
    OngletAffichageBase.select(0) fonctionne.
    Bonne journée.

  3. #3
    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 bcoulom Voir le message
    Quelle ânerie ai-je commise ? Je souhaiterais que, si je suis sur un autre onglet que le 1, et sur changement de dossier (un des quatre boutons en bas à gauche), on revienne sur l'onglet 1 après affichage du nouveau dossier.
    Le focus, définit en gros le widget qui va récupérer les entrées "clavier". Déjà il faut que le widget accepte des saisies pour qu'il prenne le focus, et une "Frame" n'est pas un de ces widgets.
    Après si la question est de forcer le Notebook a afficher un onglet particulier, c'est côté notebook qu'il faut regarder pas côté "focus" et le .select mentionné par brunop33 sera plus adapté.

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

  4. #4
    Membre à l'essai
    Homme Profil pro
    Médecin
    Inscrit en
    Avril 2017
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Médecin
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2017
    Messages : 33
    Points : 22
    Points
    22
    Par défaut
    Grand merci à tous les deux, je teste ça très vite !
    @wiztricks, j'avais testé sur l'entry NomPerso, qui en principe accepte des saisies clavier, mais ça ne marchait pas mieux.
    Ceci dit, mon objectif est bien de forcer l'affichage de la première page de l'onglet, donc ça devrait être tout bon.
    Je mets un mot quand j'ai testé.

  5. #5
    Membre à l'essai
    Homme Profil pro
    Médecin
    Inscrit en
    Avril 2017
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Médecin
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2017
    Messages : 33
    Points : 22
    Points
    22
    Par défaut Problème résolu
    Génial, un grand merci !

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

Discussions similaires

  1. Attribution valeur et focus sur un autre input
    Par TLOH45 dans le forum jQuery
    Réponses: 16
    Dernier message: 30/11/2011, 11h49
  2. balise <select> et attribut focus sous ie et sous firefox
    Par tofito dans le forum Mise en page CSS
    Réponses: 3
    Dernier message: 27/07/2009, 15h09
  3. comment changer d'attribut de fonte dans un Tlabel?
    Par sb dans le forum Composants VCL
    Réponses: 3
    Dernier message: 21/08/2002, 16h53
  4. Créer une fenêtre flottante qui ne peut avoir le focus
    Par BestofMac dans le forum Composants VCL
    Réponses: 4
    Dernier message: 17/07/2002, 10h46
  5. focus en C
    Par killpilot dans le forum C
    Réponses: 8
    Dernier message: 19/04/2002, 19h19

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