Python 写一个函数来结束程序?

Python 写一个函数来结束程序?,python,tkinter,Python,Tkinter,如何保存设置报警时返回的报警参考,然后取消报警?我需要一个停止功能,以便用户可以结束程序 p = ' IDKMYBFFJILL!' k = 0 def new_char(): global k label.config(text=p[k]) k = (k+1)%len(p) window.after(500,new_char) def end(): window.after.cancel(new_char) from Tkinter import *

如何保存设置报警时返回的报警参考,然后取消报警?我需要一个停止功能,以便用户可以结束程序

p = ' IDKMYBFFJILL!'
k = 0

def new_char():
    global k
    label.config(text=p[k])
    k = (k+1)%len(p)
    window.after(500,new_char)

def end():
    window.after.cancel(new_char)

from Tkinter import *

window=Tk()
window.title('New char program')

label = Label(window,text='',width=2,font=('Times New Roman',200))
label.grid()

begin_button = Button(window,text='begin',command=new_char)
begin_button.grid(row=1,column=1,sticky='EW')

end_button = Button(window,text='end',command=end)
end_button.grid(row=1,column=2,sticky='EW')

window.mainloop()

您必须捕获的输出,这是一个“报警标识符”,然后可以传递给,即
报警\u取消()
。(注意:语法是带有下划线的
alarm\u cancel()
,而不是像您尝试的那样
alarm.cancel()

一种方法是将报警函数封装在一个类中,我称之为
alarm

from Tkinter import *

p = ' IDKMYBFFJILL!'
k = 0

# Create Alarm class
class Alarm(object):
    def __init__(self):
        self.alarm_id = None

    def new_char(self):
        global k
        label.config(text=p[k])
        k = (k+1)%len(p)
        self.alarm_id = window.after(500,self.new_char)

    def end(self):
        window.after_cancel(self.alarm_id)

# Create Alarm instance (called alarm)
alarm = Alarm()

window=Tk()
window.title('New char program')

label = Label(window,text='',width=2,font=('Times New Roman',200))
label.grid()

begin_button = Button(window,text='begin',command=alarm.new_char)  # Note change
begin_button.grid(row=1,column=1,sticky='EW')

end_button = Button(window,text='end',command=alarm.end)           # Note change
end_button.grid(row=1,column=2,sticky='EW')

window.mainloop()

您可以进一步在报警类中移动
p
k
,从而消除对
global
的需要,但无需解决您的问题。

您可以设置停止标志,以指示何时停止以及循环停止后要执行的操作:

from Tkinter import *


p = ' IDKMYBFFJILL!'
k = 0

stop_loop = False # the stop flag set when cancel is pressed

def new_char():
    global k

    if stop_loop: # execute this when you press cancel
        print("K value when cancel was stopped: ", k)
        return

    label.config(text=p[k])
    k = (k+1)%len(p)
    window.after(500,new_char)

def end():
    global stop_loop
    stop_loop = True # set the flag that you want to stop (done when pressed cancel button)