0

我在 python 中有一个使用 Tkinter 的循环函数,当我使用 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

4 回答 4

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)
于 2013-04-01T15:21:57.093 回答
0

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

import signal 
import sys
import subprocess

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

还有这个解决方案,它在 ESC 上退出(您只需将 27 更改为另一个键的编号即可更改):

import msvcrt

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

我希望这会有所帮助。

于 2013-04-01T04:46:43.423 回答
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)
于 2013-04-01T10:45:59.303 回答
-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()
于 2013-04-01T07:05:18.650 回答