Interface graphique avec TKinter

Bonjour,

J’aimerai savoirs si il est possible de passer d’une case à une autre fait avec le créateur d’interface graphique de python Tkinter avec le clavier.

C’est à dire que si je créer par exemple un menu pour mon projet Raspberry pi, pour cliquer sur les cases de ce menu je serai obliger d’utiliser ma souris, ou l’on peut se « balader » avec le clavier de case en case ?

Ex: pour ceux qui ont windows 10, si vous cliquez sur le petit onglet en bas a gauche qui ouvre le menu windows, vous pouvez vous balladez de haut en bas entre la case " développéer " et la case " Marche/Arrêt "

Je sais que c’est très difficile pour vous de comprendre ce que je veux dire

Donc voila est-ce que la navigation avec le clavier se fait de manière automatique sur tkinter ou l’on doit le spécifier dans le code ?

Merci pour vos réponses !

Bien à vous !

hello,

Dans la théorie il faudrait une fenêtre « maître » d’où tu pourrais ouvrir n’importe laquelle des autres fenêtres « esclaves » avec sur chacune des « esclaves » un retour vers la fenêtre principale. ( pour que le focus soit toujours soit sur maitre soit sur une des esclaves - pas de focus = pas de raccourci clavier ! )
sur cette page il y a des exemples d utilisation de « bind » et si j’ai bien compris on peut associer une touche a une fonction …
https://effbot.org/tkinterbook/tkinter-events-and-bindings.htm

J’ai commencé à tenter de créer une interface graphique minimaliste pour ma borne à serfies pour faire un test.
Je vais essayer de rallumer le truc pour vérifier si clavier est suffisant :wink:

++

Re,
Petit retour
De façon native, un cadre avec 4 boutons « action » n’est pas pilotable au clavier.
Aucune action.
C’est uniquement la souris.
Donc faut trouver une autre solution (voir le lien de @bof)
Sinon, tu investis dans un écran tactile :wink:

Je vais y jeter un coup d’oeil, merci :grinning:

Merci pour votre réponse, c’est précisément la réponse que j’attendais :smiley:

Après, je n’y connais rien et mon codage est forcément minimaliste.
De plus, c’était juste pour aider une personne du forum que j’avais essayé donc je n’ai rien creuser.
C’est peut-être faisable facilement :wink:
Redis-nous,

j’ai pondu ce code ( les puristes me pardonneront :wink: ) qui a partir d’une fenêtre maître permet de choisir l’ouverture d’autres fenêtres par appuie de touches sur le clavier :
a pour la fenêtre 1, b pour la deux …
une fois la fenêtre ouverte l’appuie sur Tab ferme la fenêtre et repositionne le focus sur la fenêtre principale.
a noter que j’ai laisse des boutons qui ne servent à rien qu’a remplir la fenêtre …

en source un tuto détaillé sur tkinter et sur les evenements

#!/usr/bin/env python3
# coding: utf-8
from tkinter import *
def handle_keypress(event):
#premiere fenetre esclave
    def faireApparaitreLeToplevel_a():
        top=Toplevel(root)
        lab=Label(top, text="Ce soir je vais manger des frites")
        lab.pack()
        button1 = Button(top,
            text="appuyer sur tab pour fermer",
            width=25,
            height=5,
            bg="blue",
            fg="yellow",
        )
        button1.pack()
        def handle_close(event):
            top.destroy()
        top.bind("<Tab>", handle_close)
#deuxieme fenetre esclave
    def faireApparaitreLeToplevel_b():
        top=Toplevel(root)
        lab=Label(top, text="Ce soir je vais manger des fraises")
        lab.pack()
        button1 = Button(top,
            text="appuyer sur tab pour fermer !!!",
            width=25,
            height=5,
            bg="blue",
            fg="yellow",
        )
        button1.pack()
        def handle_close(event):
            top.destroy()
        top.bind("<Tab>", handle_close)
# l'appuie sur a ouvre la fenetre a
    if event.char == "a" :
       faireApparaitreLeToplevel_a()
# l'appuie sur b ouvre la fenetre b (non ? sisi!)
    if event.char == "b":
       faireApparaitreLeToplevel_b()

root=Tk()
root.bind("<Key>", handle_keypress)
lab=Label(root, text="appuie a pour fenetre 1")
lab.pack()
lab2=Label(root, text="appuie b pour fenetre 2")
lab2.pack()
root.mainloop()

source :

source 2 les events:
http://tkinter.fdex.eu/doc/event.html

Merci, par contre ce n’est pas réellement ce que je veux, dans ton code c’est du " si j’appuie sur la lettre A alors lance la fenêtre A si j’appuie sur B alors lance la fenêtre B ect…".

Moi ce que je veux c’est que avec les 4 flèches de direction je puisse me déplacer sur un menu par exemple.

Au final je compte créer un objet du style lecteur mp3(ce ne sera pas un lecteur mp3 mais le fonctionnement et le même). Pour la navigation j’ai tout simplement pensé à connecter 5 boutons au raspberry pi grâce aux ports gpio.

Puis après avec une bibliothèque du style http://wiringpi.com/ Tout simplement assigner mes 5 buttons gpio à mes touches de clavier ( haut bas droite gauche entrée )

Je pensais que la navigation se fessait de manière automatique mais visiblement non, c’est dommage.

Du coup je vais devoir faire un code du genre " Si le curseur est sur la case 1 et que la touche « flèche de droite » est pressé alors vas sur la case 2 ect…"

Cela donnera un code fonctionnelle, mais ça sera très très long :pensive:

Yo,
Faut creuser pour voir si le flèches ou la touche tabulation ne seraient pas utilisables.
ça doit être faisable.
Sinon, le coup des boutons en GPIO fonctionne bien ; c’est ce que j’utilise pour mes scripts.
++

Merci pour ton avis Nabla :grinning:

Finalement j’ai suis rester 1 heure sur ce problème à 5 heures du matin, et j’ai trouvé la solution !.

Admettons que mon menu est composé de 4 case, A B C D respectivement.

Mon code sera comme ceci, au départ nous allons assigner une variable de type int, par exemple " selectioncase = 1 ". La case A sera quand à elle " highlight " par défaut, c’est a dire que c’est la case sur lequel le curseur est de base.

Si la touche « fleche de droite » est préssé ET selectioncase = 1 alors {
global selectioncase = 2
Stop highlight Case A, Start highlight Case B
}

ect…

Avec biensur

Si la touche « enter » est préssé {
Si selectioncase = 1{
Ouvrir menu 1
} ou sinon si selectioncase = 2{
Ouvrir menu 2
} ou sinon si selectioncase =3{
Ouvrir menu3
} ect…

Je sais que c’est pas du code mais j’ai jamais toucher au python, lorsque je me lance dans un projet je préfère faire la partie théorie avant de me lancer dans le bain.

Si ça peux donner des idée à certain ! :grinning:

N’oublie pas quand même qu’en programmation on gagne souvent du temps et des nerfs à faire simple !
par exemple avec tkinter, pour tes quatres cases, un appuie sur Tab peut te fait passer a la case suivante, et un appuie sur entrée sur la case voulue peut t"envoyer le code qui lui est assigné :wink: