由于事件重载,导致text.config崩溃

时间:2019-03-25 00:01:22

标签: python-3.x tkinter label

我在这里问了这样一个问题: How to adjust Label in 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 :(得分:0)

程序挂起的原因是因为您创建了一个无限循环,从而阻止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()