在Python中结束函数

时间:2013-04-01 04:31:09

标签: python function python-2.7 tkinter

我在使用Tkinter的python中有一个循环函数,当我使用Tkinter按下按钮时它不会结束。它继续执行按钮指定的新功能,但它继续使用旧功能

这是代码(部分内容):

def countdown(self):

        if self.seconds <= 0:
            if self.minutes > 0:
                self.seconds += 59
                self.minutes -= 1
            elif self.minutes == 0:
                if self.hours != 0:
                    self.minutes += 59
                    self.seconds += 59
                    self.hours -= 1
                else:
                    self.timerLab.configure(text="Times Up!")

        self.timerLab.configure(text="Time Remaining: %d:%d:%d " % (self.hours,self.minutes,self.seconds))
        self.seconds -= 1
        self.after(1000, self.countdown)

那么一旦按下另一个按钮,我该如何结束这个。是否存在结束当前流程的事情?

4 个答案:

答案 0 :(得分:1)

Tkinter使用after_cancel()方法解决了这个问题。您必须存储after返回的“后标识符”并将其传递给after_cancel

def start_countdown(self):
    if self.after_id is not None:
        self.after_cancel(self.after_id)
    self.countdown()

def countdown(self):
    # ...
    self.after_id = self.after(1000, self.countdown)

答案 1 :(得分:0)

如果您可以通过Ctrl + C停止它,可以使用许多方法来实现它。我不是他们的专家,但是通过谷歌的快速搜索,看起来像这样的东西可以起作用:

import signal 
import sys
import subprocess

def signal_handler(signal, frame):
    print 'You pressed Ctrl+C!'
    sys.exit(0)

还有this解决方案,它在ESC上退出(你只需将27改为另一个密钥的数量来改变它):

import msvcrt

while 1:
    print 'Testing..'
    # body of the loop ...
    if msvcrt.kbhit():
    if ord(msvcrt.getch()) == 27:
        break

我希望有所帮助。

答案 2 :(得分:0)

有一个设置变量的按钮。让您的倒计时功能检查该变量,并且只有在变量设置为特定值时才重新安排自己。

这样的事情:

def __init__(self):
    ...
    self.running = False

    start_button = Button(..., self.start, ...)
    quit_button = Button(..., self.stop, ...)

def start(self):
    self.running = True;
    self.countdown()

def stop(self):
    self.running = False;

def countdown(self):
    ...
    if (self.running):
        self.after(1000, self.countdown)

答案 3 :(得分:-2)

  

是否存在结束当前流程的事情

停止当前的主循环并销毁所有小部件;你可以致电root.destroy()

#!/usr/bin/env python
import sys
from Tkinter import Tk, Button

def counter(root, n=0):
    sys.stderr.write("\r%3s" % n)
    root.after(1000, counter, root, n + 1)

root = Tk()
Button(root, text="Quit", command=root.destroy).pack()
counter(root)
root.mainloop()