Frame と比べて、Dialog は通常モーダルな状態(開いている間、他の Frame がユーザ入力を受け付けない状態)でオープンされます。
ダイアログ上でのユーザ入力が終了したら、Dialog インスタンスからそれらの入力情報を取得し、その後で明示的に Dialog インスタンスを破棄するように実装します。
ダイアログを表示する前に、Dialog インスタンスのデータメンバに値をセットしておくようにすれば、その値を使ってダイアログの表示内容を初期化することができます。
Dialog インスタンスを破棄するまでは、何度でもダイアログを表示しなおすことができますが、アプリケーションが終了する前には必ず破棄する必要があります。
破棄し忘れると、MainLoop() はトップレベルのウィンドウがまだ存在しているとみなし、アプリケーションが終了しません。

ダイアログは wx.Dialog を継承して作成します。
このサンプルでは、ダイアログにテキストコントロールと、ボタンを配置し、ユーザが入力したテキストを取得しています。
wx.Frame にボタンなどを配置する場合は、まず wx.Panel を最上位に配置してからその下に配置していくのが一般的ですが、wx.Dialog は最初から wx.Panel の性質を持っているので、直接ボタンなどのウィジットを配置することができます(直接配置しないと表示がおかしくなるようです)。
wx.Dialog に配置した wx.Button の ID に、wx.ID_OK や wx.ID_CANCEL を指定すると、ボタンのイベントハンドラが自動的に設定されます。
この場合、ボタンをクリックしたときにダイアログが閉じられ、Dialog#ShowModal() の戻り値として、その ID(wx.ID_OK など)が返されます。
import wx
class MyDialog(wx.Dialog):
def __init__(self):
wx.Dialog.__init__(self, None, -1, 'Title', size=(200,120))
# Add components.
self.text = wx.TextCtrl(self, style=wx.TE_MULTILINE)
button = wx.Button(self, wx.ID_OK, "OK")
button.SetDefault()
# Set sizer.
sizer = wx.BoxSizer(wx.VERTICAL)
sizer.Add(self.text, 1, wx.EXPAND)
sizer.Add(button, 0, wx.EXPAND)
self.SetSizer(sizer)
if __name__ == '__main__':
app = wx.PySimpleApp()
dialog = MyDialog()
result = dialog.ShowModal()
if result == wx.ID_OK:
print "Input text =", dialog.text.Label
else:
print "Cancel"
dialog.Destroy()
$ python sample.py
Input text = aaa
bbb
ccc
wx.StdDialogButtonSizer を使用すると、ダイアログ上に配置したボタンを一般的なレイアウトで配置してくれます。

このサンプルでは、以下のような構造で Sizer を設定しています。
import wx
class MyDialog(wx.Dialog):
def __init__(self):
wx.Dialog.__init__(self, None, -1, 'Title', size=(200,160))
# Add components.
self.text = wx.TextCtrl(self, style=wx.TE_MULTILINE)
btnOk = wx.Button(self, wx.ID_OK)
btnOk.SetDefault()
btnCancel = wx.Button(self, wx.ID_CANCEL)
# Set button sizer.
btns = wx.StdDialogButtonSizer()
btns.AddButton(btnOk)
btns.AddButton(btnCancel)
btns.Realize()
# Set main sizer.
sizer = wx.BoxSizer(wx.VERTICAL)
sizer.Add(self.text, 1, wx.EXPAND|wx.ALL, 3)
sizer.Add(btns, 0, wx.EXPAND|wx.ALL, 5)
self.SetSizer(sizer)
if __name__ == '__main__':
app = wx.PySimpleApp()
dialog = MyDialog()
result = dialog.ShowModal()
if result == wx.ID_OK:
print "Input text =", dialog.text.Label
else:
print "Cancel"
dialog.Destroy()

wx.MessageDialog は、ユーザに Yes/No、OK/Cancel などの選択を促すダイアログを提供します。
import wx
if __name__ == '__main__':
app = wx.PySimpleApp()
dlg = wx.MessageDialog(None,
'Choose yes or no.',
'Message Dialog',
wx.YES_NO | wx.ICON_QUESTION)
result = dlg.ShowModal()
if result == wx.ID_YES:
print "Yes"
dlg.Destroy()
wx.MessageDialog.__init__ のヘルプwx.MessageDialog(Window parent,
String message,
String caption=MessageBoxCaptionStr,
long style=wxOK|wxCANCEL|wxCENTRE,
Point pos=DefaultPosition) -> MessageDialog
Constructor, use ShowModal to display the dialog.
ボタンの種類や、アイコンの種類は、style パラメータに以下のフラグで指定します。
wx.OK – OK ボタンを表示(ID: wx.ID_OK)wx.CANCEL – Cancel ボタンを表示(ID: wx.ID_CANCEL)wx.YES_NO – YES, NO ボタンを表示 (ID: wx.ID_YES, wx.ID_NO)wx.YES_DEFAULT – 初期フォーカスを YES ボタンに(デフォルト)wx.NO_DEFAULT – 初期フォーカスを NO ボタンにwx.ICON_INFORMATION – iwx.ICON_QUESTION – ?wx.ICON_EXCLAMATION – !wx.ICON_ERROR – xwx.ICON_HAND (= wx.ICON_ERROR)wx.STAY_ON_TOP – 最上位にウィンドウを表示する(別アプリ含む)
MessageBox(String message, String caption=EmptyString, int style=wxOK|wxCENTRE,
Window parent=None, int x=-1, int y=-1) -> int
単純なメッセージを表示したいだけであれば、wx.MessageBox() を使うと便利です。
wx.MessageBox() を呼び出すと、内部でダイアログを生成して ShowModal() を実行してくれます。
import wx
if __name__ == '__main__':
app = wx.PySimpleApp()
wx.MessageBox('Hello')
ScrolledMessageDialog は、MessageDialog では収まりきらない長いメッセージを表示するためのダイアログを提供します。
wx.lib.dialogs.ScrolledMessageDialog(parent, msg, caption, pos=wx.wxDefaultPosition,
size=(500, 300), style=536877056)