如何结束没有显示任何窗口的Tkinter应用程序

时间:2013-10-04 16:30:08

标签: python tkinter

我有这个简单的剧本,我很想理解为什么忽略Ctrl-C

from Tkinter import *

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

    mainloop()

if __name__ == "__main__":
    main()

我在SO(tkinter keyboard interrupt isn't handled until tkinter frame is raised)上发现了另一个基本相同的问题。不幸的是,答案对我来说并不清楚。我应该如何使用after()函数来捕获信号?

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

2 个答案:

答案 0 :(得分: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()

答案 1 :(得分: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()命令导致音轨开始播放并立即返回。声音数据由事件循环处理 - 因此不运行事件循环将停止播放。

如果没有事件导致提前终止,应用程序最终将耗尽文件中的所有声音数据然后挂起。 play()方法在完成播放时会运行一个命令,因此我们可以在正确的时间正确地退出mainloop,而不是在事件发生后猜测时间和使用。