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 :

Entry, problème d'activation de la saisie du texte [Python 3.X]


Sujet :

Tkinter Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Juillet 2018
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Juillet 2018
    Messages : 2
    Par défaut Entry, problème d'activation de la saisie du texte
    Bonjour,
    je souhaite récupérer ce que l'utilisateur entre au clavier à la place de "Entrez, ici, le texte à écrire".
    J'ai beau retourner le problème dans tous les sens je ne vois pas pourquoi mon premier programme fonctionne, et l'autre pas (la fenêtre de saisie n'est pas active, je ne peux pas modifier le texte). J'ai lu pas mal de forums de discussion et étudié un tutoriel tkinter. Les deux programmes me semblent très proches et pourtant...
    un truc m'échappe, c'est évident ! Je travaille sur edupython 2.6 et python 3.4.

    Premier programme :
    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
    from tkinter import *
    import tkinter.filedialog as tkfd
    from PIL import Image,ImageOps
    from math import sqrt
    import os
     
    def lancerProgramme():
        def print_name(event):
            print(entree.get())
        value = StringVar(feneTTre)
        value.set("Entrez, ici, le texte à écrire")
        entree = Entry(feneTTre, textvariable=value, width=30,foreground="red",
                  background="yellow")
        entree.pack()
        entree.bind("<Return>", print_name)
     
    feneTTre = Tk()
    canvas = Canvas(feneTTre,width=600, height=325)
     
    bouTti01 = Button(feneTTre,text='Bouton de lancement',command=lancerProgramme)
    bouTti01.place(relx=0.8, rely=0.05, anchor="c")
    canvas.pack()
     
    feneTTre.mainloop()
    Deuxième programme :
    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
    from tkinter import *
    import tkinter.filedialog as tkfd
    from PIL import Image,ImageOps
    from math import sqrt
    import os
     
    def lancerProgramme():
        def print_name(event):
            print(entree.get())
        value = StringVar(feneTTre)
        value.set("Entrez, ici, le texte à écrire")
        entree = Entry(feneTTre, textvariable=value, width=30,foreground="red",
                  background="yellow")
        entree.pack()
        entree.bind("<Return>", print_name)
     
    feneTTre = Tk()
     
    filepath = tkfd.askopenfilename(title="Ouvrir une image",filetypes=[('jpg files','.jpg'),('png files','.png'),('all files','.*')])
    imgVignette=Image.open(filepath) # Chargement d'une image à partir de PIL
    imgVignette=imgVignette.resize((260,260))
    imgVignette.save("vignette.png")
    imgTK0= PhotoImage(file="vignette.png")
     
    canvas = Canvas(feneTTre,width=600, height=325)
    canvas.create_image(0, 0, anchor=NW,image=imgTK0)
    bouTti01 = Button(feneTTre,text='Bouton de lancement',command=lancerProgramme)
    bouTti01.place(relx=0.8, rely=0.05, anchor="c")
    canvas.pack()
     
    feneTTre.mainloop()
    J'ajoute que la "vignette" s'affiche bien en haut à gauche de ma fenêtre. Pas de souci de ce côté là.
    Mais je ne peux plus entrer de texte dans la fenêtre texte, qui affiche toujours "Entrez, ici, le texte à écrire" mais sans que l'on puisse intervenir dessus, contrairement au premier programme.

    Merci pour votre aide.

  2. #2
    Membre chevronné
    Homme Profil pro
    Développeur banc de test
    Inscrit en
    Mai 2014
    Messages
    199
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur banc de test
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mai 2014
    Messages : 199
    Par défaut
    Bonjour,

    Si il y a un truc à savoir sur Tkinter c'est que ça fonctionne tant qu'on travaille qu'avec une seule fenêtre dans le main d'exécution.

    Mais dès qu'on souhaite travailler avec plusieurs fenêtres (en thread ou non) même avec les outils intégrés comme filedialog il faut avoir une approche différente pour que ça fonctionne sans bug.

    tkinter.Tk() créer la fenêtre principale (master) et pour en créer une nouvelle il faut hériter de cette fenêtre principale.

    Pour créer une seconde fenêtre qui permettra d'afficher la boîte de dialogue il faut utiliser : tkinter.Toplevel(master)

    Voici la solution :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    feneTTre_sec = Toplevel(feneTTre)
    feneTTre_sec.withdraw() # Hide window
     
    try:
        filepath = tkfd.askopenfilename(parent=feneTTre_sec, title="Ouvrir une image",filetypes=[('jpg files','.jpg'),('png files','.png'),('all files','.*')])
    finally:
        feneTTre_sec.destroy()

    Il est aussi possible de masquer la fenêtre principale, pour le temps de chargement par exemple si on affiche d'autres fenêtres.
    puis pour ré-afficher la fenêtre :



    Dernier conseil pratique, vous devriez utiliser les widgets tkinter.ttk qui utilisent le style natif du système et de fait sont beaucoup plus jolis. Il n'y a presque pas d'adaptation à faire entre les widgets tkinter et ceux de tkinter.ttk

    Puisque vous travaillez en import sauvage il suffit de rajouter cette ligne pour remplacer automatiquement les widgets :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    from tkinter.ttk import *

  3. #3
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 778
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 778
    Par défaut
    Salut,

    Normalement, un "dialog" s'ouvre via un callback (une fonction appelée lorsque par exemple on clique sur un Button)... Et la structure logique d'une application tkinter est de créer ses widgets dans le code principal et de les modifier via des callbacks i.e. çà ne bouge qu'après l'entrée dans .mainloop.
    Ici vous foutez un peu la grouille juste en écrivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    feneTTre = Tk()
     
    filepath = tkfd.askopenfilename(title="Ouvrir une image",filetypes=[('jpg files','.jpg'),('png files','.png'),('all files','.*')])
    qui se corrige en accélérant un peu les choses:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    feneTTre = Tk()
    feneTTre.update()
    filepath = tkfd.askopenfilename(title="Ouvrir une image",filetypes=[('jpg files','.jpg'),('png files','.png'),('all files','.*')])
    i.e. on finalise la création de la fenêtre principale avant de trop bouger.

    La raison de tout cela est l'ordonnancement des évènements traités par la mainloop: s'ils s'empilent, leur priorité de traitement pourra être changée et provoquer des effets de bords douteux. Ce n'est pas un bug car un peu de compréhension du fonctionnement de tkinter vous éviterait de tomber dans ces pièges.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  4. #4
    Candidat au Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Juillet 2018
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Juillet 2018
    Messages : 2
    Par défaut Merci à vous deux.
    Bonsoir,
    je vous remercie grandement pour vos conseils.
    J'ai encore un côté autodidacte avec des grosses lacunes, même si je fais des trucs sympas et qui comblent mes attentes avec tkinter et bien d'autres aspects de python.
    Un acquis pour moi : il faut être vigilant dès que l'on va traiter plus d'une fenêtre avec tkinter.
    Un autre : on peut y arriver si on fait ce qu'il faut (notamment en mettant un fenetre.update() bien placé ou un Toplevel(feneTTre) ou encore un
    feneTTre_sec.withdraw()).

    Je vais revoir une nouvelle fois les deux bons tutorats (jean et vincent) que j'ai trouvé sur developpez.com. Avec vos conseils, ils me seront encore plus utiles et il faut que je comprenne mieux la philosophie générale de cette biblio.

    En tout cas, sur mon programme, les trois différentes possibilités que vous m'avez conseillées fonctionnent déjà.

    Encore merci.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. problème d'activation du diskperf (Compteurs de Perfomances)
    Par zicoP dans le forum Windows Serveur
    Réponses: 2
    Dernier message: 06/10/2006, 14h53
  2. Problème pour ajouter un texte automatique dans un zone de saisie de texte
    Par koKoTis dans le forum Balisage (X)HTML et validation W3C
    Réponses: 6
    Dernier message: 21/08/2006, 16h03
  3. Problème d'activation JavaScript
    Par Souls Destroyer dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 08/08/2006, 19h42
  4. [Win XP Pro]Problème d'activation
    Par Le Pharaon dans le forum Windows XP
    Réponses: 3
    Dernier message: 07/06/2006, 19h48
  5. ORA-01190 Problème après Activation BDD Standby
    Par Sergio_free dans le forum Oracle
    Réponses: 2
    Dernier message: 23/10/2005, 00h38

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