[python] à quoi sert le focus ???
Résolufazzer -
J'aimerai savoir à quoi sert le focus dans python ainsi que cette commande focus_set()
merci, d'avance !!!
--
@--ToDeSfAlL--@
Configuration: Windows XP Internet Explorer 6.0
- Tkinter focus()
- Helicon focus - Télécharger - Photo & Graphisme
- Focus magic - Télécharger - Photo & Graphisme
- Firefox focus - Télécharger - Navigateurs
- Firefox focus mac - Télécharger - Navigateurs
- Focus writer - Télécharger - Traitement de texte
54 réponses
- 1
- 2
- 3
Le focus en Python, notamment dans les interfaces Tkinter, désigne l'élément qui reçoit les évènements clavier, et focus_set() permet de désigner explicitement le widget actif pour les saisies. Plusieurs réponses expliquent qu'il sert à choisir quel widget reçoit le focus, afin que les saisies clavier soient dirigées vers ce composant et non vers les autres éléments de l'interface. Des remarques techniques illustrent des pièges, notamment avec grid qui peut retourner None si l'on écrit entr1 = Entry(fen1).grid(...); il faut créer l'Entry puis l'affecter à entr1 avant d'appeler grid et ensuite appeler entr1.focus_set(). Enfin, certains suggèrent d'envisager des bibliothèques graphiques plus avancées, comme wxPython, lorsque les interfaces deviennent complexes, car Tkinter présente des limites pour des projets plus élaborés.
lapin comprî ? :-D
J'explique: par exemple dans une interface graphique, il peut y avoir plusieurs zones de texte.
Quand tu tape, le texte s'inscrit dans la zone qui est actuellement active, celle qui a le focus.
set_focus() permet de désigner une zone de texte, un bouton ou n'importe quoi d'autre qui recevra les évènements clavier.
entr1 = Entry(fen1).grid(row = 0, column = 1)
Là tu ne récupère pas l'entry que tu viens de créer.
Il faut faire:
entr1 = Entry(fen1) entr1.grid(row = 0, column = 1)
Ce qui donne, avec le focus:
# -*- coding: cp1252 -*-
from Tkinter import *
fen1 = Tk()
fen1.title('Bonjour')
txt1 = Label(fen1, text = "Bonjour !!!!")
txt1.grid(row = 0, sticky = W)
entr1 = Entry(fen1)
entr1.grid(row = 0, column = 1)
ok = Button(fen1, text = 'O K', width = 15, command = fen1.destroy)
ok.grid(row=1, column = 1)
entr1.focus_set()
fen1.mainloop()
Merci
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question# -*- coding: cp1252 -*-
from Tkinter import *
fen1 = Tk()
fen1.title('Bonjour')
txt1 = Label(fen1, text = "Bonjour !!!!").grid(row = 0, sticky = W)
entr1 = Entry(fen1).grid(row = 0, column = 1)
ok = Button(fen1, text = 'O K', width = 15, command = fen1.destroy).grid(row=1, column = 1)
fen1.mainloop()
# -*- coding: cp1252 -*-
from Tkinter import *
fen1 = Tk()
fen1.title('Bonjour')
txt1 = Label(fen1, text = "Bonjour !!!!").grid(row = 0, sticky = W)
entr1 = Entry(fen1)
entr1.grid(row = 0, column = 1)
ok = Button(fen1, text = 'O K', width = 15, command = fen1.destroy)
ok.grid(row=1, column = 1)
entr1.focus_set()
fen1.mainloop()
fen2 = Tk()
fen2.title('Bonne après-midi')
txt2 = Label(fen2, text = "Bonne après-midi !!!!")
txt2.grid(row = 0, sticky = W)
ok = Button(fen2, text = 'O K', width = 15, command = fen2.destroy)
ok.grid(row=1, column = 0)
ok.focus_set()
fen2.mainloop()
fen3 = Tk()
fen3.title('Au revoir')
txt3 = Label(fen3, text = "Il est temps de nous dire au revoir !!!!")
txt3.grid(row = 0, sticky = W)
ok = Button(fen3, text = 'O K', width = 15, command = fen3.destroy)
ok.grid(row=1, column = 0)
ok.focus_set()
fen3.mainloop()
Pourquoi ?
As-tu lu la page de tutoriel que j'ai donnée ?
Le .mainloop() boucle à l'infini.
Il ne doit y avoir qu'un seul mainloop() d'appelé, et toutes les fenêtres et actions seront déclenchées par divers évènements (clic sur un bouton, etc.)
Je vais le répéter:
Il ne doit y avoir qu'un seul appel à .mainloop() dans ton programme.
# -*- coding: iso-8859-1 -*-
from Tkinter import *
class MenuBar(Frame):
"""Barre de menus déroulants"""
def __init__(self, boss = None):
Frame.__init__(self,borderwidth = 2)
### Menu <Fichier> ###
fileMenu = Menubutton(self, text = 'Fichier')
fileMenu.pack(side = LEFT)
# Partie déroulante :
me1 = Menu(fileMenu)
me1.add_command(label = 'Nouveau dossier machine', underline = 0)
me1.add_command(label = 'Nouveau dossier machine avec aide', underline = 1)
me1.add_separator()
me1.add_command(label = 'Imprimer', underline = 0)
me1.add_separator()
me1.add_command(label = 'Quitter', underline = 0, command = boss.quit)
# Intégration du menu :
fileMenu.configure(menu = me1)
### Menu <Edition> ###
fileMenu = Menubutton(self, text = 'Edition')
fileMenu.pack(side = LEFT)
# Partie déroulante
me2 = Menu(fileMenu)
me2.add_command(label = 'Copier', underline = 4)
me2.add_command(label = 'Coller', underline = 1)
# Intégration du menu :
fileMenu.configure(menu = me2)
### Menu <Aide> ###
fileMenu = Menubutton(self, text = 'Aide')
fileMenu.pack(side = LEFT)
# Partie déroulante
me3 = Menu(fileMenu)
me3.add_command(label = 'Aide', underline = 0)
me3.add_separator()
me3.add_command(label = 'A propos de...', underline = 7, command = boss.propos)
# Intégration du menu :
fileMenu.configure(menu = me3)
class Application(Frame):
"""Application principale"""
def __init__(self, boss = None):
Frame.__init__(self)
self.master.title('Dossier Machine')
mBar = MenuBar(self)
mBar.pack()
self.can = Canvas(self,bg='light grey', height = 190, width=250, borderwidth = 2)
self.can.pack()
self.pack()
def propos(self):
fen1 = Tk()
fen1.title('A propos de ...')
text1 = Label(fen1, text = "Dossier Machine 2007").grid(row = 0, sticky = W)
text2 = Label(fen1, text = "Part of *** Edition 2007").grid(row = 1, sticky = W)
text3 = Label(fen1, text = "Copyright (c) ***. Tous droits réservés.").grid(row = 2, sticky = W)
text4 = Label(fen1, text = "Version 1.01").grid(row = 3, sticky = W)
text5 = Label(fen1, text = "Licence d'utilisation accordée à :").grid(row = 4, sticky = W)
text6 = Label(fen1, text = " - ***").grid(row = 5, sticky = W)
ok = Button(fen1, text = "OK", width = 15, command = fen1.destroy)
ok.grid(row = 6, column = 0)
ok.focus_set()
fen1.mainloop()
if __name__ == '__main__':
app = Application()
app.mainloop()
comment faire pour que lorsque je fais Aide/à propos de ..., je n'utilise pas le mainloop() de la fenetre pour qu'il n'y en ai qu'un dans le programme.
def propos(self): fen1 = Tk()
Non, il faut que chaque fenêtre soit une classe.
Ensuite, dans ton gestionnaire d'évènement ( def propos(self): ) tu instancie ta fenêtre (f = maFenetre()).
Quant chaque fenêtre est définie comme une classe, le simple fait de l'instancier fera apparaître la fenêtre.
Et il ne faut pas utiliser plusieurs mainloop(). Il ne faut utiliser qu'un seul mainloop() (on le met généralement dans le main() comme tu as fait).
1 fenêtre = 1 classe
Sinon tu ne t'en sortira pas.
Mais dans l'exemple que j'ai donné (la page), la définition une petite classe de fenêtre est donnée.
Prend exemple là dessus, et créé une classe pour chaque fenêtre de ton application.
Il est nécessaire d'apprendre à programme en orienté objet, sinon tu ne t'en sortira pas pour construire des interfaces graphiques.
Il y a des cours sur Python et la programmation orientée objet:
https://python.developpez.com/cours/
http://wikipython.flibuste.net/moin.py/Debuter
- 1
- 2
- 3