2017-01-05 21 views
3

私はアプリケーションを作成しています。以前はGtk.Main()を使ってアプリケーションを起動し、コマンドラインからアプリケーションを停止させるフックをいくつか作成してCtrl+Cを使用しました。今、アプリケーションをより標準的な "Gtk.Application"に移行しましたが、Ctrl+Cの使用を中止することはできません。Ctrl + Cを使用してPython Gtk.Applicationを終了

これは、コマンドラインから実行されたとき、それはCtrl+Cを使用して停止することができないという、非常にシンプルなGtk.Applicationです:

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) 
+0

ここにコードを入れてください。リモートではありません – frlan

+0

あなたのコードやPythonに固有のものでなければなりません。私のPerl GtkApplicationコードはCtrl + Cで正常終了します。 – oldtechaa

+0

はい、それはPython特有のものです。理由を正しく覚えていれば、KeyboardInterrupt例外はメインループ反復に渡って伝播しません。 – ptomato

答えて

1

あなたは、コンソール上でCtrl+Cを使用してそれを停止するsignalを使用することができます。

import signal 

... 

signal.signal(signal.SIGINT, signal.SIG_DFL) 
app = MyApplication() 
exit_status = app.run(sys.argv) 
sys.exit(exit_status) 
+0

@okelet申し訳ありません。私の編集をチェックしてください。 – Zety

+0

私はあなたがメソッドを変更したので、私は自分のdownvoteを引っ込めました。以前の方法では、私はポスターが求めていたとは思えませんでした。この方法は、私は動作しないことを保証することはできませんので、引っ込め。私はこの投稿にコメントを残しましたか?私はそれをやっていることを覚えていないし、もうそれはない。 – oldtechaa

+1

@oldtechaaあなたが正しいです、以前の方法はGUI用でした。彼が暗黙のうちにコマンドラインからそれをするように頼んだとき、私は誤解しました。最後に残したコメントは、メソッドが変更されたため削除されました。なぜ私が言ったのですか?私の誤解を裏付けるコメントは、答えを見直すだけで十分だろうということです。ありがとうございました。 – Zety

-1

スクリプトの実行を停止するには、Ctrl + Zを使用できます。

+2

はい、アプリケーションを停止するわけではなく、実行のみです。 –

0
import signal 
from gi.repository import GLib 

... 

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

答えの説明を入力してください。コードダンプは、それ自身の答えではありません。 – TheIncorrigible1

関連する問題