Как мне остановить tkinter после функции? - PullRequest
7 голосов
/ 19 марта 2012

У меня проблема с остановкой «подачи»; аргумент отмены, похоже, не влияет на метод after. Хотя «подача остановлена» выводится на консоль.

Я пытаюсь получить одну кнопку, которая будет запускать подачу, и другую, которая остановит подачу.

from Tkinter import Tk, Button
import random

    def goodbye_world():
        print "Stopping Feed"
        button.configure(text = "Start Feed", command=hello_world)
        print_sleep(True)

    def hello_world():
        print "Starting Feed"
        button.configure(text = "Stop Feed", command=goodbye_world)
        print_sleep()

    def print_sleep(cancel=False):
        if cancel==False:
            foo = random.randint(4000,7500)
            print "Sleeping", foo
            root.after(foo,print_sleep)
        else:
            print "Feed Stopped"


    root = Tk()
    button = Button(root, text="Start Feed", command=hello_world)

    button.pack()


    root.mainloop()

С выходом:

Starting Feed
Sleeping 4195
Sleeping 4634
Sleeping 6591
Sleeping 7074
Stopping Feed
Sleeping 4908
Feed Stopped
Sleeping 6892
Sleeping 5605

Ответы [ 2 ]

19 голосов
/ 20 марта 2012

Проблема в том, что даже если вы звоните print_sleep с True, чтобы остановить цикл, уже есть ожидающая работа, ожидающая запуска.Нажатие кнопки «Стоп» не вызовет запуска нового задания, но старое задание все еще там, и когда оно вызывает само себя, оно переходит в False, что приводит к продолжению цикла.

Вам необходимо отменить ожидающее выполнениеработа, чтобы она не запускалась.Например:

def cancel():
    if self._job is not None:
        root.after_cancel(self._job)
        self._job = None

def goodbye_world():
    print "Stopping Feed"
    cancel()
    button.configure(text = "Start Feed", command=hello_world)

def hello_world():
    print "Starting Feed"
    button.configure(text = "Stop Feed", command=goodbye_world)
    print_sleep()

def print_sleep():
    foo = random.randint(4000,7500)
    print "Sleeping", foo
    self._job = root.after(foo,print_sleep)

Примечание: убедитесь, что вы инициализируете self._job где-нибудь, например, в конструкторе вашего объекта приложения.

17 голосов
/ 19 марта 2012

Когда вы позвоните root.after(...), он вернет идентификатор.Вы должны отслеживать этот идентификатор (например, сохранить его в переменной экземпляра), а затем вы можете позже вызвать root.after_cancel(after_id), чтобы отменить его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...