相关疑难解决方法(0)

在提升tkinter帧之前,不会处理tkinter键盘中断

我有一个用python + tkinter编写的GUI应用程序。在我的工作流程中,我通常从命令行启动gui,在gui中做一些事情,然后发现自己导航到其他终端窗口来做一些工作。不可避免地,我想在某个时候关闭GUI,出于习惯,我经常只是导航到启动GUI的终端并发送KeyboardInterrupt(Ctrl-c)。但是,直到我在窗口管理器中举起GUI窗口时,才收到此中断。有谁知道为什么会这样吗?如果gui是在单个函数中启动的,那么有没有简单的解决方法- multiprocessing也许吗?

python tkinter keyboardinterrupt

5
推荐指数
1
解决办法
1702
查看次数

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

Ctrl-C/SIGTERM/SIGINT 似乎被 tkinter 忽略。通常可以通过回调再次捕获它。这似乎不起作用,所以我想我应该在另一个线程中运行 tkinter ,因为它的mainloop() 是一个无限循环和 block。实际上我也想这样做以在单独的线程中从标准输入读取。即使在此之后,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)
Run Code Online (Sandbox Code Playgroud)

结果:

  • 运行应用程序
  • 在终端中按 Ctrl-C(没有任何反应)
  • 关上窗户
  • 打印“Exiting...”,并且收到有关循环已退出的错误。

这是怎么回事?如何让终端中的 Ctrl-C 关闭应用程序?


更新:按照建议添加 poll,在主线程中工作,但在另一个线程中启动时没有帮助......

class MyTkApp(threading.Thread):
    def poll(self):
        sys.stderr.write("poll\n")
        self.root.after(50, self.poll) …
Run Code Online (Sandbox Code Playgroud)

python multithreading signals tkinter

5
推荐指数
2
解决办法
8311
查看次数