python中的Tkinter after_cancel

use*_*258 7 python canvas tkinter

附加的代码使用“after”方法在画布上随机绘制正方形。当我使用“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()   
Run Code Online (Sandbox Code Playgroud)

W1l*_*mvl 10

好吧,所以你快要让它工作了,你需要做的是设置tk.after(...)一个变量,而不是你想要停止的重复函数,然后当你想使用时after_cancel(...),你调用那个变量,它会在方法之后停止用那个名字

来源:如何在功能后停止 tkinter?

这将做到:

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() 
Run Code Online (Sandbox Code Playgroud)

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

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

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