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 :

widget Text ne prend pas le focus


Sujet :

Tkinter Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 31
    Par défaut widget Text ne prend pas le focus
    Bonjour,
    Je suis en train de faire un petit programme à la fois pour découvrir Python, et pour permettre à ma fille de 2 ans de jouer avec le clavier de mon ordi sans pour autant mettre le bazar sur mon bureau (et je vous assure que ça va vite !!!). Un peu dans le style du jeu gamine sous linux, mais avec le clavier plutôt que la souris.

    Bref, les contraintes : je dois faire une appli plein écran, sans bord de fenêtre ni décoration, et l'appui sur une touche (j'ai pris Echap mais on s'en fout, enfin pas une lettre quand même...) pour quitter. Je suis arrivé au code suivant qui fonctionne mais il reste un petit soucis : il faut cliquer dans le widget Text pour pouvoir écrire dedans, même avec l'instruction zoneText.focus_set() !!
    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
     
    #!/usr/bin/python
    # -*- coding: iso-8859-15 -*-
    import Tkinter as Tk
     
    root = Tk.Tk()
     
    # function used to close application
    def ferme(event):
        root.destroy()
     
    # creation of the main window
    # seems necessary because the use of "root.overrideredirect(1)" AND "root.bind_all()" does not work together ??
    # so the main "root" window exist but it is hidden by the fullscreened "top" window.
    def affiche():
        top=Tk.Toplevel()
        top.overrideredirect(1) #no title nor border for the window
        top.geometry(str(top.winfo_screenwidth())+"x"+str(top.winfo_screenheight())+"+0+0") # fullscreen !
        lEscape=Tk.Label(top, text="Hit 'ESC' to close the program")
        lEscape.pack(side='bottom')
        cadre = Tk.Frame(top, width =1024, height =768, bg="light yellow")
        cadre.pack(pady=10,side='bottom')
        cadre.pack_propagate(0)
        lInstruction=Tk.Label(cadre, text='Clic in the box below to begin', bg='light yellow',pady=2)
        lInstruction.pack(side='top')
        zoneText=Tk.Text(cadre,fg='blue',font='Verdana 40 bold')
        zoneText.pack(pady=10,padx=10,fill='both', expand='yes')
        zoneText.focus_set()
     
    affiche()
    root.bind_all('<Escape>',ferme) #used to close application by clicking the escape key
    root.mainloop()
    Je pense que le problème vient de l'utilisation de l'instruction top.overrideredirect(1) puisque si je commente la ligne, la zone de texte a bien le focus. Mais je ne peux pas la supprimer, sinon la barre de menu et la barre des tâches sont visibles !!

    Si vous avez une solution, et une explication, je suis preneur car la je tourne en rond Même si ce n'est pas très compliqué de cliquer dans la zone de texte, si je peux simplifier le truc je préfèrerai. Je ne sais pas si c'est utile, mais je suis sous Ubuntu.

    Merci d'avance de votre aide.
    ---
    Christophe

  2. #2
    Membre expérimenté
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    222
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 222
    Par défaut
    Je pense que le problème vient de la fenêtre Toplevel. Je ne vois pas bien son utilité, il vaut mieux utiliser directement le root:

    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
     
    #!/usr/bin/python
    # -*- coding: iso-8859-15 -*-
    import Tkinter as Tk
     
    # function used to close application
    def ferme(event):
        root.destroy()
     
    # creation of the main window
    # seems necessary because the use of "root.overrideredirect(1)" AND "root.bind_all()" does not work together ??
    # so the main "root" window exist but it is hidden by the fullscreened "root" window.
    def affiche():
        root.overrideredirect(1) #no title nor border for the window
        root.geometry(str(root.winfo_screenwidth())+"x"+str(root.winfo_screenheight())+"+0+0") # fullscreen !
        lEscape=Tk.Label(root, text="Hit 'ESC' to close the program").pack(side='bottom')
        cadre = Tk.Frame(root, width =1024, height =768, bg="light yellow")
        cadre.pack(pady=10,side='bottom')
        cadre.pack_propagate(0)
        zoneText=Tk.Text(cadre,fg='blue',font='Verdana 40 bold')
        zoneText.pack(pady=10,padx=10,fill='both', expand='yes')
        zoneText.focus_set()
     
    root = Tk.Tk()
    affiche()
    root.bind_all('<Escape>',ferme) #used to close application by clicking the escape key
    root.mainloop()

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 31
    Par défaut
    Salut,

    Eh non, ça ne fonctionne pas... J'ai revérifié avec ton code mais j'avais déjà testé ça : rien ne fonctionne, je ne peux pas quitter avec Esc ni saisir quoi que ce soit dans mon widget text. C'est pour ça que j'avais utilisé un TopLevel, même si je ne sais pas trop pourquoi il est nécessaire. En fait, je suis parti du code d'airod dans la faq : http://python.developpez.com/faq/?pa...t#RootNoBorder
    que j'ai adapté à mes besoins...

    Pour moi, il y a des incompatibilités entre bind_all, focus_set et overrideredirect, mais je n'arrive pas à saisir quoi.

    Merci quand même de t'intéresser à ma question. Si vous avez d'autres pistes ??
    ---
    Christophe

  4. #4
    Expert confirmé
    Avatar de Guigui_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 864
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2002
    Messages : 1 864
    Par défaut
    Est-ce que tu exécutes ton programme depuis IDLE ou tu le lances directement (par un double-clic sur l'icône) ?
    La solution de nyko77 fonctionne parfaitement. Par contre depuis IDLE, il peut y avoir des problèmes.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 31
    Par défaut
    Heu là j'ai un gros problème...
    J'ai testé une nouvelle fois la solution de nyko77, et sur tes conseils j'ai lancé le programme sans passer par SPE (j'utilise Stani's Python Editor sous ubuntu) en double cliquant sur mon programme ==> même chose que précédemment, rien ne fonctionne.

    Du coup, je me demande si mes soucis ne sont pas lié qu'à ma config propre. Si c'est ça, ça ne va pas être facile à débugger... La version de Python installée sur ma machine est 2.5.2. J'ai installé Python en utilisant les dépôts ubuntu avec une commande apt-get. Est ce que j'ai intérêt à passer en version 2.6, ou même 3 ?? Je débute, donc je n'ai pas d'obligation quant à une version particulière. Je vais tester les 2 versions du programme sous windows pour voir ce qui se passe et je vous tiendrai au courant.

    C'est quand même vexant d'avoir des soucis avec un truc aussi simple (10 lignes...). Pour autant, j'aimerai bien comprendre ce qui se passe.

  6. #6
    Expert confirmé
    Avatar de Guigui_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 864
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2002
    Messages : 1 864
    Par défaut
    J'ai testé le programme sous Windows (je n'ai pas de Linux). Par contre, le problème ne vient pas de la version de Python. Par contre, l'exécution peut parfois différer entre Linux et Windows ?

    Quand tu dis que rien ne fonctionne avec le programme de nyko77 ? Cela signifie quoi ? Le programme plante ? Y'a un message d'erreur ?

    Est-ce que en commentant la ligne root.overrideredirect(1) (toujours dans son programme), cela marche mieux ?

    Si tu prends une version 3, fais attention, l'importation de Tkinter est modifié
    import Tkinter => import tkinter
    import Tix => import tkinter.tix

Discussions similaires

  1. Réponses: 20
    Dernier message: 15/07/2011, 09h09
  2. Texte qui ne prend pas la bonne couleur
    Par lodan dans le forum Mise en page CSS
    Réponses: 24
    Dernier message: 20/09/2006, 09h05
  3. [JAR] Archive qui ne prend pas en compte librairie externe
    Par Shiryu44 dans le forum Général Java
    Réponses: 3
    Dernier message: 22/04/2005, 13h59
  4. where texte <> '' ne fonctionne pas
    Par Fox_magic dans le forum Oracle
    Réponses: 3
    Dernier message: 07/12/2004, 16h03
  5. [JFrame] événement qui ne prend pas
    Par Ymer dans le forum Agents de placement/Fenêtres
    Réponses: 9
    Dernier message: 24/11/2004, 13h54

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