在python中使用延迟使代码jump.how来解决它?

时间:2018-03-27 15:19:06

标签: python user-interface tkinter delay

我正在使用python来创建用户界面应用程序。我正在使用tkinter进行UI。我创建了三个小部件(两个按钮和一个标签)。按下按钮时,我想要执行一个方法,该方法在订单中完成以下任务。

  • 更新标签中的按钮名称
  • 将按钮颜色更改为红色(最初将为黑色)
  • 播放音频文件,直到n秒
  • 将颜色更改为黑色

这是我如何对此进行编码。

from ttk import *
from Tkinter import *
from pygame import *
import time
root=Tk()
n=2
global cmajorBox
global dmajorBox
mixer.init()
def cMajor1():
    currentChordVariable.set("C MAJOR")    #l1
    cmajorBox.config(bg = "red")           #l2
    print 'c major'                        #l3
    mixer.music.load('c major.mp3')        #l4
    mixer.music.play()                     #l5
    time.sleep(n)                          #l6
    cmajorBox.config(bg="black")           #l7
def dMajor1():
    currentChordVariable.set("D MAJOR")
    dmajorBox.config(bg="red")
    print 'd major'
    mixer.music.load('d major.mp3')
    mixer.music.play()
    time.sleep(n)
    dmajorBox.config(bg="black")

cubeFrame=Frame(root)
cubeFrame.grid(row=1,column=1)
cmajorBox =Button(cubeFrame,text="cmajor",bg="black",
                  fg="white",padx=5.5,pady=20,command=cMajor1)
cmajorBox.grid(row = 1, column = 1)
dmajorBox = Button(cubeFrame,text="dmajor",bg="black",
                   fg="white",padx=5.5,pady=20,command=dMajor1)
dmajorBox.grid(row = 1, column =2)

currentChordVariable=StringVar()
currentChordDisplay = Label(root, 
                        textvariable=currentChordVariable,bg="red", 
                        fg="white",padx=70,pady=50)
currentChordDisplay.grid(row=2, column=1)
mainloop()

n表示音频应该播放多长时间。这是下一个代码开始的延迟。我已经提到了代码中的行号。运行时代码依此类推(l3,l4,l5,l6,l1,l2,l7)。我不知道为什么会这样。即使我在延迟之前对其进行了编码,也只能在延迟后处理颜色更改和名称更新以解决此问题。 这只是我整个应用程序的一小部分。我正在使用像这样的24个按钮。我现在坚持这个。请帮忙。

1 个答案:

答案 0 :(得分:0)

该函数中的前两行代码修改了GUI的部分内容,但这些修改不会立即显示在屏幕上;它们只有在GUI更新时才会显示。因为此代码位于按下按钮时运行的函数中,所以它在与内部Tkinter代码(通常定期刷新GUI)相同的线程中运行。这意味着整个函数必须在Tkinter的mainloop()能够再次更新GUI之前完成运行,并使您的更改可见。

为了强制GUI手动更新,您可以在修改GUI部分的代码行之后使用root.update()。完整的功能如下:

def cMajor1():
    currentChordVariable.set("C MAJOR")    #l1
    cmajorBox.config(bg = "red")           #l2
    root.update()
    print 'c major'                        #l3
    mixer.music.load('c major.mp3')        #l4
    mixer.music.play()                     #l5
    time.sleep(n)                          #l6
    cmajorBox.config(bg="black")           #l7