`text.config` вылетает из-за перегрузки событий - PullRequest
0 голосов
/ 25 марта 2019

Я задал вопрос вот так: Как настроить Label в tkinter?

Но события загружаются, и в итоге python не может обработать события, и он вылетает.

Как этого не произошло ??Может потому, что это в цикле, поэтому они перегружаются?Я не могу понять, как сделать так, чтобы он не разбился.

Вот мой код:

from tkinter import *
from time import *
print("""This is an app that basically you time the amount of time someone takes to fall from a cliff, then we will
use an equation to tell you how high the cliff is.
This is a recreation of the app Mark Rober created, by The way""")
window = Tk()
window.title("falling app")
window.geometry("700x700")
window.configure(bg = "sky blue")
"""We will use time import for this"""
mins = 0
seconds = 0
secs = Label(window, text = seconds, font = ("verdana", 60))
secs.place(relx = 0.48, rely = 0.35, anchor = "nw")
def start():
    mins = 0
    seconds = 0
    while seconds != 60:
        sleep(1.00)
        seconds+= 1
        secs.configure(text = seconds)
    if seconds == 60:
        mins = mins+1
        seconds = 0

Эта строка: secs.configure(text = seconds) является виновником.Я в этом уверен.

Заранее спасибо !!!!!!!!

Редактировать: Это то, на что это похоже, оно исчезает и перестает отвечать.

enter image description here

1 Ответ

0 голосов
/ 26 марта 2019

Причина зависания программы в том, что вы создали бесконечный цикл, который не позволяет tkinter когда-либо обрабатывать события. Tkinter является однопоточным и может работать только тогда, когда он способен обрабатывать постоянный поток событий. Вы предотвратили это с помощью этого бесконечного цикла:

while seconds != 60:
    sleep(1.00)
    seconds+= 1
    secs.configure(text = seconds)

Быстрое решение - вызвать update в этом цикле. Ваша программа будет все еще зависать на одну секунду, а затем станет активной всего за несколько миллисекунд, прежде чем снова замерзнет. Это очень неэффективный способ написания программы на tkinter.

Лучше было бы использовать метод after, чтобы постоянно планировать выполнение вашей функции раз в секунду. Вероятно, на этом сайте есть десятки, а не сотни примеров этой техники. В двух словах это выглядит примерно так:

def update_clock()
    global mins, seconds
    seconds += 1
    if seconds > 60:
        seconds = 0
        mins += 1
    secs.configure(text = seconds)

    window.after(1000, update_clock)

Затем вы вызываете эту функцию один раз в вашем методе start, и она будет продолжаться каждую секунду, пока программа не закроется:

def start():
    global mins, seconds
    mins = 0
    seconds = 0
    update_clock()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...