Tkinter

Bonjour,
je commence juste à utiliser Tkinter et j'aimerais savoir pourquoi dans mon petit programme la boule ne se déplace pas à droite ?

from tkinter import * 

PosX1 = 70
PosY1 = 70

def start():
  global PosX1
  PosX1 += 1

fenetre = Tk()

canvas = Canvas(fenetre, width=700, height=500, background='white')
ligne1 = canvas.create_line(30, 30, 30, 470)
ligne2_1 = canvas.create_line(30, 30, 320, 30)
ligne2_2 = canvas.create_line(380, 30, 670, 30)
ligne3 = canvas.create_line(670, 30, 670, 470)
ligne4 = canvas.create_line(30, 470, 670, 470)

boule1 = canvas.create_oval(PosX1, PosY1, PosX1+20, PosY1+20, fill='black')

canvas.pack()

start()

fenetre.mainloop()

7 réponses

  1. Pas du tout, tu crée une boule à x70 y70 et ensuite tu modifie PosX1, mais ça n'agit pas sur la boule déjà créée

    mainloop() est la boucle qui attend les évènements de la fenêtre, c'est ce qui fait que le programme ne s'arrête pas après l'instruction start() et que la fenêtre reste affichée,
    au contraire d'un programme qui s'exécuterai en mode console, par exemple, et dont on sort après la dernière instruction

    cette boucle attend des évènements comme un clic sur un bouton, ou un clic sur quelque chose sur le Canvas, ou que l'on entre une valeur dans une Entry box, ou que l'on ferme la fenêtre, etc ...

    Google est ton ami, à toi de trouver comment déplacer la boule .... :-)

    (il y a une méthode pour modifier les coordonnées d'un objet)
    1. En faite je pense, mais c'est surement pas comme ca qu'il faut faire, que le 'start' incremente indefiniment la valeur de PosX1 et donc que ca déplace progressivement la boule.
      from tkinter import * 
      
      PosX1 = 70
      PosY1 = 70
      
      def start():
        global PosX1
        PosX1 += 1
      
      fenetre = Tk()
      
      canvas = Canvas(fenetre, width=700, height=500, background='white')
      ligne1 = canvas.create_line(30, 30, 30, 470)
      ligne2_1 = canvas.create_line(30, 30, 320, 30)
      ligne2_2 = canvas.create_line(380, 30, 670, 30)
      ligne3 = canvas.create_line(670, 30, 670, 470)
      ligne4 = canvas.create_line(30, 470, 670, 470)
      
      boule1 = canvas.create_oval(PosX1, PosY1, PosX1+20, PosY1+20, fill='black')
      
      canvas.pack()
      
      start()
      
      fenetre.mainloop()
      1. Contributeur
        est-ce ton premier exercice en python?
        ajoute un print() dans start(), pour comprendre ce qui se passe.
        commence peut-être par des exercices plus simples, sans tkinter, pour comprendre comment se comporte un programme que tu écris.
    2. Bonjour,

      Effectivement, tu débute vraiment en programmation (tkinter ou pas)

      Dans ton code, tu défini une fenêtre, tu y crée un Canvas pour pouvoir y dessiner des lignes et un cercle rempli en noir

      Ensuite tu appelles une fonction start() qui incrémente la valeur de PosX1

      Et c'est tout !

      Ce n'est pas de la magie: le fait de changer cette variable ne va pas déplacer le cercle
      Comme le dit yg_be: "je ne vois rien dans ton programme qui "déplace" la boule."
      1. Oui mais la boule dans la fenetre est créer en fonction de la variable PosX1 le fait d'incrémenter cette variable ne devrait pas créer a chaque fois une nouvelle boule légère décalé et donner l'impression qu'elle se déplace ?
        L'instruction fenetre.mainloop() ne permet-elle pas de remonter a la ligne fenetre = Tk() ?
        1. D'accord, le problème venait du fait que je pensais que mainloop permettait d'exécuter de nouveau toutes les lignes de code. Je vais me renseigner pour trouver.
          Merci beaucoup
          1. OK, mais réfléchis quand même à ce qui se passe:

            même en rejouant une fois tout le code, on redessinerait une 2eme boule noire 1 pixel plus loin

            en X sans effacer la 1ere ...

            On se retrouverait donc avec 2 boules mais pas de mouvement