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

Python Discussion :

[Python3] Widget RadioButton


Sujet :

Python

  1. #1
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2012
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2012
    Messages : 12
    Par défaut [Python3] Widget RadioButton
    Bonsoir à tous,
    J'essai de concevoir un petit programme en objet me permettant de dessiner dans un canevas deux formes géométriques, et je viens vous voir pour un problème que je n'arrive pas à résoudre depuis un certain temps. Je souhaiterai choisir la formes à dessiner en cochant l'un ou l'autre des boutons radios: ligne ou oval.

    Sans vous mentir j'ai vraiment l'impression d'avoir tout essayé depuis quelques jour c'est pour ça que la je ne comprend plus rien à rien.. je sais qu'une partie de mon problème vient du fait que les binds sont lancés en priorité (voila pourquoi on peut "dessiner" directement au lancement l'une ou l'autre des formes géométrique). Seulement moi j'aimerai que le choix du dessin se fasse par les boutons radios, et la c'est sans succès. A priori cela viendrai, d’après l’interpréteur, de ma variable 'last'.
    Quelqu'un peut-il m'aider sur ce coup? Merci beaucoup

    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
    44
    45
    46
    47
    48
    49
    50
    51
     
    from tkinter import * 
     
    class dessin(Frame):
        def __init__(self,parent=None):
            Frame.__init__(self,parent)
            self.pack(expand=YES, fill=BOTH)
            self.var = IntVar()
     
            self.fen = Frame(self, width=305, height=520, bd=1)
            self.fen.pack(expand=YES, fill=BOTH)
     
            self.fen1 = Frame(self.fen, bd=1, relief=SOLID)
            self.fen1.pack(side=TOP, expand=YES, fill=X, pady=5, padx=5)
     
            self.fen2 = Frame(self.fen, bd=1, relief=SOLID)
            self.fen2.pack(side=TOP, expand=YES, fill=X, pady=5, padx=5)
     
            self.can = Canvas(self.fen1, bg='white', width=300, height=250,
                            relief=SOLID)        
            self.can.pack(side=TOP, expand=YES, fill=BOTH)
     
            self.can.bind("<Button-1>", self.clic)
            self.can.bind("<ButtonRelease-1>", self.ligne)
    ##        self.can.bind("<ButtonRelease>", self.oval)
     
            self.but1 = Radiobutton(self.fen2, text='Ligne', variable=self.var,
                                      value=1, command=self.ligne)
            self.but1.pack(side=LEFT, fill=BOTH, expand=YES, padx=5, pady=5)
     
            self.but2 = Radiobutton(self.fen2, text='Oval', variable=self.var,
                                      value=2, command=self.oval)
            self.but2.pack(side=LEFT, fill=BOTH, expand=YES, padx=5, pady=5)
     
        def clic(self,last):
            self.x, self.y = last.x, last.y
     
        def ligne(self,last):
            """fonction gérant le tracé d'une courbe"""
            self.can.create_line(self.x, self.y, last.x, last.y)
            self.x, self.y = last.x, last.y
     
        def oval(self,last):
            """fonction gérant le tracé d'un cercle"""
            self.can.create_oval(self.x, self.y, last.x, last.y)
            self.x, self.y = last.x, last.y
     
    parent = Tk()
    parent.title('dessin')        
    if __name__ == '__main__':
        dessin().mainloop()

  2. #2
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2012
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2012
    Messages : 12
    Par défaut
    PS: Voici l'erreur générée lors du clic sur un bouton radio:
    TypeError: ligne() missing 1 required positional argument: 'last'
    Merci

  3. #3
    Expert confirmé

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 306
    Par défaut
    Salut,

    Tes fonctions line et oval requièrent un argument "last".

    Je suppose qu'il s'agit des coordonnées du dernier clic dans le canvas mais lors de ce clic tu prend référence de ces coordonnées avec self.x, self.y.

    Et on ne voit nulle part dans ton code la saisie d'un second point de coordonnées pourtant nécessaire pour définir une ligne ou un cercle.

    J'ignore bien sur le but de ton code, mais vu comme ça, j'attendrais qu'une case soit cochée pour prendre en compte les clics dans le canvas, (après tout, dans un logiciel de dessin, on choisit d'abord l'outil avant de tracer) ensuite un premier clic validerait un premier tuple de coordonnées, un nouveau clic sera alors considéré comme deuxième point du fait de la validité du premier.

    En pseudo-code:

    coord_1 = None
    coord_2 = None
    fonction clic(last)
    ---- si aucun outil choisit -> return
    ---- si coord_1 est None alors coord_1 = last
    ---- sinon coord_2 = last et appel de line() ou oval() et remise à None de coord_1

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 714
    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 714
    Par défaut
    Salut,

    Techniquement, le callback définit avec bind reçoit l'objet event en paramètre dans lequel vous récupérez la position x, y.
    Avec "command" le callback ne reçoit aucun paramètre et donc:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TypeError: ligne() missing 1 required positional argument: 'last'
    Ceci dit, je ne vois pas trop ce qu'on pourrait lui passer en paramètre: pour tracer un cercle ou un ovale, il faudra bien avoir stocke quelque part les positions des différents points "avant"...

    Dit autrement, pour appeler un callback via bind ou command, Python permet de déclarer le paramètre "optionnel":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    def ligne(self, event=None)
    Mais il va falloir récupérer la position (last) ailleurs....

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

  5. #5
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2012
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2012
    Messages : 12
    Par défaut
    Merci beaucoup pour vos réponses.

    Je tiens à rajouter que le programme en vue n'est qu'une petite partie de mon travail, se faisant dans le cadre de mes études, mais cela suffit. L'objectif de mon programme est le suivant: au lancement du programme tant qu'aucune coche n'est effectuée sur les boutons radios, un clic sur le canevas n'est pas pris en compte. Sinon le choix du dessin se fera suivant le bouton coché. Auquel cas un premier clic dans le canevas constituera le premier tuple de coordonné, et le relâchement de celui-ci constituera le deuxième.

    Je pense visualiser pourquoi mon programme ne réagit pas à ma convenance. Les bind sont dans le __init_, le programme va renvoyer la fonction clic au premier clic effectué (le premier tuple est ok). Puis au relâchement de ce dernier la fonction ligne est renvoyée. Là on voit bien qu'il n'y a pas de problème avec ma variable last et ma ligne se dessine parfaitement. Moi je cherche à passer par les boutons radios, cocher l'un d'eux avant tout. Mais ces derniers, lors de l'activation, renvoie directement vers les fonctions ligne() ou oval(), et donc n'ont pas accès au prier bind permettant de prendre en considération le premier clic renvoyant à la fonction clic().

    Cependant j'ai tout essayé, et je pense que la solution je les déjà trouvé mais une erreur a due se glisser pour que là non plus ça ne marche pas. J'ai par exemple pensé à commander mes radios par une seule et même fonction stipulant que si self.var == 1: on retourne self.ligne(), sinon self.oval(). Mais de cette manière cela me pose un problème avec le cycle du programme, donc les bind, et la même erreurs m'est trouvé.

  6. #6
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 714
    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 714
    Par défaut
    Salut,
    Moi je cherche à passer par les boutons radios, cocher l'un d'eux avant tout. Mais ces derniers, lors de l'activation, renvoie directement vers les fonctions ligne() ou oval(), et donc n'ont pas accès à la fonction clic() avant permettant de définir last.
    Votre programme ne traduit pas ces "intentions" la.
    Programmez est une forme d'écriture. Vous avez commence par apprendre a écrire des lettres et des mots avant de pouvoir exprimer des idées facilement et de façon lisible sur une feuille de papier.

    L'objectif de mon programme est le suivant: au lancement du programme tant qu'aucune coche n'est effectuée sur les boutons radios, un clic sur le canevas n'est pas pris en compte.
    Comment avez vous écrit la condition "tant qu'aucune coche n'est effectuée"? Si elle existait, réaliser "un clic sur le canevas n'est pas pris en compte" se réduirait a tester cette condition dans les callbacks...

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

  7. #7
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2012
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2012
    Messages : 12
    Par défaut
    Je sais bien mais ça fait des jours que je tourne en rond. J'ai testé de nombreux algorithmes différents, voulant traduire ce que j'ai expliqué dans mon post précédent, mais rien à fonctionné, on en revient toujours à la même erreur ou un dysfonctionnement total du programme. Son état actuel est le seul à fonctionner d'une certaine manière, même si c'est pas ce que j'attend. Ce que je ne comprend pas c'est que à cet instant je peux directement dessiner mon trait, donc aucun problème de last, je cherche juste à devoir cocher avant de dessiner. Vu comme ça cela peut paraître très simple, mais ça fait des jours que je cherche et impossible. Et surtout mon projet est loin d'être à son terme, je dois le finir pour mi-decembre, et là ca fait une semaine que je suis sur ces boutons radios et j'ai vraiment l'impression de perdre un temps très précieux surtout pour quelque chose qui à priori ne devrai pas me poser problème. Je vous assure avoir tout essayé en terme algorithmique, maintenant je pense que j'ai due faire des erreurs en terme de syntaxe dans mes tests. Je ne sais plus quoi faire.

  8. #8
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 714
    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 714
    Par défaut
    Salut,
    Un code "light" qui le fait.
    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
    import tkinter as tk
     
    last_xy = None    
     
    def on_click(event):
        if choices.get() == 0:
            return
        global last_xy
        last_xy = event.x, event.y
     
    def on_draw(event):
        choice = choices.get()
        if choice == 0:
            return
     
        x0, y0 = last_xy
        x1, y1 = event.x, event.y
        w = event.widget
        if choice == 1:
            w.create_oval(x0, y0, x1, y1)
        elif choice == 2:
            w.create_line(x0, y0, x1, y1)
     
     
     
    if __name__ == '__main__':
        app = tk.Tk()
     
        frame = tk.Frame()
        choices = tk.IntVar(value=0)
        btn = tk.Radiobutton(frame, text="cercle", variable=variable, value=1)
        btn.pack()
        btn = tk.Radiobutton(frame, text="ligne", variable=variable, value=2)
        btn.pack()
        frame.pack(side='left')
     
        canvas = tk.Canvas(bg='white')
        canvas.bind('<Button-1>', on_click)
        canvas.bind('<ButtonRelease-1>', on_draw)
        canvas.pack(side='right')
     
        app.mainloop()
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  9. #9
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2012
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2012
    Messages : 12
    Par défaut
    C'est exactement l'algorithme que j'ai en tête. J'ai déjà essayé de le réaliser mais sans succès. Je vais réessayer. Merci beaucoup pour l'attention que vous portez à mes interrogations en tout cas.

  10. #10
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 714
    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 714
    Par défaut
    Citation Envoyé par epok33 Voir le message
    C'est exactement l'algorithme que j'ai en tête. J'ai déjà essayé de le réaliser mais sans succès. Je vais réessayer
    Cela pourra sembler surprenant mais "coder" est un d'abord un exercice de lecture.
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

Discussions similaires

  1. Réponses: 2
    Dernier message: 01/07/2004, 11h05
  2. Radiobutton
    Par raf_gug dans le forum MFC
    Réponses: 3
    Dernier message: 08/04/2004, 09h46
  3. [JSP]RadioButton
    Par orisis dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 02/04/2004, 12h45
  4. RadioButton
    Par Angeva dans le forum C++Builder
    Réponses: 3
    Dernier message: 06/02/2004, 11h21
  5. [SWT]Eclipse Java : swt.widgets.Table
    Par watson dans le forum SWT/JFace
    Réponses: 3
    Dernier message: 01/10/2003, 09h07

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