メッセージダイアログボックスを表示する
呼称: メッセージダイアログ表示のサンプル
目的: メッセージダイアログを表示し、そのダイアログ内のボタンの返り値を取得する
特徴: ダイアログをモーダル表示してベース画面の背面へ回り込ませない
用例: ユーザへの確認やワーニング/エラー検出の有無を伝える
備考: 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()