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 :

Problème avec le focus sur une listbox [Python 3.X]


Sujet :

Tkinter Python

  1. #1
    Membre du Club
    Homme Profil pro
    Retraité
    Inscrit en
    Septembre 2013
    Messages
    91
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2013
    Messages : 91
    Points : 52
    Points
    52
    Par défaut Problème avec le focus sur une listbox
    Bonjour à tous,
    J'essaye de créer une listbox que je veux parcourir dès que l'interface graphique est ouvert.
    Ce que j'ai écrit fonctionne bien quand j'amène le curseur de la souris dans la listbox et clique gauche sur une ligne:
    je récupère le contenu de la ligne sélectionnée et je lance un sous-programme avec ce contenu en paramètre.
    Je souhaiterai avoir la main avec les flèches "monter" et "descendre" directement quand j'entre sur la listebox mais sans cliquer sur une ligne.
    J'ai essayé avec la ligne self.L.bind('<Enter>',self.__call__), mais ça ne fonctionne pas (problème d'arguments manquants ou en trop)
    où est l'erreur
    Voici mon programme:

    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
    import tkinter as tk
    class TestAfter(tk.Tk):
        def __init__(self,parent=None):
            tk.Tk.__init__(self,parent)
            self.parent=parent
            self.F1=tk.Frame(self)
            self.s=tk.Scrollbar(self.F1)
            self.L=tk.Listbox(self.F1)
            #self.L.bind('<Enter>',self.__call__)
            #self.L.bind('<Leave>',self.ArretAfter)
            self.s.pack(side=tk.RIGHT,fill=tk.Y)
            self.L.pack(side=tk.LEFT,fill=tk.Y)
            self.L['yscrollcommand']=self.s.set
            self.s['command']=self.L.yview
            for i in range(30):
                self.L.insert(tk.END,str(i))
            self.F1.pack(side=tk.TOP)
            self.L.selection_set(0)
            #self.L.focus_force()
     
            self.F2=tk.Frame()
            self.lab=tk.Label(self.F2)
            self.lab.pack()
            self.F2.pack(side=tk.TOP)
            self.sel=()
        def __call__(self):
            self.p=self.lab.after(200,self.__call__)
            if self.L.curselection()!=self.sel:
                self.sel=self.L.curselection()
                self.lab.config(text=str(self.sel[0]))
                self.LancerProgramme(self.sel)
        #def ArretAfter(self):
        #    self.lab.after_cancel(self.p)
        def LancerProgramme(sel,x):
            print("Programme lancé avec",x)
     
     
    if __name__=="__main__":
        test=TestAfter(None)
        test.title("Test after dans une classe")
        test()
        test.mainloop()

  2. #2
    Membre du Club
    Homme Profil pro
    Retraité
    Inscrit en
    Septembre 2013
    Messages
    91
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2013
    Messages : 91
    Points : 52
    Points
    52
    Par défaut
    J'ai en partie résolu mon problème en utilisant la fonction lambda
    Voici mon nouveau programme:
    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
    import tkinter as tk
    class TestAfter(tk.Tk):
        def __init__(self,parent=None):
            tk.Tk.__init__(self,parent)
            self.parent=parent
            self.F1=tk.Frame(self)
            self.s=tk.Scrollbar(self.F1)
            self.L=tk.Listbox(self.F1)
            self.L.bind('<Enter>',lambda evt: self.__call__())
            self.L.bind('<Leave>',lambda evt: self.ArretAfter())
            self.s.pack(side=tk.RIGHT,fill=tk.Y)
            self.L.pack(side=tk.LEFT,fill=tk.Y)
            self.L['yscrollcommand']=self.s.set
            self.s['command']=self.L.yview
            for i in range(30):
                self.L.insert(tk.END,str(i))
            self.F1.pack(side=tk.TOP)
            self.L.selection_set(0)
            #self.L.focus_force()
     
            self.F2=tk.Frame()
            self.lab=tk.Label(self.F2)
            self.lab.pack()
            self.F2.pack(side=tk.TOP)
            self.sel=()
        def __call__(self):
            self.p=self.lab.after(200,self.__call__)
            if self.L.curselection()!=self.sel:
                self.sel=self.L.curselection()
                self.lab.config(text=str(self.sel[0]))
                self.LancerProgramme(self.sel)
        def ArretAfter(self):
            self.lab.after_cancel(self.p)
        def LancerProgramme(self,x):
            print("Programme lancé avec",x)
     
     
    if __name__=="__main__":
        test=TestAfter(None)
        test.title("Test after dans une classe")
        #test()
        test.mainloop()
    Mais quand je rentre sur la listbox, je suis toujours obligé de cliquer sur la ligne déjà sélectionnée pour parcourir la liste,
    et quand je sors les touches "Monter" et "Baisser" sont toujours actives (mais sans sélection)
    Quelqu'un pour m'aider?

    En fait je viens de résoudre entièrement mon problème en modifiant l'attribut "state" de la listbox et en utilisant sa fonction "focus_force"
    Voici mon programme définitif:
    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
    import tkinter as tk
    class TestAfter(tk.Tk):
        def __init__(self,parent=None):
            tk.Tk.__init__(self,parent)
     
            self.sel=()
     
            self.F1=tk.Frame(self)
            self.s=tk.Scrollbar(self.F1)
            self.L=tk.Listbox(self.F1)
            for i in range(30):
                self.L.insert(tk.END,str(i))
     
            self.L.bind('<Enter>',lambda evt: self.__call__())
            self.L.bind('<Leave>',lambda evt: self.ArretAfter())
     
            self.F1.pack(side=tk.TOP)      
            self.s.pack(side=tk.RIGHT,fill=tk.Y)
            self.L.pack(side=tk.LEFT,fill=tk.Y)
     
            self.L['yscrollcommand']=self.s.set
            self.s['command']=self.L.yview
     
            self.L.selection_set(0)
     
            self.F2=tk.Frame()
            self.lab=tk.Label(self.F2)
     
            self.F2.pack(side=tk.TOP)
            self.lab.pack()
     
        def __call__(self):
            self.L.focus_force()
            self.L.configure(state='normal')
            self.p=self.lab.after(200,self.__call__)
            if self.L.curselection()!=self.sel:
                self.sel=self.L.curselection()
                self.lab.config(text=str(self.sel[0]))
                self.LancerProgramme(self.sel)
     
        def ArretAfter(self):
            self.L.configure(state='disabled')
            self.lab.after_cancel(self.p)
     
        def LancerProgramme(sel,x):
            print("Programme lancé avec",x)
     
    if __name__=="__main__":
        test=TestAfter(None)
        test.title("Test after dans une classe")
        test.mainloop()

  3. #3
    Membre expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 873
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 873
    Points : 3 717
    Points
    3 717
    Par défaut
    Salut,

    Je ne connais pas bien tkinter mais par analogie avec ce que l'on a ailleurs, je dirais qu'il faudrait ajouter un focus (sélectionner la listbox), il doit y avoir ça, non ?

  4. #4
    Membre expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 873
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 873
    Points : 3 717
    Points
    3 717
    Par défaut
    Citation Envoyé par Cemalatowilo Voir le message
    J'essaye de créer une listbox que je veux parcourir dès que l'interface graphique est ouvert.
    Ce que j'ai écrit fonctionne bien quand j'amène le curseur de la souris dans la listbox et clique gauche sur une ligne:
    je récupère le contenu de la ligne sélectionnée et je lance un sous-programme avec ce contenu en paramètre.
    Je souhaiterai avoir la main avec les flèches "monter" et "descendre" directement quand j'entre sur la listebox mais sans cliquer sur une ligne.
    Je viens de regarder et tester, il y a bien une fonction focus, tu peux ajouter cette ligne à ton premier code : self.L.focus()

  5. #5
    Membre du Club
    Homme Profil pro
    Retraité
    Inscrit en
    Septembre 2013
    Messages
    91
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2013
    Messages : 91
    Points : 52
    Points
    52
    Par défaut
    Citation Envoyé par Beginner. Voir le message
    Je viens de regarder et tester, il y a bien une fonction focus, tu peux ajouter cette ligne à ton premier code : self.L.focus()
    OK, merci
    j'ai résolu mon problème en utilisant self.L.focus_force().
    Je viens de poster le programme qui fonctionne comme je le désire.

  6. #6
    Membre expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 873
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 873
    Points : 3 717
    Points
    3 717
    Par défaut
    Pourquoi ça ne marche pas avec self.L.focus() ?


    EDIT : Ah oui j'ai vu que focus_force() est plus souvent mentionné...

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

Discussions similaires

  1. [AC-2002] Problème avec un Insert sur une BDD oracle
    Par imaril dans le forum VBA Access
    Réponses: 0
    Dernier message: 07/09/2011, 11h35
  2. Réponses: 1
    Dernier message: 04/02/2010, 20h57
  3. Réponses: 9
    Dernier message: 09/12/2008, 00h07
  4. Problème avec le RowSource d'une ListBox
    Par niavlys26 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 08/07/2008, 04h29
  5. Problème avec les indexes sur une base de données.
    Par osoudee dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 09/02/2006, 09h24

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