【发布时间】:2016-10-03 21:37:43
【问题描述】:
Ctrl-C/SIGTERM/SIGINT 似乎被 tkinter 忽略了。通常可以是captured again with a callback。这似乎不起作用,所以我想我会运行 tkinter in another thread,因为它是 mainloop() is an infinite loop and blocks。我实际上也想这样做以在单独的线程中从标准输入读取。即使在此之后,在我关闭窗口之前,仍然不会处理 Ctrl-C。这是我的 MWE:
#! /usr/bin/env python
import Tkinter as tk
import threading
import signal
import sys
class MyTkApp(threading.Thread):
def run(self):
self.root = tk.Tk()
self.root.mainloop()
app = MyTkApp()
app.start()
def signal_handler(signal, frame):
sys.stderr.write("Exiting...\n")
# think only one of these is needed, not sure
app.root.destroy()
app.root.quit()
signal.signal(signal.SIGINT, signal_handler)
结果:
- 运行应用程序
- 终端中的 Ctrl-C(没有任何反应)
- 关闭窗口
- “Exiting...”被打印出来,我收到一个关于循环已经退出的错误。
这里发生了什么,如何让 Ctrl-C 从终端关闭应用程序?
更新:Adding a poll,as suggested,在主线程中工作,但在另一个线程中启动时没有帮助...
class MyTkApp(threading.Thread):
def poll(self):
sys.stderr.write("poll\n")
self.root.after(50, self.poll)
def run(self):
self.root = tk.Tk()
self.root.after(50, self.poll)
self.root.mainloop()
【问题讨论】:
-
明确一点:您想从终端而不是从 GUI 本身执行 control-c,对吗?
-
@BryanOakley 是的,在开发过程中经常测试会非常方便。
-
以下链接是否回答了您的问题? stackoverflow.com/a/13784297/7432
-
@BryanOakley 我的应用程序中已经有这个投票,它不会影响行为。信号回调在窗口关闭之前不会运行。
-
您确定投票正在进行吗?在使用 poll 的时候,你是不是也在使用多线程呢?另外,你是在什么平台上体验的?如果你从stackoverflow.com/a/13784297/7432 获取确切的代码并运行它,它对你有用吗?
标签: python multithreading tkinter signals