Python 在tkinter中的函数内调用函数

Python 在tkinter中的函数内调用函数,python,tkinter,Python,Tkinter,从按钮调用rest函数时,调用start函数并每秒继续打印值,但当我再次调用rest函数时,再次调用start函数,但这次以2x速度启动函数打印值,以此类推 但我不想以2倍的速度打印值。我正在做一个小项目,在那里我面临这种类型的问题,所以这就是为什么我写这个小代码。请解决我的问题 import tkinter as tk window = tk.Tk() window.geometry('400x400') i = 0 def start(): global i text_

从按钮调用
rest
函数时,调用
start
函数并每秒继续打印值,但当我再次调用
rest
函数时,再次调用
start
函数,但这次以2x速度启动函数打印值,以此类推

但我不想以2倍的速度打印值。我正在做一个小项目,在那里我面临这种类型的问题,所以这就是为什么我写这个小代码。请解决我的问题

import tkinter as tk

window = tk.Tk()
window.geometry('400x400')

i = 0

def start():
    global i
    text_label .config(text=i)
    i += 1
    text_label .after(1000, start)

def rest():
    global i
    i=0
    start()

text_label = tk.Label(window, text="start")
text_label .pack()

tk.Button(window, text="rest", command=rest).pack()

window.mainloop()

发生的情况是,每次调用
reset
,都会启动一个新的
回调
,它将无限期地每隔100毫秒调用
start
。每个回调都是独立的,并且不知道其他回调,这会导致一系列回调,每个回调都在自己的时间内,每100毫秒调用一次
start

为了避免这种“滚雪球”,您需要取消以前的回调以正确重置。您可以通过在
回调
上保留一个引用,并在
重置
中调用
tk.after\u cancel(callback\u id)
来完成此操作

像这样:

import tkinter as tk


def start():
    global i, callback_id
    text_label.config(text=i)
    i += 1
    callback_id = text_label.after(1000, start)


def reset():
    global i, callback_id
    i = 0
    if callback_id is not None:
        text_label.after_cancel(callback_id)
        callback_id = None
    start()


window = tk.Tk()
window.geometry('400x400')

text_label = tk.Label(window, text="start")
text_label.pack()

callback_id, i = None, 0
tk.Button(window, text="reset", command=reset).pack()

window.mainloop()

如果回调id不是None,则为
如果回调id!=无
?呵呵,是,否-在这种情况下,是。查看详细信息。
tk.after
返回一个指向回调的引用(指针),您可以使用
cb\u id=tk.after…
跟踪该回调。然后,使用此引用以
tk.after\u cancel(cb\u id)
取消回调。
tkinter/tcl
内部关于如何实现这一点并不重要,但如果您感兴趣,可以在线查找代码。我想问自己一个重要的问题是:“当按下两次按钮时,我预计会发生什么?”甚至可以按两次按钮,还是在按下按钮后将其禁用?@fhdrsdg为什么要禁用“重置”按钮?那他们怎么复位呢?按钮和功能不是“复位”,而是“休息”。我把它理解为一个用来记录某人或某物休息时间的按钮,但它也可以被理解为一个重置按钮。在这种情况下,我的问题的答案是明确的,但在我阅读它的方式不是。