2014-09-06 770 views
2

附加的代码使用“after”方法随机在画布上绘制正方形。我希望停止绘图时,我使用“after_cancel”方法单击鼠标按钮,它会继续绘制..Tkinter python中的after_cancel

这是代码。

#! /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() 

回答

3

好了,所以你接近得到它的工作,你需要做的是设置tk.after(...)到一个变量,而不是要停止,那么当你想使用after_cancel(...)重复的功能是什么,你叫该变量,它会后使用该名称的方法停止所有

来源:How do I stop tkinter after function?

这将做到这一点:

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() 

这将停止after方法并让tk窗口运行。

另一个的解决方案,这将是使用tk.destroy(),或tk.quit()sys.exit()或者在回调函数类似......这些虽然会杀TK窗口。

我认为这回答了问题,如果不是只是说,欢呼。