python - 每次按下按钮时如何播放声音而不冻结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()
同样,它在技术上有效,但线程只能启动一次,所以我被困在这里。
还有另一种方法可以实现这一目标吗?
解决方案
所以,我最终放弃了那段代码并用 pygame 模块替换它,因为我发现它更灵活,但是,是的,将 threadsound = ... 移动到 printtext() 中,正如 acw1668 指出的那样解决了我在线程中遇到的问题
非常感谢你 acw1668
推荐阅读
- javascript - 如何用构造函数替换待办事项列表?
- mysql - 创建的数据库返回空值查询的问题
- python - 对于任何用户给定的文本文件,程序将读取、分析和写入每个单词以及在输出文件中找到该单词的行号
- openstreetmap - 试图从司机当前位置检索道路限速
- javascript - 测试一些基本 javascript 代码时出现意外输出
- java - 使用 indexOf 方法从 arraylist 获取字符串,但它被认为是整数
- vb.net - 显示行显示索引超出范围
- html - 如何用颜色三角形和一些文本覆盖 html 输入?
- git - “HEAD -> 分支,起源/分支”在 git 提交日志中是什么意思?
- c++ - 按字母顺序排序数组c ++