【问题标题】:Stop Python Gtk.Application using Ctrl+C使用 Ctrl+C 停止 Python Gtk.Application
【发布时间】:2017-01-05 09:00:02
【问题描述】:

我正在创建一个应用程序。以前,我使用Gtk.Main() 来启动我的应用程序,并使用Ctrl+C 创建了一些挂钩来从命令行停止应用程序。现在,我已将应用程序迁移到更“标准”的Gtk.Application,但无法停止使用Ctrl+C

这是一个非常简单的Gtk.Application,当从命令行运行时,使用Ctrl+C无法停止:

from gi.repository import Gtk
import sys

# a Gtk ApplicationWindow


class MyWindow(Gtk.ApplicationWindow):
    # constructor: the title is "Welcome to GNOME" and the window belongs
    # to the application app

    def __init__(self, app):
        Gtk.Window.__init__(self, title="Welcome to GNOME", application=app)


class MyApplication(Gtk.Application):
    # constructor of the Gtk Application

    def __init__(self):
        Gtk.Application.__init__(self)

    # create and activate a MyWindow, with self (the MyApplication) as
    # application the window belongs to.
    # Note that the function in C activate() becomes do_activate() in Python
    def do_activate(self):
        win = MyWindow(self)
        # show the window and all its content
        # this line could go in the constructor of MyWindow as well
        win.show_all()

    # start up the application
    # Note that the function in C startup() becomes do_startup() in Python
    def do_startup(self):
        Gtk.Application.do_startup(self)

# create and run the application, exit with the value returned by
# running the program
app = MyApplication()
exit_status = app.run(sys.argv)
sys.exit(exit_status)

【问题讨论】:

  • 请将代码 sn-ps 放在这里而不是远程
  • 我相信这必须特定于您的代码或 Python。我的 Perl GtkApplication 代码以 Ctrl+C 结束。
  • 是的,它特定于 Python。如果我没记错原因,KeyboardInterrupt 异常不会在主循环迭代中传播。

标签: python gtk3


【解决方案1】:
import signal
from gi.repository import GLib

...

GLib.unix_signal_add(GLib.PRIORITY_DEFAULT, signal.SIGINT, app.quit)

【讨论】:

  • 请解释您的答案。代码转储本身并不是一个答案。
  • 迄今为止最好的提示。我以为有办法让 GLib 自己捕捉信号,但不知道怎么做。
【解决方案2】:

这适用于Gtk 3.0

import signal
import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk
from gi.repository import GLib

app = Application()
GLib.unix_signal_add(GLib.PRIORITY_DEFAULT, signal.SIGINT, Gtk.main_quit)

【讨论】:

    【解决方案3】:

    您可以使用 Ctrl+Z 停止执行脚本。

    【讨论】:

    • 是的,但这不会停止应用程序,只会停止执行。
    猜你喜欢
    • 1970-01-01
    • 2018-11-17
    • 2018-06-23
    • 1970-01-01
    • 2019-12-27
    • 1970-01-01
    • 2014-07-10
    • 1970-01-01
    • 2020-06-29
    相关资源
    最近更新 更多