Как использовать метод tkinter .after () для создания задержки - PullRequest
0 голосов
/ 09 июня 2019

Как правильно использовать .after () из tkinter, чтобы создать задержку между итерациями, не останавливая всю программу, пока все итерации не будут завершены.

Пример проблемы: всего 10 итераций, GUI не будет обновляться до тех пор, пока 10 итераций не будут завершены

Что я хочу: Графический интерфейс для обновления после каждой итерации, при вызове .after ().

Я пробовал код, подобный приведенному ниже, вызывая класс после каждой итерации, но он все еще зависает.

// example of a similar code i tried
import Tkinter as tk
import time

class App():
def __init__(self):
        self.root = tk.Tk()
        self.label = tk.Label(text="")
        self.label.pack()
        self.update_clock()
        self.root.mainloop()

def update_clock(self):
        now = time.strftime("%H:%M:%S")
        self.label.configure(text=now)
        self.root.after(1000, self.update_clock)

app=App()

// example of my current code
self.board = [1,1,1,1,1,1]

def updateBoard(self, seed, move):
    while seed > 0:
        self.board[move] += 1
        seed = seed - 1
        move = move + 1
        // here i call the function to delay the execution for 1s
        self.createDelay()
        self.displayBoard()

p.s. Я пробовал time.sleep (), он тоже зависает.

1 Ответ

1 голос
/ 09 июня 2019

Приложение с часами, которое вы разместили, работает нормально, вы можете делать все так же. (По сути, я избавился от цикла while, который замораживает ваше приложение во время его выполнения)

def updateBoard(self, seed, move):
    if seed <= 0:
        return
    self.board[move] += 1
    seed = seed - 1
    move = move + 1
    self.displayBoard()
    # call this function with parameters seed and move after 1000 ms
    root.after(1000, lambda: updateBoard(seed, move))

Почему это работает : в главном цикле ваше окно обрабатывает некоторые события или в этом случае вызывает функцию, если прошла 1 секунда. Если вы создаете функцию, которая выполняется вечно, этот основной цикл не будет продолжаться, потому что он ожидает завершения вашей функции. Вот почему приложение зависнет.

...