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

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 31
    Points : 16
    Points
    16
    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 actif
    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
    Points : 290
    Points
    290
    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 à l'essai
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 31
    Points : 16
    Points
    16
    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 éminent sénior
    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 : 43
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Août 2002
    Messages : 1 864
    Points : 10 067
    Points
    10 067
    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 à l'essai
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 31
    Points : 16
    Points
    16
    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 éminent sénior
    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 : 43
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Août 2002
    Messages : 1 864
    Points : 10 067
    Points
    10 067
    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

  7. #7
    Membre expérimenté Avatar de pacificator
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 074
    Points : 1 728
    Points
    1 728
    Par défaut
    Chez moi cela fonctionne en ouvrant un shell puis

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 31
    Points : 16
    Points
    16
    Par défaut
    Pour la version de nyko77 sur mon ubuntu, quand je dis que ça plante, le comportement est le suivant : le programme se lance et je n'ai pas de message d'erreur, j'ai à l'écran la zone de texte et les labels mais si je clique dans la zone de texte, rien ne se passe, il ne prend pas le focus et je ne peux rien saisir. Et si je fais Echap, il ne se passe rien non plus, le programme ne s'arrête pas. Je dois tuer mon serveur X pour relancer ma session.
    Et en commentant la ligne overrideredirected(1), ça fonctionne nickel !! Sauf que je vois les barres de menus et de taches

    Mais nouvelles données : j'ai testé les deux versions sous windows (xp home) avec python 2.6.1, et les deux fonctionnent. Pour "ma version", j'ai la fenêtre root qui s'affiche au premier plan et que dois faire disparaître en cliquant sur la fenêtre top, mais la version niko77 est parfaite : plein écran, et focus dans la zone de texte.... Tu crois que si je passe en 2.6 sous ubuntu, ça ne résoudra pas le problème ?? J'ai un peu peur de me lancer dans la manip, donc je vais peut être en rester là. D'après toi, le overrideredirected n'aurait pas le même comportement selon l'OS ? Alors là, ça devient un peu compliqué pour moi.
    Encore merci de m'avoir aidé. Si j'ai le courage de passer en 2.6 sous je reviendrai vous dire si ça a changé quelque chose. Pour une version 3, je vais attendre alors, si je comprends bien il y a de grosses différences, et je ne suis pas sur de trouver toute la doc nécessaire encore ??
    Ciao,

    ---
    Christophe.

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 31
    Points : 16
    Points
    16
    Par défaut
    Je n'avais pas vu le message de pacificator...
    Tu es sous quel OS ?? avec quel version de python ?

    J'ai le même comportement quelque soit la façon dont je lance le programme de niko77. Mais je suis de plus en plus convaincu que le soucis vient de ma config : pilote vidéo, version de l'OS, programme installé, bref impossible à débugger pour moi avec mes faibles connaissances en pyhon.

    Encore merci, si au moins quelqu'un d'autre avait le même comportement que chez moi, je pourrai peut être avancer.

    ---
    Christophe.

  10. #10
    Membre averti
    Homme Profil pro
    Responsable du parc et des réseaux de télécommunication
    Inscrit en
    Mai 2003
    Messages
    290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Responsable du parc et des réseaux de télécommunication
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2003
    Messages : 290
    Points : 388
    Points
    388
    Par défaut
    Bonjour,
    Les 2 fonctionnent chez moi. (Intrepid - python 2.5.2).

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 31
    Points : 16
    Points
    16
    Par défaut
    Mince alors, je viens de tester sur le portable du boulot, c'est aussi intrepid + python 2.5.2 et ... ça ne fonctionne pas pour moi J'ai le même comportement que sur ma machine perso (hardy + 2.5.2).

    Y a t il une configuration post installation pour Python et/ou tkinter ?? Je ne me souviens plus précisément comment j'ai fait l'installation, mais j'ai peut être zappé quelque chose ??

    Merci de tous vos avis en tout cas.
    ---
    Christophe.

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 31
    Points : 16
    Points
    16
    Par défaut je sais pourquoi ça ne marche pas...
    Bonjour,
    Ca y est, j'ai un début de piste

    Suite au message de pierjean qui utilise la même config que moi, je me suis demandé ce qui pouvait expliquer la différence de comportement. Et je ne sais pas pourquoi, je sentais que cela pouvait être lié au côté "graphique" de la machine. Or puisque ma machine est relativement ancienne, j'ai désactivé les effets de bureau (sous ubuntu, Système->Préférences->Apparence puis onglet Effets Visuels et choix Aucun). Donc pour vérifier j'ai remis les effets visuels sur Normal, et tout fonctionne normalement !!! Avec ma version, j'ai bien le focus automatiquement dans la zone de texte, et la version de niko77 est fonctionnelle à 100% !!

    Bon, le problème n'est pas complètement résolu, il faudrait trouver le lien entre le overrideredirected et les effets visuels, mais ça dépasse largement mes compétences. Moi j'ai une explication qui me convient.

    Encore un grand merci à tous
    ---
    Christophe

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