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 :

[POO] Fenêtre interface simple


Sujet :

Tkinter Python

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2018
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2018
    Messages : 7
    Points : 2
    Points
    2
    Par défaut [POO] Fenêtre interface simple
    Bonjour,

    J'ai eu quelques cours sur Python en cpge mais cela se limite essentiellement à de l’algorithmique.
    Je souhaiterais pour un de mes programme créer une fenêtre pour le faire fonctionner (actuellement je le fait dans la console directement)
    J'ai donc besoin d'une fenêtre simple qui rempli le rôle suivant :
    - Une case vide dans lequel on rempli par un entier qui sera un argument d'une fonction déjà créée, ex : marquer(33) .Je souhaite donc qu'on inscrivant 33 puis en validant ça active la fonction marquer
    - Un bouton pour faire tourner une autre fonction sans argument : Effacer() . Que l'on pourra idéalement placer à un endroit où l'on ne pas pas appuyer par accident.
    - En dessous, une zone qui affiche ce qui est renvoyé par la console (du texte)

    Sauriez-vous comment réaliser ce type de fenêtre ou avez-vous quelques exemple similaire que je pourrais étudier ?

    Merci

  2. #2
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 824
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 824
    Points : 7 120
    Points
    7 120
    Par défaut
    Bonjour,

    Tu utilises Tkinter ?

    J'ai donc besoin d'une fenêtre simple
    Donc pas besoin de faire de la POO...

    Sauriez-vous comment réaliser ce type de fenêtre
    Oui !

    avez-vous quelques exemple similaire que je pourrais étudier
    Non faut chercher, enfin si je devais trouver des exemples, eh bien j'utiliserai mon moteur de recherche préféré...
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  3. #3
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Salut et bienvenue,

    Tu vas trouver tout cela dans ce cours https://python.developpez.com/cours/apprendre-python3/
    et plus encore.

  4. #4
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2018
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2018
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Bonjour,
    Merci pour ces réponses.

    Voici ce que j'ai pu réaliser pour l'instant :
    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
    from tkinter import *
     
    fen1 = Tk()
    fen1.title("Titre de ma fenetre")
    txt1 = Label(fen1, text ='Grille :')
    txt2 = Label(fen1, text ='Numéro :')
    entr1 = Entry(fen1)
    entr2 = Entry(fen1)
     
    txt1.grid(row =1, sticky =E)
    txt2.grid(row =2, sticky =E)
    entr1.grid(row =1, column =2)
    entr2.grid(row =2, column =2)
     
     
    bou1 = Button(fen1, text='Effacer', command = fonction1)
    bou1.grid(row =3, sticky =E)
    bou1.pack()
     
    bou2 = Button(fen1, text='Quitter', command = fen1.destroy)
    bou2.grid(row =3, column =2)
    bou2.pack()
     
    bou3= Button(fen1, text='OK', command = fonction3(entr1))
    bou3.grid(row =1,column=3)
    bou3.pack()
     
    bou4= Button(fen1, text='OK', command = fonction2(entr2))
    bou4.grid(row =1,column=3)
    bou4.pack()
     
    fen1.mainloop()
    Avec pour objectif de donner une fenêtre comme cela :
    Nom : 66572042e83594e72a3373da58a89d41.png
Affichages : 382
Taille : 7,2 Ko
    Il semble y avoir une petite erreur dans le code, avec une sorte de boucle infinie dès que j'ai intégré les boutons alors que chacun des éléments seul fonctionnait.
    Le code vous semble-t-il correct ?

    Par la suite je vais essayer d'ajouter une zone pour le retour de la console, qui ressemblerait à ça :
    Nom : 8ee623cdf57579267b06a2ee9304787a.png
Affichages : 421
Taille : 18,3 Ko
    Savez-vous quelle fonction renvoi le résultat de la console ?

  5. #5
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 824
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 824
    Points : 7 120
    Points
    7 120
    Par défaut
    Un callback en paramètre des boutons est sans argument, donc entr1 et entr2 sont de trop.

    Voir un tuto pour savoir comment faire.
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  6. #6
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2018
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2018
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Merci, j'ai corrigé les arguments de ces fonctions :
    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    def fonction1():
        print('fonction1')
     
    def fonction2(arg):
        print('fonction2',arg)
     
    def fonction3(args):
        print('fonction3',args)
     
    from tkinter import *
     
    fen1 = Tk()
    fen1.title("Titre de ma fenetre")
    txt1 = Label(fen1, text ='Grille :')
    txt2 = Label(fen1, text ='Numéro :')
    entr1 = Entry(fen1)
    entr2 = Entry(fen1)
     
    can1 = Canvas(fen1, width =160, height =160, bg ='white')
     
    txt1.grid(row =1, sticky =E)
    txt2.grid(row =2, sticky =E)
    entr1.grid(row =1, column =2)
    entr2.grid(row =2, column =2)
     
     
    bou1 = Button(fen1, text='Effacer', command = fonction1)
    bou1.grid(row =3, sticky =E,column =3)
     
     
    bou2 = Button(fen1, text='Quitter', command = fen1.destroy)
    bou2.grid(row =3, column =0)
     
     
    bou3= Button(fen1, text='OK', command=lambda: fonction3(entr1))
    bou3.grid(row =1,column=3)
     
     
    bou4= Button(fen1, text='OK', command=lambda: fonction2(entr2))
    bou4.grid(row =2,column=3)
     
     
    fen1.mainloop()
    Voila ce que ça donne
    Nom : d4b5a6e214728d3d23adcb36eb1604ed.png
Affichages : 370
Taille : 45,9 Ko

    Il me manque maintenant à convertir le 88143855 en 42 pour que lorsque j'appui sur ok l'entrée dans la fenêtre active correctement ma fonction.

    Et à ajouter une zone pour le retour de la console.

  7. #7
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    Citation Envoyé par Attirail Voir le message
    Néanmoins j'ai toujours le problème qu'a l’exécution, rien ne se lance, et le logiciel fait des calculs en boucle (comme lorsque qu'il y a une boucle infinie).
    Avec une version de Python récente (>=3.4), le code que vous avez posté se plantera avec un beau message d'erreur. Or, vous n'avez aucune bonne raison d'utiliser une version de Python inférieure à 3.6 et que vous n'avez pas mentionné le message d'erreur... la question est: "quelle version de Python utilisez vous?"

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

  8. #8
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2018
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2018
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Salut,



    Avec une version de Python récente (>=3.4), le code que vous avez posté se plantera avec un beau message d'erreur. Or, vous n'avez aucune bonne raison d'utiliser une version de Python inférieure à 3.6 et que vous n'avez pas mentionné le message d'erreur... la question est: "quelle version de Python utilisez vous?"

    - W
    J'utilise Python 3.3, la version que j'avais installé (Spyder) pour mes études 2013-2016.
    Néamoins le soucis semble résolu en ne mettant pas de pack pour les boutons.

  9. #9
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Citation Envoyé par Attirail Voir le message
    J'utilise Python 3.3, la version que j'avais installé (Spyder) pour mes études 2013-2016.
    Néamoins le soucis semble résolu en ne mettant pas de pack pour les boutons.
    Tout à fait... on ne mélange pas pack et grid! La différence entre 3.3 et les versions supérieures est dans la version de TCL/Tk qui est livrée avec. Plutôt que de s'en remettre au bon sens du programmeur (et faire n'importe quoi sinon), on préfère planter avec un beau message d'erreur.

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

  10. #10
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2018
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2018
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    C'est ce que j'ai finis par comprendre en voyant que les 2 moitiés de code fonctionnaient séparément mais pas ensemble ...

    Si vous avez une idée sur pourquoi le 42 me donne 88143856 (ce qui ressemble plus à des coordonnées qu'un entier converti dans je ne sais quelle base, et comment récupérer le 42 cela pourrait m'aider

    En vérifiant bien le code je crois que je n'ai rien qui récupère la valeurs dans les cases d'entrée, je vais donc chercher à mettre ces valeurs dans des variables

  11. #11
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2018
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2018
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    J'ai essayé de récupérer la valeure avec la méthode get, puis d'effacer la valeure une fois prise en compte.
    Or, Contenu1 et Contenu2 restent vide dans l'explorateur de variable et n'apparaissent pas lorsque j'active la fonction (OK)
    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    def fonction1():
        print('fonction1')
     
    def fonction2(arg):
        print('fonction2',arg)
        entr1.delete (0, len(contenu1))  
     
    def fonction3(args):
        print('fonction3',args)
        entr2.delete (0, len(contenu2))
     
    from tkinter import *
     
    fen1 = Tk()
    fen1.title("Titre de ma fenetre")
    txt1 = Label(fen1, text ='Grille :')
    txt2 = Label(fen1, text ='Numéro :')
    entr1 = Entry(fen1)
    entr2 = Entry(fen1)
     
    contenu1 = entr1.get()
    contenu2 = entr2.get()
     
    can1 = Canvas(fen1, width =160, height =160, bg ='white')
     
    txt1.grid(row =1, sticky =E)
    txt2.grid(row =2, sticky =E)
    entr1.grid(row =1, column =2)
    entr2.grid(row =2, column =2) 
     
    bou1 = Button(fen1, text='Effacer', command = fonction1)
    bou1.grid(row =3, sticky =E,column =2)
     
    bou2 = Button(fen1, text='Quitter', command = fen1.destroy)
    bou2.grid(row =3, sticky =E)
     
    bou3= Button(fen1, text='OK', command=lambda: fonction2(contenu1))
    bou3.grid(row =1,column=3)
     
    bou4= Button(fen1, text='OK', command=lambda: fonction3(contenu2))
    bou4.grid(row =2,column=3)
     
    fen1.mainloop()
    Nom : 2ae41523fae7db109639c4c05637f5ec.png
Affichages : 412
Taille : 60,3 Ko

  12. #12
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Citation Envoyé par Attirail Voir le message
    Or, Contenu1 et Contenu2 restent vide dans l'explorateur de variable et n'apparaissent pas lorsque j'active la fonction (OK)
    Une variable Python est créé lorsqu'on lui assigne un objet et ne sera mise à jour que lorsqu'on lui en assigne un autre. Si vous ne maîtrisez pas encore ces bases là, vous allez galérer en essayant de programmer une interface graphique comme tkinter.
    A part vous recommander d'ouvrir un tuto. et de passer du temps à apprendre/réviser les bases, je ne peux pas grand chose pour vous: désolé.

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

  13. #13
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2018
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2018
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Merci,
    j'ai donc déplacé quelques lignes pour que cela fonctionne correctement.
    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    def fonction1():
        print('fonction1')
     
    def fonction2(arg):
        contenu1 = entr1.get()
        print('fonction2',contenu1)
        entr1.delete (0, len(contenu1))  
     
    def fonction3(args):
        contenu2 = entr2.get()
        print('fonction3',contenu2)
        entr2.delete (0, len(contenu2))
     
    from tkinter import *
     
    fen1 = Tk()
    fen1.title("Titre de ma fenetre")
    txt1 = Label(fen1, text ='Grille :')
    txt2 = Label(fen1, text ='Numéro :')
    entr1 = Entry(fen1)
    entr2 = Entry(fen1)
     
     
    can1 = Canvas(fen1, width =160, height =160, bg ='white')
     
    txt1.grid(row =1, sticky =E)
    txt2.grid(row =2, sticky =E)
    entr1.grid(row =1, column =2)
    entr2.grid(row =2, column =2) 
     
    bou1 = Button(fen1, text='Effacer', command = fonction1)
    bou1.grid(row =3, sticky =E,column =2)
     
    bou2 = Button(fen1, text='Quitter', command = fen1.destroy)
    bou2.grid(row =3, sticky =E)
     
    bou3= Button(fen1, text='OK', command=lambda: fonction2(contenu1))
    bou3.grid(row =1,column=3)
     
    bou4= Button(fen1, text='OK', command=lambda: fonction3(contenu2))
    bou4.grid(row =2,column=3)
     
    fen1.mainloop()
    Je cherche donc maintenant à faire le retour de la console dans une zone en bas de cette fenêtre. (pour avoir les print principalement)
    Nom : 4a6f6f97a74207ec8be1b89493446c6d.png
Affichages : 407
Taille : 22,9 Ko

  14. #14
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Citation Envoyé par Attirail Voir le message
    Je cherche donc maintenant à faire le retour de la console dans une zone en bas de cette fenêtre. (pour avoir les print principalement)
    Vous ouvrez une documentation tkinter et vous regardez dans les différents widgets celui ou ceux qui sont les plus appropriés pour faire çà.
    N'oubliez pas de fermer cette discussion car le soucis initial a été largement résolu.

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

  15. #15
    Membre actif
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2018
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Mai 2018
    Messages : 73
    Points : 228
    Points
    228
    Par défaut
    Oui alors juste un truc, "pas besoin de POO", si on a plus d'un champ avec Tkinter, si…*Si on n'organise pas son code en composants héritant de Frame avec les méthodes de communication qui vont bien, ça va vite être compliqué (surtout quand je vois l'objectif…).

  16. #16
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 824
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 824
    Points : 7 120
    Points
    7 120
    Par défaut
    Ma réponse était liée à votre 1er post, entre temps vous faîtes des modifications quand à la problématique, il ne faut pas s'étonner que cette réponse n'est peut-être plus d'actualité.

    Cependant le code reste simple, et donc je sais pas ce que vous appelez POO, mais en ce qui me concerne à l'heure actuelle, votre code peut être appliqué sans ! Si on ne connaît pas votre objectif final, difficile de donner un avis sur "est-ce que je dois utiliser la POO ?".
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

Discussions similaires

  1. [LablGtk2] Interface POO ou interface procédurale ?
    Par SpiceGuid dans le forum Caml
    Réponses: 7
    Dernier message: 25/08/2008, 00h04
  2. [POO] cherche tuto simple sur les classes php
    Par single dans le forum Langage
    Réponses: 4
    Dernier message: 29/04/2008, 01h07
  3. Une interface simple en Swing
    Par gloubi dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 15/03/2008, 14h58
  4. Interface simple
    Par Pico10 dans le forum Windows
    Réponses: 4
    Dernier message: 22/12/2005, 11h38
  5. [Language][POO]classe interface
    Par Samanta dans le forum Langage
    Réponses: 9
    Dernier message: 21/06/2005, 15h32

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