为了账号安全,请及时绑定邮箱和手机立即绑定

如何在 python tkinter 中的函数后停止此操作

如何在 python tkinter 中的函数后停止此操作

慕慕森 2022-05-19 18:34:15
我正在尝试制作一个秒表程序,每当我按下按钮运行它时,函数 def watch() 都会继续执行,我无法在需要时停止它。有什么方法可以在按下按钮后停止执行 def watch() 函数?感谢您...from tkinter import *root = Tk()tog = 0hour = 0mins = 0sec = 0def toggle():    global tog    tog = tog + 1    if tog == 1:        watch()    elif tog == 2:        stop()        tog = 0def stop():    donothing = 0def watch():    global sec    global hour    global mins    sec = sec + 1    l1.config(text=sec)    l1.after(1000,watch)    l1 = Label(root)    l1.pack()Button(root,text="Start",command= lambda: toggle()).pack()root.mainloop()
查看完整描述

2 回答

?
牛魔王的故事

TA贡献1830条经验 获得超3个赞

您应该保留对调用的引用,并在isafter时取消回调。您可以通过使用可以读取或设置其值的对象的变量来避免丑陋的声明。toggleFalseglobaltkinter


import tkinter as tk



def toggle_on_off():

    toggle.set(not toggle.get())

    if toggle.get():

        watch()


def watch():

    count_seconds.set(count_seconds.get() + 1)

    if toggle.get():

        _callback_id.set(root.after(1000, watch))

    else:

        root.after_cancel(_callback_id.get())

        

root = tk.Tk()


count_seconds = tk.IntVar(root)

count_seconds.set(0)

toggle = tk.BooleanVar(root)

toggle.set(False)


Button(root,text="Start",command=toggle_on_off).pack()

label = tk.Label(root, textvariable=count_seconds)

label.pack()


_callback_id = tk.StringVar(root)

_callback_id.set(None)


root.mainloop()

[编辑]


与全局变量相同的代码是这样的:

import tkinter as tk



def toggle_on_off():

    global toggle

    toggle = not toggle

    if toggle:

        watch()


def watch():

    global count_seconds, _callback_id

    count_seconds += 1

    label.configure(text=str(count_seconds))

    if toggle:

        _callback_id = root.after(1000, watch)

    else:

        root.after_cancel(_callback_id)

        

root = tk.Tk()


count_seconds = 0

toggle = False


Button(root,text="Start",command=toggle_on_off).pack()

label = tk.Label(root, text=str(count_seconds))

label.pack()


_callback_id = None


root.mainloop()


查看完整回答
反对 回复 2022-05-19
?
天涯尽头无女友

TA贡献1831条经验 获得超9个赞

您可以添加一个全局变量,例如“exit”,


并在 l1.after(1000,watch) 之前添加 if 语句


def toggle():

    global tog, exit

    exit = False

    tog = tog + 1


    if tog == 1:

        watch()

    elif tog == 2:

        stop()

        tog = 0



def watch():

    global sec

    global hour

    global mins

    global exit


    sec = sec + 1

    l1.config(text=sec)

    if not exit:

        l1.after(1000,watch)

在 stop() 中,你可以写


def stop():

    global exit

    exit = True


查看完整回答
反对 回复 2022-05-19
  • 2 回答
  • 0 关注
  • 280 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信