我正在使用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