2013-04-01 5 views
0

У меня есть функция looped в python с использованием Tkinter, и когда я нажимаю кнопку с помощью Tkinter, она не заканчивается. Он продолжает новую функцию, которая была указана с помощью кнопки, но она продолжается со старой функции AswellЗавершение функции в Python

Вот код (его часть):

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) 

Так как я заканчиваю этот раз другая кнопка нажата. Есть ли что-то, что завершает текущий процесс?

+1

не Вы можете разместить boolen переменную уровня модуля под названием isRunning? Сделайте это правдой, когда нажата кнопка запуска, и false, когда нажата кнопка остановки. Внутри этой функции countdown() вам нужно будет проверить, что эта переменная является истиной, чтобы продолжить .. –

+0

Да, это, вероятно, решит ее – ReallyGoodPie

ответ

0

Если вы в порядке, остановив его с помощью Ctrl + C, существует ряд методов для реализации этого. Я не эксперт по ним, но от быстрого Google поиск она выглядит как-то вдоль линий это может работать:

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 

Я надеюсь, что это поможет.

+0

Спасибо, но я пытался исправить проблему, просто нажав кнопку на приложении, а не клавиатура. Я сожалею, если вы неправильно поняли, но, если честно, это пригодится для будущих программ, так что спасибо :) – ReallyGoodPie

+0

Oh! Очень сожалею об этом, совершенно непонятом. Боюсь, я не смогу вам помочь в этом, у меня нет опыта. Рад слышать, что мой «ответ» был полезен. – Sellyme

-2

Есть ли что-то, что завершает текущий процесс

Чтобы остановить текущую MainLoop и уничтожить все виджеты; Вы могли бы назвать 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() 
+0

код делает то, что он говорит; Я был бы признателен за объяснение нисходящего потока. – jfs

+0

OP запрашивает способ прекратить вызов функции обратного вызова 'after', а не как выйти из mainloop. Извините, если вы не согласны с нижним планом, но 'destroy' не имеет ничего общего с запланированными функциями. –

+0

спасибо, что посмотрели. Я вижу вашу мысль. Я интерпретировал этот вопрос (это кажется неверным), поскольку OP хочет завершить работу GUI, следовательно, «root.destroy()» вместо того, чтобы отменить цепочку обратного вызова с помощью .after_cancel() '(более подходящей в этом случае). Кстати, я не против downvotes, если причина ясна (это полезная обратная связь). – jfs

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