# Autres langages > Python > GUI > [Python 3.X] Comment supprimer le focus sur une listbox quand le curseur de la souris n'y est plus

## Cemalatowilo

J'ai crit une maquette d'utilisation d'une Listebox avec un Scrollbarr que j'utiliserai dans un programme de gestion de photos de fleurs.
Je choisirai la photo  visualiser via la selection effectue dans la listebox.
Je veux aller au dbut de la listbox et  la fin par les touches <Shift-Up> et <Shift-Down> que lorsque le curseur de la souris est sur la listbox.
La maquette fonctionne bien, sauf lorsque le curseur est hors de la listbox, les <Shift-Up> et <Shift-Down> tant toujours oprantes.
Voici ma maquette


```

```

J'ai essay la mthode self.L.unbind_all('<Shift-Up>,<Shift-Down>') (ligne 61) mais a ne fonctionne pas
J'ai galement essay if self.focus_get()==self.L: dans mthode AllerEnHaut(self,evt) (ligne 72), mais la listbox L a toujours le focus!

Merci de vos ides pour me dpanner

----------


## Beginner.

> J'ai galement essay if self.focus_get()==self.L: dans mthode AllerEnHaut(self,evt) (ligne 72), mais la listbox L a toujours le focus!


Ben la fonction get n'est pas cense supprimer le focus, non ???

Il faudrait savoir si il existe une fonction qui enlev le focus... 

Sinon tu peux faire perdre le focus  la listBox en le donnant  un autre windjet (par exemple la fentre principale ?)...

Mais pourquoi ne pas juste cliquer ailleurs que la listbox pour que ce dernier perde le focus ? Tu veux que cela se fasse automatiquement c'est a ?

----------


## Cemalatowilo

Ce que je recherche avant tout c'est que les touches <Shift-Up> et <Shift-Down> ne fonctionnent plus quand le curseur n'est plus sur la Listbox.
Ce n'est peut tre pas un problme de focus sur la Listbox

----------


## Cemalatowilo

Et pour rpondre correctement  ta question, il faut que se soit de manire automatique

----------


## Beginner.

> Ce que je recherche avant tout c'est que les touches <Shift-Up> et <Shift-Down> ne fonctionnent plus quand le curseur n'est plus sur la Listbox.
> Ce n'est peut tre pas un problme de focus sur la Listbox


Ben je t'ai donn une ide : "_Sinon tu peux faire perdre le focus  la listBox en le donnant  un autre windjet (par exemple la fentre principale ?)..._" (c'est dans le cas o il n'existerait pas de fonction toute faite pour cela).

Et si, quelque part c'est bien li au focus car si la listbox n'a plus le focus les touches en question n'auront plus d'effet...

Comme tu veux que cela ait lieu quand le curseur n'est plus sur la Listbox, tu peux utiliser mon ide par exemple dans ta fonction *NePlusParcourirListbox*...

Tu peux ajouter dans cette fonction ceci par exemple : self.F1.focus_force()...

----------


## Cemalatowilo

Merci,
j'ai test ton ide et a fonctionne.
Il ne me reste plus qu'un problme:
Lorsque le curseur revient dans la listbox, la dernire ligne slectionne est ebien en surbrillance,
mais elle n'est pas vritablement slectionne car les flche <Up>, <Down>, <Shift-Up> et Shift-Down> ne fonctionnent pas.
Pour que je puisse naviguer de nouveau dans listbox il faut que je clique gauche sur une ligne!

Cela doit venir du fait que je n'ai pas les ides claires sur les diffrences entre self.L.selection_set(Nligne), sel.L.activate(N ligne) et que j'ignore quelqu'autre mthode.

As tu une ide?

----------


## wiztricks

> Pour que je puisse naviguer de nouveau dans listbox il faut que je clique gauche sur une ligne!


Tant que la Listbox n'a pas le focus, les vnements ne seront pas traits par elle... Et avoir le focus, c'est un peu plus que la souris qui se balade au dessus du widget. En  c'est par dfaut sinon il faut peut tre regarder focusfollowmouse)

- W

----------


## Beginner.

> j'ai test ton ide et a fonctionne.


Ben tant mieux...





> Cela doit venir du fait que je n'ai pas les ides claires sur les diffrences entre self.L.selection_set(Nligne), sel.L.activate(N ligne) et que j'ignore quelqu'autre mthode.
> 
> As tu une ide?


Ben moi non plus je ne maitrise pas tkinter, a vrai dire je dbute mme en Python... Mais il y a une certaine logique qu'on retrouve ailleurs dans d'autres langages donc je m'en sert...

Mais oui j'ai une ide et on revient d'ailleurs au mme problme que celui de ton autre fil :




> Il ne me reste plus qu'un problme:
> Lorsque le curseur revient dans la listbox, la dernire ligne slectionne est ebien en surbrillance,
> mais elle n'est pas vritablement slectionne car les flche <Up>, <Down>, <Shift-Up> et Shift-Down> ne fonctionnent pas.
> Pour que je puisse naviguer de nouveau dans listbox il faut que je clique gauche sur une ligne!


Je disais donc mme problme ---> mme solution : il suffit d'utiliser self.L.focus_force() (ou self.L.focus()) dans ta fonction *ParcourirListbox*...

----------


## Beginner.

Ah ben je n'avais pas vu la rponse de *wiztricks*, sa rponse rpond peut-tre aussi au problme de l'autre fil : Problme avec le focus sur une listbox

----------


## Cemalatowilo

OK, merci pour vos rponses
J'ai forc le focus sur la listebox quand je rentre sur la listbox et a fonctionne.
Je pensais que le focus est automatiquement fix sue le widget o se trouve la souris!

Par contre j'ai dcouvert un autre pb:
Quand je parcours ma listbox avec le scrollbar, je perd ma ligne slectionne (qui se trouve en surbrillance)
Comment la garder en surbrillance quand j'agis sur l'ascenseur?

----------


## Beginner.

> J'ai forc le focus sur la listebox quand je rentre sur la listbox et a fonctionne.


Tu as essay focusfollowmouse ou bien self.L.focus_force() (ou self.L.focus()) dans ta fonction *ParcourirListbox* ?




> Je pensais que le focus est automatiquement fix sue le widget o se trouve la souris!


Ben justement tu as constat toi-mme que lorsque le curseur est hors de la listbox les touches taient toujours pris en compte et pour qu'elles n'est plus d'effet il a fallut faire perdre le focus  la listbox...

Mais apparemment comme l'a indiqu *wiztricks* il y a  focusfollowmouse pour faire ce que tu veux... 




> Par contre j'ai dcouvert un autre pb:
> Quand je parcours ma listbox avec le scrollbar, je perd ma ligne slectionne (qui se trouve en surbrillance)
> Comment la garder en surbrillance quand j'agis sur l'ascenseur?


Je vais tester pour voir...

EDIT : J'ai vu quapparemment c'est toi qui dsactive (avec self.L.configure(state='disabled')) la ligne slectionne quand la souris ne survole plus la listebox or l'ascenseur ne fait pas partie de la listbox...

N'y a-t-il pas moyen d'associer lascenseur  la listbox plutt qu' la frame ?

----------


## Beginner.

> EDIT : J'ai vu quapparemment c'est toi qui dsactive (avec self.L.configure(state='disabled')) la ligne slectionne quand la souris ne survole plus la listebox or l'ascenseur ne fait pas partie de la listbox...
> 
> N'y a-t-il pas moyen d'associer lascenseur  la listbox plutt qu' la frame ?


Si tu veux laisser ton code avec lascenseur associ  la Frame alors tu peux ajouter a :

self.s.bind('<Enter>', lambda evt: self.normal())

```

```

Mais bon a commence  tre du bricolage...

----------


## Cemalatowilo

Bonsoir tout le monde,
J'ai utilis self.L.focus() et sa fonctionne correctement

J'ai supprim self.L.configure(state='disabled') dans "NePlusParcourirListbox", mais j'ai gard self.L.configure(state='normal') dans "ParcourirListbox" , sinon cela ne fonctionne pas.
Mais je pensais avoir rpondu sur ce point hier soir, j'ai du me tromper dans l'envoie de ma rponse!

Par contre je ne comprends pas ta remarque sur l'ascenseur li  la frame, car dans mon code il ya d'crit:


```

```

Je pensais que c'tait de cette manire de lier un ascenseur  une Listebox
comment faut-il procder?

Hier ssoir j'avais mis mon programme finalis dans ma rponse qui semble ne pas tre partie.
Je vous le soumets de nouveau pour avis (peut-on l'amliorer?)


```

```

----------


## Beginner.

> Bonsoir tout le monde,
> J'ai utilis self.L.focus() et sa fonctionne correctement
> 
> J'ai supprim self.L.configure(state='disabled') dans "NePlusParcourirListbox", mais j'ai gard self.L.configure(state='normal') dans "ParcourirListbox" , sinon cela ne fonctionne pas.
> Mais je pensais avoir rpondu sur ce point hier soir, j'ai du me tromper dans l'envoie de ma rponse!


Ben tant mieux si cela fonctionne... 

L'histoire sur l'ascenseur on peut l'oublier dans ce cas, peu importe, c'est juste que je ne sais pas exactement ce que tu veux faire, par exemple je pensais que tu avais ajouter la ligne self.L.configure(state='disabled') volontairement pour dslectionner la ligne lorsque la souris ne survole plus la listebox et que tu t'tais aperu que la ligne tait aussi dslectionne lorsque tu utilises l'accesseur chose que tu ne voulais pas... D'o la solution dont je t'ai parle qui a pour but de dslectionner la ligne seulement lorsque la souris ne survole ni la listebox *ni l'ascenseur*.

Oui parce que l, ton programme ne dslectionne plus *du tout* la ligne mme lorsque la souris ne survole ni la listebox ni l'ascenseur... 

Mais bon si c'est finalement ce que tu veux pas de problme, c'est simple il suffit effectivement de supprimer la ligne self.L.configure(state='disabled')...




> Je vous le soumets de nouveau pour avis (peut-on  l'amliorer?)


Peut-tre bien qu'il peut tre amlior mais pas par  moi car je ne maitrise pas tkinter et je suis dbutant en Python...

----------

