使用python延迟使代码跳跃.如何解决



我正在使用python创建用户界面应用程序。我正在为UI使用TKINTER。我创建了三个小部件(两个按钮和一个标签(。按下按钮时,我想驱除一种可以按顺序完成以下任务的方法。

  • 标签中的更新按钮名称
  • 将按钮颜色更改为红色(最初将是黑色(
  • 播放音频文件,直到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个按钮。我现在坚持使用此功能。请帮助。

该函数中的前两行代码修改了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

最新更新