2015-03-29 5 views
1

Как сохранить ссылку на сигнал тревоги, который был возвращен, когда был установлен будильник, а затем отменить будильник? Мне нужна функция остановки, чтобы пользователь мог завершить программу.Написание функции для завершения программы?

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

ответ

1

Вы должны захватить выход alarm(), который является «идентификатор тревоги», который затем можно перейти на alarm_cancel(), т.е. alarm_cancel(<alarm_identifier>). (Примечание: синтаксис alarm_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 внутри класса Alarm, устраняя необходимость в global - но это не обязательно, чтобы исправить вашу проблему.

1

Вы можете поставить стоп флаг, чтобы указать, когда нужно остановиться и что делать после цикла остановки:

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) 
Смежные вопросы