メッセージダイアログボックスを表示する

呼称: メッセージダイアログ表示のサンプル
目的: メッセージダイアログを表示し、そのダイアログ内のボタンの返り値を取得する
特徴: ダイアログをモーダル表示してベース画面の背面へ回り込ませない
用例: ユーザへの確認やワーニング/エラー検出の有無を伝える
備考: GUI ツールを作る上での基本ウィジェット

#!/bin/env python
# -*- encoding: utf-8 -*-

import pygtk
pygtk.require('2.0')
import gtk

"""メッセージダイアログ表示関数(INFO, WARNING, QUESTION, ERROR)
引数 :
 - pwin : 呼び出し元画面
 - msg : 表示するメッセージ
返値 :
 - ボタンが1つの場合 : gtk.MessageDialog.run() の返値
 - ボタンが2つの場合 : True or False
MessageDialog :
 - parent : ダイアログの一時的な親画面を指定
            (モーダル表示の場合、背面への回り込みを防止)
 - flags : モーダル表示 + 親画面の終了時にダイアログを削除
 - type : ダイアログの種類
 - buttons : ダイアログに表示するボタンの種類
 - message_format : ダイアログに表示するメッセージ
"""
def info_dialog(pwin, msg):
    dialog = gtk.MessageDialog(
            parent = pwin.window,
            flags = gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT,
            type = gtk.MESSAGE_INFO,
            buttons = gtk.BUTTONS_OK_CANCEL,
            message_format = msg)
    r = dialog.run()
    dialog.destroy()
    if r == gtk.RESPONSE_OK:
        return True
    else:
        return False

def warning_dialog(pwin, msg):
    dialog = gtk.MessageDialog(
            parent = pwin.window,
            flags = gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT,
            type = gtk.MESSAGE_WARNING,
            buttons = gtk.BUTTONS_OK,
            message_format = msg)
    r = dialog.run()
    dialog.destroy()
    return r

def question_dialog(pwin, msg):
    dialog = gtk.MessageDialog(
            parent = pwin.window,
            flags = gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT,
            type = gtk.MESSAGE_QUESTION,
            buttons = gtk.BUTTONS_YES_NO,
            message_format = msg)
    r = dialog.run()
    dialog.destroy()
    if r == gtk.RESPONSE_YES:
        return True
    else:
        return False

def error_dialog(pwin, msg):
    dialog = gtk.MessageDialog(
            parent = pwin.window,
            flags = gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT,
            type = gtk.MESSAGE_ERROR,
            buttons = gtk.BUTTONS_CLOSE,
            message_format = msg)
    r = dialog.run()
    dialog.destroy()
    return r


class BaseWindow:

    def __init__(self):
        """ベース画面作成
        画面やフレーム、ラベル、ボックス、ボタン等、
        構成要素のレイアウト配置と初期化を行う
        """
        # make TopLevelWindow
        self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
        self.window.set_title(self.__class__.__name__)
        self.window.set_border_width(10)
        self.window.set_position(gtk.WIN_POS_CENTER)
        self.window.connect('destroy', lambda w: gtk.main_quit())

        # make Label for return value of button
        self.lbl = gtk.Label('')
        self.lbl.set_alignment(0.1, 0.5)

        # make VBox
        vbox = gtk.VBox(False, 3)
        self.window.add(vbox)

        # make Frame
        frame = gtk.Frame('MessageDialogTest')
        vbox.pack_start(frame, False, False, 5)
        vbox.pack_start(self.lbl, False, False, 5)

        # make VBox
        in_vbox = gtk.VBox(False, 3)
        frame.add(in_vbox)

        # make HButtonBox and Buttons
        in_hbox = gtk.HButtonBox()
        in_hbox.set_layout(gtk.BUTTONBOX_START)
        in_hbox.set_border_width(5)
        for b in ['info', 'warning', 'question', 'error']:
            btn = gtk.Button(b)
            btn.connect('clicked', eval('self.on_btn_' + b + '_clicked'))
            in_hbox.add(btn)

        # add Hbox
        in_vbox.pack_start(in_hbox, False, False, 5)

        # make Label
        in_lbl = gtk.Label('ダイアログボックスの表示テスト')
        in_vbox.pack_start(in_lbl, False, False, 5)

        # make HBox and add Quit button
        hbox = gtk.HBox(False, 4)
        btn = gtk.Button(stock='gtk-quit')
        btn.connect('clicked', self.on_btn_quit_clicked)
        hbox.pack_end(btn, False, False, 5)
        vbox.pack_start(hbox, False, False, 5)

        # display
        self.window.show_all()

    def on_btn_info_clicked(self, btn):
        """
        info ボタン選択時の処理
        """
        msg = 'info'
        r = info_dialog(self, msg)
        if r:
            self.lbl.set_label('OK が選択されました。')
        else:
            self.lbl.set_label('キャンセルが選択されました。')

    def on_btn_warning_clicked(self, btn):
        """
        warning ボタン選択時の処理
        """
        msg = 'warning'
        r = warning_dialog(self, msg)
        if r == gtk.RESPONSE_OK:
            self.lbl.set_label('OK が選択されました。')

    def on_btn_question_clicked(self, btn):
        """
        question ボタン選択時の処理
        """
        msg = 'question'
        r = question_dialog(self, msg)
        if r:
            self.lbl.set_label('はいが選択されました。')
        else:
            self.lbl.set_label('いいえが選択されました。')

    def on_btn_error_clicked(self, btn):
        """
        error ボタン選択時の処理
        """
        msg = 'error'
        r = error_dialog(self, msg)
        if r == gtk.RESPONSE_CLOSE:
            self.lbl.set_label('閉じるが選択されました。')

    def on_btn_quit_clicked(self, btn):
        """
        終了ボタン選択時の処理
        """
        self.destroy(btn)

    def destroy(self, widget, data=None):
        gtk.main_quit()


def main():
    BaseWindow()
    gtk.main()

if __name__ == '__main__':
    main()

実行結果。




リファレンス:
PyGTK 2.0 Reference Manual
PyGTK 2.0 Tutorial