首页 > 解决方案 > 每次按下按钮时如何播放声音而不冻结Tkinter

问题描述

我一直在修改几天前完成的 Tkinter 项目,我想添加一些声音让它更有趣。

我用 winsound 添​​加了按钮声音,如下所示:

(简化代码)

import winsound
from Tkinter import *

root = Tk()

canvas = Canvas(root, height=500, width=500)
canvas.pack()

def printtext():
    winsound.PlaySound("button.wav", winsound.SND_ALIAS)
    print("Hi")

button = Button(root, text=("button"), command=printtext)
button.pack()    

root.mainloop()

这在技术上是可行的,但是由于代码是同步运行的,所以 GUI 会冻结,直到声音完整播放。

为了解决这个问题,我使用线程在后台播放声音,而其余的函数运行。

像这样:

(简化代码)

import winsound
import threading
from tkinter import *

root = Tk()

canvas = Canvas(root, height=500, width=500)
canvas.pack()

def playsound():
    winsound.PlaySound("button.wav", winsound.SND_ALIAS)

threadsound = threading.Thread(target=playsound)

def printtext():
    threadsound.start()
    print("Hi")

button = Button(root, text=("button"), command=printtext)
button.pack()    

root.mainloop()

同样,它在技术上有效,但线程只能启动一次,所以我被困在这里。

还有另一种方法可以实现这一目标吗?

标签: pythonpython-3.xtkinter

解决方案


所以,我最终放弃了那段代码并用 pygame 模块替换它,因为我发现它更灵活,但是,是的,将 threadsound = ... 移动到 printtext() 中,正如 acw1668 指出的那样解决了我在线程中遇到的问题

非常感谢你 acw1668


推荐阅读