【问题标题】:Winsound causing my tkinter GUI to open slowlyWinsound 导致我的 tkinter GUI 打开缓慢
【发布时间】:2020-10-07 12:59:48
【问题描述】:

我正在使用 Python 开发 tkinter GUI,以在新窗口中生成错误消息。当运行如下所示的代码时,会播放错误噪音,然后在打开窗口之前暂停几秒钟。如果我用 winsound 注释掉该行,它会很好地打开它。

import tkinter as tk
import winsound
class Error_Window:
    def __init__(self, txt):
        self.root = tk.Tk()
        self.root.title("Error")
        self.lbl = tk.Label(self.root, text=txt)
        self.lbl.pack()
        winsound.PlaySound("SystemExit", winsound.SND_ALIAS)
        self.root.mainloop()

我怀疑这可能是由于在到达 mainloop 命令之前完全播放了错误噪音。一种解决方案是在单独的线程中运行声音,但我听说应该避免使用 tkinter 进行多线程。在播放噪音的同时让它顺利打开有什么技巧吗?

【问题讨论】:

  • winsound 有一个SND_ASYNC 或类似的标志来在后台播放声音。一个单独的线程也是一个可行的解决方案——Tkinter 对此没有任何问题,只要你不从主线程以外的任何地方进行任何 Tkinter 调用。
  • 只要您不从多个线程调用 tkinter 对象,多线程应该可以正常工作。在单独的线程中调用 winsound 应该可以正常工作。
  • @BryanOakley 哦,所以如果我在两个不同线程中的 tkinter 窗口中有两个函数,而 tkinter 在另一个线程中,会产生一些问题吗?
  • @CoolCloud:您应该只从单个线程访问 tkinter 对象。这是来自实际编写了一些 tk 代码的人:stackoverflow.com/a/38767665/7432

标签: python tkinter winsound


【解决方案1】:

试试这个,它这样做的原因是整个程序是我们应该在ONE THREAD/ MAIN THREAD中说它会先执行还是先执行声音然后弹出窗口。我认为就像@jasonharper 所说的那样,在 tkinter 中使用线程没有问题

import tkinter as tk
import winsound
import threading

class Error_Window:
    def __init__(self, txt):
        self.root = tk.Tk()
        self.root.title("Error")
        self.lbl = tk.Label(self.root, text=txt)

        th = threading.Thread(target=self.__play_sound,args=[])
        th.start()

        self.lbl.pack()
        self.root.mainloop()
 
    def __play_sound(self):
        winsound.PlaySound("SystemExit", winsound.SND_ALIAS)

Error_Window("Hi")

【讨论】:

  • 可以通过说threading.Thread(target=lambda:winsound.PlaySound("SystemExit", winsound.SND_ALIAS)).start()来进一步简化这一点,而不是在里面创建一个新方法
  • 哦,是的,兰巴很棒!
猜你喜欢
  • 1970-01-01
  • 2018-07-01
  • 2021-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-24
  • 1970-01-01
相关资源
最近更新 更多