我有这个简单的剧本,我很想理解为什么忽略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()
,这是不可能的。
答案 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,而不是在事件发生后猜测时间和使用。