web-dev-qa-db-ja.com

Gtk3で終了ダイアログを実装するにはどうすればよいですか?

私はUbuntu App Showdownアプリをほぼ完成させましたが、アプリケーションを終了するときに、保存されていないファイルをチェックして開いているファイルを繰り返し処理し、見つかった場合はユーザーに通知するダイアログをポップアップします。

ユーザーがダイアログをキャンセルすると、プログラムが再開しますが、ユーザーが[OK]をクリックすると、ダイアログとメインウィンドウの両方が閉じるはずです。

これは私がこれまで持っているものです。

self.connect("delete-event", self.CheckSave)

def CheckSave(self, arg1, arg2):
    unsaved = False
    for doc in self.Documents:
        if doc.Saved == False:
            unsaved = True

    if unsaved:
        print("Unsaved document")
        Dialog = Gtk.Dialog("Really quit?", 0, Gtk.DialogFlags.MODAL)
        Dialog.add_button(Gtk.STOCK_NO, Gtk.ResponseType.CANCEL)
        Dialog.add_button(Gtk.STOCK_YES, Gtk.ResponseType.OK)

        box = Dialog.get_content_area()
        label1 = Gtk.Label("There are unsaved file(s).")
        label2 = Gtk.Label("Are you sure you want to quit?")
        box.add(label1)
        box.add(label2)
        box.show_all()

        response = Dialog.run()
        print(response)

        if response == Gtk.ResponseType.OK:
            return(False)
        else:
            return(True)

        Dialog.destroy()

ダイアログを実行すると、ResponseType.OKまたはResponseType.CANCELの値は出力されず、-4または-6などの負の乱数が得られます。ダイアログも閉じず、メインウィンドウがダイアログを表示し続け、終了するにはCTRL + cが必要です。それ。

3
Neil Munro

このコードにはいくつかの問題があります。

  • Dialog.destroy()メソッドは決して呼び出されません。この呼び出しの前に関数を返します。

  • Gtk.MessageDialogをご覧ください。通常のGtk.Dialogで必要な定型コードを処理します。

  • 読み取り PEP-8 。これはルールではなく、一般的な慣行です。 UpperCaseの名前はクラスを対象としています。属性とメソッドはcamelCaseまたはwith_underscoreである必要があります。

  • Forループは非効率的です。また、メソッド全体のインデントを1タブ少なくすることができます。

以下にいくつかのサンプルコードpep-8を示しますが、メッセージダイアログはまだ実行する必要があります。

def confirm_close(self, widget, event):
    unsaved = False
    for doc in self.Documents:
        if not doc.Saved:
            unsaved = True
            break # Break here, no need to check more documents

    if not unsaved:
        Gtk.main_quit()

    #TODO: build the messagedialog
    dialog = Gtk.MessageDialog(....)
    response = dialog.run()
    if response == Gtk.ResponseType.OK:
        # Really quit the application
        Gtk.main_quit()
    # Close the dialog and keep the main window open
    dialog.destroy()
    return True
5
Timo