python中的Tkinter窗口没有响应

马纳夫·德赛

我有一个倒计时程序(下面的代码),它应该从你投入的任何时间长度开始倒计时(你们都知道计时器是如何工作的,对吧?)。但是当您按下开始键时,tkinter 窗口只会冻结,但不会返回任何错误,直到弹出窗口没有响应的 Windows 错误消息。我在尝试调试时包含了一些打印语句,它在 shell 中显示该程序在重复打印时c正在运行。有人知道如何解决这个问题吗?

import tkinter as tk
import time

def change(direction, stringvar, up_button, down_button):
    if direction == 'up':
        stringvar.set(stringvar.get()+1)
        down_button.config(state = 'normal')
        if int(stringvar.get())== 59:
            up_button.config(state = 'disabled')
    if direction == 'down':
        stringvar.set(stringvar.get()-1)
        up_button.config(state = 'normal')
        if stringvar.get()== 0:
            down_button.config(state = 'disabled') 

def startTimer():
    hourEntry.destroy()
    minuteEntry.destroy()
    secondEntry.destroy()
    print('a')
    hourLab = tk.Label(root, textvariable = hourText)
    minuteLab = tk.Label(root, textvariable = minuteText)
    secondLab = tk.Label(root, textvariable = secondText)
    print('b')
    hourLab.grid(row = 1, column = 0)
    minuteLab.grid(row = 1, column = 1)
    secondLab.grid(row = 1, column = 2)
    while hourText.get() != 0 or minuteText != 0 or secondText !=0:
        print('c')
        time.sleep(1)
        secondText.set(secondText.get()-1)
        if int(secondText.get()) == 0:
            secondText.set(59)
            if int(minuteText.get()) == 0:
                if int(hourText.get()) == 0:
                    continue
                else:
                    hourText.set(str(int(hourText.get())-1))
            else:
                minuteText.set(str(int(minuteText.get())-1))
root = tk.Tk()
root.title('Timer')
hourText = tk.IntVar()
minuteText = tk.IntVar()
secondText = tk.IntVar()
hourText.set(1)
minuteText.set(1)
secondText.set(1)
## create buttons and entry boxes using loop
up1 = tk.Button(root, text = '^^^', command = lambda: change('up', hourText, up1, down1))
up2 = tk.Button(root, text = '^^^', command = lambda: change('up', minuteText, up2, down2))
up3 = tk.Button(root, text = '^^^', command = lambda: change('up', secondText, up3, down3))
hourEntry = tk.Entry(root, textvariable = hourText, width = 5)
minuteEntry = tk.Entry(root, textvariable = minuteText, width = 5)
secondEntry = tk.Entry(root, textvariable = secondText, width = 5)
down1 = tk.Button(root, text = '...', command = lambda: change('down', hourText, up1, down1))
down2 = tk.Button(root, text = '...', command = lambda: change('down', minuteText, up2, down2))
down3 = tk.Button(root, text = '...', command = lambda: change('down', secondText, up3, down3))
start = tk.Button(root, text = 'Start', command = startTimer)
up1.grid(row = 0, column = 0, pady = 5, padx = 5)
up2.grid(row = 0, column = 1)
up3.grid(row = 0, column = 2, padx = 5)
hourEntry.grid(row = 1, column = 0, padx = 2, pady = 5)
minuteEntry.grid(row = 1, column = 1, padx = 2, pady = 5)
secondEntry.grid(row = 1, column = 2, padx = 2, pady = 5)
down1.grid(row = 2, column = 0)
down2.grid(row = 2, column = 1)
down3.grid(row = 2, column = 2)
start.grid(row = 3, columnspan = 3, pady = 5)
root.mainloop()
绝对音高

要实施您的计划:

import tkinter as tk
import time

def change(direction, stringvar, up_button, down_button):
    if direction == 'up':
        stringvar.set(stringvar.get()+1)
        down_button.config(state = 'normal')
        if int(stringvar.get())== 59:
            up_button.config(state = 'disabled')
    if direction == 'down':
        stringvar.set(stringvar.get()-1)
        up_button.config(state = 'normal')
        if stringvar.get()== 0:
            down_button.config(state = 'disabled') 

def timer():
    if hourText.get() != 0 or minuteText != 0 or secondText !=0:
        print('c')
        time.sleep(1)
        secondText.set(secondText.get()-1)
        if int(secondText.get()) == 0:
            secondText.set(59)
            if int(minuteText.get()) == 0:
                if int(hourText.get()) == 0:
                    pass
                else:
                    hourText.set(str(int(hourText.get())-1))
            else:
                minuteText.set(str(int(minuteText.get())-1))
        root.after(1, timer)

def startTimer():
    hourEntry.destroy()
    minuteEntry.destroy()
    secondEntry.destroy()
    print('a')
    hourLab = tk.Label(root, textvariable = hourText)
    minuteLab = tk.Label(root, textvariable = minuteText)
    secondLab = tk.Label(root, textvariable = secondText)
    print('b')
    hourLab.grid(row = 1, column = 0)
    minuteLab.grid(row = 1, column = 1)
    secondLab.grid(row = 1, column = 2)
    root.after(1, timer)
        
root = tk.Tk()
root.title('Timer')
hourText = tk.IntVar()
minuteText = tk.IntVar()
secondText = tk.IntVar()
hourText.set(1)
minuteText.set(1)
secondText.set(1)
## create buttons and entry boxes using loop
up1 = tk.Button(root, text = '^^^', command = lambda: change('up', hourText, up1, down1))
up2 = tk.Button(root, text = '^^^', command = lambda: change('up', minuteText, up2, down2))
up3 = tk.Button(root, text = '^^^', command = lambda: change('up', secondText, up3, down3))
hourEntry = tk.Entry(root, textvariable = hourText, width = 5)
minuteEntry = tk.Entry(root, textvariable = minuteText, width = 5)
secondEntry = tk.Entry(root, textvariable = secondText, width = 5)
down1 = tk.Button(root, text = '...', command = lambda: change('down', hourText, up1, down1))
down2 = tk.Button(root, text = '...', command = lambda: change('down', minuteText, up2, down2))
down3 = tk.Button(root, text = '...', command = lambda: change('down', secondText, up3, down3))
start = tk.Button(root, text = 'Start', command = startTimer)
up1.grid(row = 0, column = 0, pady = 5, padx = 5)
up2.grid(row = 0, column = 1)
up3.grid(row = 0, column = 2, padx = 5)
hourEntry.grid(row = 1, column = 0, padx = 2, pady = 5)
minuteEntry.grid(row = 1, column = 1, padx = 2, pady = 5)
secondEntry.grid(row = 1, column = 2, padx = 2, pady = 5)
down1.grid(row = 2, column = 0)
down2.grid(row = 2, column = 1)
down3.grid(row = 2, column = 2)
start.grid(row = 3, columnspan = 3, pady = 5)
root.mainloop()

Tkinter 使用一种方法 ( Tk.after) 允许用户克服 tk 主循环。(窗口不等待函数完成)。

它允许我们手动更新所有小部件(画布、按钮、标签 [等...])

这是我在 tkinter 应用程序中总是使用的一种方法,因为我不相信tk.mainloop ()做我想做的事。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章