2014-09-06 5 views
2

Le code joint dessine aléatoirement des carrés sur le canevas en utilisant la méthode "after". Je m'attendais à arrêter le dessin quand j'ai cliqué sur le bouton de la souris en utilisant la méthode "after_cancel", bu continue à dessiner ..Tkinter after_cancel en python

Voici le code.

#! /usr/bin/env python 
from Tkinter import * 
import time 
import random 


tk = Tk() 
canvas = Canvas(tk, width=1920, height=1080, background="grey") 
canvas.pack() 

def xy(event): 
    xm, ym = event.x, event.y 

def task(): 
    w=random.randint(1,1000) 
    h=random.randint(1,1000) 
    canvas.create_rectangle(w,h,w+150,h+150) 
    def callback(event): 
     if True: 
      print("clicked2")  
      tk.after_cancel(task) 
    canvas.bind("<Button-1>",callback)   
    tk.after(1000,task)   
tk.after(1000,task) 

tk.mainloop() 

Répondre

3

Bon, vous étiez près de la faire fonctionner, ce que vous devez faire est de mettre tk.after(...) à une variable, et non la fonction récurrente que vous voulez arrêter, lorsque vous voulez utiliser after_cancel(...), vous appelez cette variable et il arrêtera toutes les méthodes après avec ce nom

source: How do I stop tkinter after function?

Cela fera:

from Tkinter import * 
import time 
import random 


tk = Tk() 
canvas = Canvas(tk, width=1920, height=1080, background="grey") 
canvas.pack() 

def xy(event): 
    xm, ym = event.x, event.y 

def task(): 
    w=random.randint(1,1000) 
    h=random.randint(1,1000) 
    canvas.create_rectangle(w,h,w+150,h+150) 
    def callback(event): 
     if True: 
      print("clicked2") 
      # 'solve' is used here to stop the after... methods. 
      tk.after_cancel(solve) 
    canvas.bind("<Button-1>",callback)   
    solve = tk.after(1000,task) 
# above and below tk.after is set to 'solve' a variable.   
solve = tk.after(1000,task) 

tk.mainloop() 

Cela arrêtera les méthodes after et laissera une fenêtre tk en cours d'exécution.

Une autre solution serait d'utiliser tk.destroy() ou tk.quit() ou sys.exit() ou similaire dans la fonction de rappel ... Ceux-ci tueront la fenêtre tk bien.

Je pense que cela répond à la question, si ce n'est simplement dire, applaudit.