2

我有这个简单的脚本,我很想了解它为什么忽略Ctrl-C.

from Tkinter import *

def main():
    root = Tk().withdraw()

    mainloop()

if __name__ == "__main__":
    main()

我在 SO 上发现了另一个问题(在tkinter 帧被提升之前不会处理 tkinter 键盘中断),这基本上是相同的。不幸的是,我并不清楚答案。我应该如何使用该after()功能来捕捉信号?

此外,我只需要使用 Tkinter tkSnack,我不希望出现任何窗口。因此,添加一个按钮来调用root.quit()它是不可能的。

4

2 回答 2

1

如果我在键入 ctrl-C 之前将焦点移回命令窗口,这似乎对我有用。

from Tkinter import *

def dummy(root):
    root.after(1000, dummy, root)
    print '',

def main():
    root = Tk()
    root.withdraw()
    dummy(root)
    mainloop()

if __name__ == "__main__":
    main()
于 2013-10-04T18:13:21.793 回答
0

您可以将其作为带有隐藏窗口的 Tk 应用程序来驱动。跟进您之前的问题,以及这都是 mp3 播放器的一部分,这里是一个示例。

from Tkinter import *
import sys,tkSnack

def terminate(root):
    root.quit()

def main(args = None):
    if args is None:
        args = sys.argv
    root = Tk()
    root.withdraw()
    tkSnack.initializeSnack(root)
    root.after(5000, terminate, root)
    track = tkSnack.Sound(file=args[1])
    track.play()
    root.mainloop()
    root.destroy()
    return 0

if __name__=='__main__':
    sys.exit(main())

在这种情况下,我们保留了根 Tk 窗口,但在它有机会被映射到屏幕上之前将其撤回。然后我们安排一个 5 秒时间的事件来终止应用程序,该应用程序将退出 Tk 事件循环,我们可以销毁所有内容并干净地退出。这是因为 play() 命令使音轨开始播放并立即返回。声音数据由事件循环处理 - 因此不运行事件循环将停止播放。

如果没有导致提前终止的 after 事件,应用程序最终会用完文件中的所有声音数据,然后挂起。play() 方法在播放结束时接收一个要运行的命令,这样我们就可以让主循环在正确的时间正确退出,而不是猜测时间并在事件后使用。

于 2013-10-04T18:31:30.403 回答