gpt4 book ai didi

python - 使用 Ctrl-C 退出 tkinter 应用程序并捕获 SIGINT

转载 作者:行者123 更新时间:2023-11-28 21:45:08 30 4
gpt4 key购买 nike

Ctrl-C/SIGTERM/SIGINT 似乎被 tkinter 忽略了。一般可以是captured again with a callback .这似乎不起作用,所以我想我会运行 tkinter in another thread自其 mainloop() is an infinite loop and blocks .我实际上也想这样做以在单独的线程中从 stdin 读取。即使在这之后,在我关闭窗口之前,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()

最佳答案

这是一个在窗口或命令行中捕获控件 c 的工作示例。这是用 3.7.2 测试的,这似乎比其他解决方案更简单。我几乎觉得我错过了什么。

import tkinter as TK

import signal

def hello():
print("Hello")

root = TK.Tk()

TK.Button(root, text="Hi", command=(hello)).pack( )

def handler(event):
root.destroy()
print('caught ^C')

def check():
root.after(500, check) # time in ms.

# the or is a hack just because I've shoving all this in a lambda. setup before calling main loop
signal.signal(signal.SIGINT, lambda x,y : print('terminal ^C') or handler(None))

# this let's the terminal ^C get sampled every so often
root.after(500, check) # time in ms.

root.bind_all('<Control-c>', handler)

root.mainloop()

关于python - 使用 Ctrl-C 退出 tkinter 应用程序并捕获 SIGINT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39840815/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com