Wxpython-wx-dialog-class
wxPython-ダイアログクラス
*Dialog class* オブジェクトは *Frame* のように表示されますが、通常は親フレームの上部のポップアップウィンドウとして使用されます。 ダイアログの目的は、ユーザーからいくつかのデータを収集し、それを親フレームに送信することです。 ダイアログフレームは、モーダル(親フレームをブロックする)またはモードレス(ダイアログフレームをバイパスできます)にできます。 ShowModal()メソッドは、モーダル方式でダイアログフレームを表示しますが、Show()メソッドはモードレスにします。
wxPythonには、MessageDialog、FileDialog、FontDialogなど、多くの事前構成されたDialogウィジェットがあります。
wx.Dialogは、Sizerのwx.Frameオブジェクトとしての使用をサポートしています。 したがって、カスタムダイアログを設計できます。
Wx.Dialogクラスのコンストラクタは、次の通常のパラメータを取ります-
wx.Dialog(parent, id, title, pos, size, style)
ダイアログウィジェットのデフォルトの外観では、タイトルバーに閉じるボックスのみが表示されます。 ただし、次のスタイルパラメータの組み合わせを使用してカスタマイズできます-
以下は、Dialogの最も一般的に使用されるパラメーターです。
S.N. | Parameters & Description |
---|---|
1 |
wx.CAPTION ダイアログボックスにキャプションを付けます |
2 |
wx.DEFAULT_DIALOG_STYLE wxCAPTION、wxCLOSE_BOXおよびwxSYSTEM_MENUの組み合わせに相当 |
3 |
wx.RESIZE_BORDER ウィンドウの周りにサイズ変更可能なフレームを表示します |
4 |
wxSYSTEM_MENU システムメニューを表示します |
5 |
wx.CLOSE_BOX フレームに閉じるボックスを表示します |
6 |
wx.MAXIMIZE_BOX ダイアログに最大化ボックスを表示します |
7 |
wx.MINIMIZE_BOX ダイアログに最小化ボックスを表示します |
8 |
wx.STAY_ON_TOP ダイアログが他のすべてのウィンドウの上にあるようにします |
9 |
wx.DIALOG_NO_PARENT 孤立ダイアログの作成を防ぎます。 モーダルダイアログには推奨されません |
このクラスには2つの偶数バインダーが定義されています-
以下に、最も一般的に使用されるダイアログのイベントを示します。
S.N. | Events & Description |
---|---|
1 |
EVT_CLOSE ユーザーによって、またはプログラムによってダイアログが閉じられているとき |
2 |
EVT_INIT_DIALOG ダイアログが初期化されているとき |
前述のように、Dialogの目的は、データを収集して親ウィンドウに戻ることです。 ただし、Dialogクラスではいくつかの便利なメソッドを使用できます。
以下に、Dialogの最も一般的に使用される方法を示します。
S.N. | Methods & Description |
---|---|
1 |
DoOK() ダイアログの[OK]ボタンが押されたときに呼び出されます |
2 |
ShowModal() アプリケーションモーダル方式でダイアログを表示します |
3 |
ShowWindowModal() ダイアログは最上位の親ウィンドウに対してのみモーダルです |
4 |
EndModal() ShowModal呼び出しから値を渡すモーダルダイアログを終了します |
事前構成されたダイアログの1つはMessageDialogです。 これは、標準IDを持つボタンで1行以上のメッセージを表示するために使用されます。 以下は、MessageDialogの標準ボタンの選択リストです。
以下に、最も一般的に使用されるダイアログのボタンを示します。
S.N. | Buttons & Description |
---|---|
1 |
wx.OK [OK]ボタンを表示します |
2 |
wx.CANCEL [キャンセル]ボタンを表示します |
3 |
wx.YES_NO はい、いいえボタンを表示します |
4 |
wx.YES_DEFAULT デフォルトとして「はい」ボタンを作成します |
5 |
wx.NO_DEFAULT デフォルトとしてボタンなし |
6 |
wx.ICON_EXCLAMATION 警告アイコンを表示します |
7 |
wx.ICON_ERROR エラーアイコンを表示します |
8 |
wx.ICON_HAND wx.ICON_ERRORと同じ |
9 |
wx.ICON_INFORMATION 情報アイコンを表示する |
10 |
wx.ICON_QUESTION 質問アイコンを表示します |
MessageDialog
これは、次のコンストラクタで宣言されています-
wx.MessageDialog(parent, message, caption, style, pos)
キャプションはタイトルバーに表示されますが、表示されるテキストの1行以上はメッセージパラメーターです。 デフォルトのスタイルパラメータはwx.OK | wx.ECNREです。 他のスタイルパラメータを使用すると、メッセージボックスをカスタマイズできます。
wx.MessageBoxは、MessageDialogを使用する代わりにメッセージボックスを作成するための便利な関数です。
例
以下に、Dialogのモーダルおよびモードレス動作の簡単なデモを示します。 親ウィンドウは、2つのボタンを持つwx.Frameオブジェクトです。 最初のボタンのクリックイベントは、モーダル形式でダイアログを表示します。 したがって、ダイアログが閉じられるまで、親ウィンドウでの操作はすべて防止されます。 2番目のボタンは、親ウィンドウへのアクセスを妨げないモードレスダイアログを表示します。 3番目のボタンは、MessageBoxを表示します。
コード全体は次のとおりです-
import wx
class MyDialog(wx.Dialog):
def __init__(self, parent, title):
super(MyDialog, self).__init__(parent, title = title, size = (250,150))
panel = wx.Panel(self)
self.btn = wx.Button(panel, wx.ID_OK, label = "ok", size = (50,20), pos = (75,50))
class Mywin(wx.Frame):
def __init__(self, parent, title):
super(Mywin, self).__init__(parent, title = title, size = (250,150))
self.InitUI()
def InitUI(self):
panel = wx.Panel(self)
btn = wx.Button(panel, label = "Modal Dialog", pos = (75,10))
btn1 = wx.Button(panel, label = "Modeless Dialog", pos = (75,40))
btn2 = wx.Button(panel, label = "MessageBox", pos = (75,70))
btn.Bind(wx.EVT_BUTTON, self.OnModal)
a = btn1.Bind(wx.EVT_BUTTON, self.OnModeless)
print a
btn2.Bind(wx.EVT_BUTTON, self.Onmsgbox)
self.Centre()
self.Show(True)
def OnModal(self, event):
a = MyDialog(self, "Dialog").ShowModal()
print a
def OnModeless(self, event):
a = MyDialog(self, "Dialog").Show()
def Onmsgbox(self, event):
wx.MessageBox("This is a Message Box", "Message" ,wx.OK | wx.ICON_INFORMATION)
ex = wx.App()
Mywin(None,'MenuBar demo')
ex.MainLoop()
上記のコードは、次の出力を生成します-
wx.TextEntryDialog
このクラスのオブジェクトは、1つのテキストフィールド、ユーザーに入力を促すカスタマイズ可能なラベル、および事前定義されたスタイルの2つのボタンを持つダイアログを表示します。
このダイアログは1行の入力を要求しますが、パスワードや複数行などのTextCtrlスタイルを使用してテキストボックスをカスタマイズできます。
ユーザーが[OK]ボタンをクリックすると、テキストフィールドの内容が戻り値として収集されます。
TextEntryDialogコンストラクタは次のとおりです-
wx.TextEntryDialog(parent, id, message, caption, value, style, pos)
ダイアログウィンドウに表示されるテキストは、メッセージパラメータとして渡されます。 captionパラメーターは、タイトルバーに表示される文字列です。 テキストボックスのデフォルトの文字列は、vue alueパラメーターです。 ダイアログのTextCtrlは、パスワード文字(wx.TE_PASSWORD)および/または複数行(wx.TE_MULTILINE)を表示するように構成できます。
TextEntryクラスの他のメソッドは、次の表に記載されています-
以下に、TextEntryの最も一般的に使用されるメソッドを示します。
S.N. | Methods & Description |
---|---|
1 |
SetMaxLength() ユーザーがテキストボックスに入力できる最大文字数を設定します |
2 |
SetValue() テキストボックスの値をプログラムで設定します |
3 |
GetValue() テキストボックスの内容を返します |
4 |
ShowModal() ダイアログをモーダルで表示します。 ユーザーが入力を確認した場合はwx.ID_OKを返し、ダイアログが拒否された場合はwx.ID_CANCELを返します |
例
次の例の最上位フレームは、ボタンと読み取り専用のTextCtrlウィジェットを示しています。
self.text = wx.TextCtrl(pnl, size = (250, 25),style = wx.TE_READONLY)
self.btn1 = wx.Button(pnl, label = "Enter Text")
ボタンはクリックに応答し、OnClick()関数を呼び出します。
self.Bind(wx.EVT_BUTTON, self.OnClick, self.btn1)
OnClick()関数は、TextEntryDialogを表示します。
dlg = wx.TextEntryDialog(self, 'Enter Your Name','Text Entry Dialog')
ダイアログの戻り値は、GetValue()関数によって取得され、トップレベルフレームのTextCtrlオブジェクトに表示されます。
if dlg.ShowModal() == wx.ID_OK:
self.text.SetValue("Name entered:"+dlg.GetValue())
完全なコードは次のとおりです-
import wx
class Mywin(wx.Frame):
def __init__(self, parent, title):
super(Mywin, self).__init__(parent, title = title,size = (300,200))
self.InitUI()
def InitUI(self):
self.count = 0
pnl = wx.Panel(self)
vbox = wx.BoxSizer(wx.VERTICAL)
hbox1 = wx.BoxSizer(wx.HORIZONTAL)
hbox2 = wx.BoxSizer(wx.HORIZONTAL)
self.text = wx.TextCtrl(pnl, size = (250, 25),style = wx.TE_READONLY)
self.btn1 = wx.Button(pnl, label = "Enter Text")
self.Bind(wx.EVT_BUTTON, self.OnClick, self.btn1)
hbox1.Add(self.text, proportion = 1, flag = wx.ALIGN_CENTRE)
hbox2.Add(self.btn1, proportion = 1, flag = wx.RIGHT, border = 10)
vbox.Add((0, 30))
vbox.Add(hbox1, flag = wx.ALIGN_CENTRE)
vbox.Add((0, 20))
vbox.Add(hbox2, proportion = 1, flag = wx.ALIGN_CENTRE)
pnl.SetSizer(vbox)
self.Centre()
self.Show(True)
def OnClick(self, e):
dlg = wx.TextEntryDialog(self, 'Enter Your Name','Text Entry Dialog')
if dlg.ShowModal() == wx.ID_OK:
self.text.SetValue("Name entered:"+dlg.GetValue())
dlg.Destroy()
ex = wx.App()
Mywin(None,'TextEntry Demo')
ex.MainLoop()
上記のコードは、次の出力を生成します-
wx.FileDialogクラス
このクラスは、ファイルセレクターダイアログを表します。 これにより、ユーザーはファイルシステムをナビゲートし、開くまたは保存するファイルを選択できます。 ダイアログの外観はOS固有です。
ファイルフィルターを適用して、指定した拡張子のファイルのみを表示することもできます。 開始ディレクトリとデフォルトのファイル名も設定できます。
FileDialogコンストラクタのプロトタイプは次のようになります-
wx.FileDialog(parent, message, DefaultDir, DefaultFile, wildcard, style, pos, size)
メッセージは表示されるテキストを表します。 DefaultDirは初期ディレクトリです。 ワイルドカードパラメーターで表されるファイルフィルターとして、1種類以上のファイルを設定できます。
FileDialogに定義されているスタイルパラメータは-
FileDialogの最も一般的に使用されるパラメーターを以下に示します。
S.N. | Parameters & Description |
---|---|
1 |
wx.FD_DEFAULT_STYLE wxFD_OPENと同等 |
2 |
wx.FD_OPEN これは開いているダイアログです。ダイアログのデフォルトボタンのラベルは「開く」です |
3 |
wx.FD_SAVE これは保存ダイアログです。ダイアログのデフォルトボタンのラベルは「保存」です |
4 |
wx.FD_OVERWRITE_PROMPT 保存ダイアログのみ:ファイルが上書きされるかどうかの確認を求めます |
5 |
wx.FD_MULTIPLE ダイアログを開く場合のみ:複数のファイルを選択できます |
6 |
wx.FD_CHANGE_DIR 現在の作業ディレクトリを、ユーザーが選択したファイルがあるディレクトリに変更します |
wx.FileDialogクラスのメンバー関数-
以下は、wx.FileDialogの最も一般的に使用される関数です。
S.N. | Functions & Description |
---|---|
1 |
GetDirectory() デフォルトのディレクトリを返します |
2 |
GetFileName() デフォルトのファイル名を返します |
3 |
GetPath() 選択したファイルのフルパスを返します |
4 |
SetDirectory() デフォルトのディレクトリを設定します |
5 |
SetFilename() デフォルトのファイルを設定します |
6 |
SetPath() フルパスを設定します |
7 |
ShowModal() ダイアログを表示し、ユーザーが[OK]ボタンをクリックするとwx.ID_OKを返し、それ以外の場合はwx.ID_CANCELを返します |
例
次の例では、最上位のフレームにボタンと複数行のTextCtrlが表示されています。
self.text = wx.TextCtrl(pnl, size = (-1,200), style = wx.TE_MULTILINE)
self.btn1 = wx.Button(pnl, label = "Open a File")
EVT_BUTTONイベントバインダーは、ボタンにOnClick()関数を登録します。
self.Bind(wx.EVT_BUTTON, self.OnClick, self.btn1)
OnClick()関数は、オープンモードでFileDialogを表示します。 その選択はdlgとして返されます。 選択したファイルはGetPath()関数によって取得され、その内容は親ウィンドウのTextCtrlボックスに表示されます。
def OnClick(self, e):
wildcard = "Text Files (*.txt)|*.txt"
dlg = wx.FileDialog(self, "Choose a file", os.getcwd(), "", wildcard, wx.OPEN)
if dlg.ShowModal() == wx.ID_OK:
f = open(dlg.GetPath(), 'r')
with f:
data = f.read()
self.text.SetValue(data)
完全なコードは次のとおりです-
import wx
import os
class Mywin(wx.Frame):
def __init__(self, parent, title):
super(Mywin, self).__init__(parent, title = title)
self.InitUI()
def InitUI(self):
self.count = 0
pnl = wx.Panel(self)
vbox = wx.BoxSizer(wx.VERTICAL)
hbox1 = wx.BoxSizer(wx.HORIZONTAL)
hbox2 = wx.BoxSizer(wx.HORIZONTAL)
self.text = wx.TextCtrl(pnl, size = (-1,200),style = wx.TE_MULTILINE)
self.btn1 = wx.Button(pnl, label = "Open a File")
self.Bind(wx.EVT_BUTTON, self.OnClick, self.btn1)
hbox1.Add(self.text, proportion = 1, flag = wx.ALIGN_CENTRE)
hbox2.Add(self.btn1, proportion = 1, flag = wx.RIGHT, border = 10)
vbox.Add(hbox2, proportion = 1, flag = wx.ALIGN_CENTRE)
vbox.Add(hbox1, proportion = 1, flag = wx.EXPAND|wx.ALIGN_CENTRE)
pnl.SetSizer(vbox)
self.Centre()
self.Show(True)
def OnClick(self, e):
wildcard = "Text Files (*.txt)|*.txt"
dlg = wx.FileDialog(self, "Choose a file", os.getcwd(), "", wildcard, wx.OPEN)
if dlg.ShowModal() == wx.ID_OK:
f = open(dlg.GetPath(), 'r')
with f:
data = f.read()
self.text.SetValue(data)
dlg.Destroy()
ex = wx.App()
Mywin(None, 'FileDialog Demo')
ex.MainLoop()
上記のコードは、次の出力を生成します-
File Dialog Demo Choose a File File Dialog Demo Output
wx.FontDialogクラス
このクラスのオブジェクトは、フォント選択ダイアログです。 このダイアログの表示もOS固有です。 名前、サイズ、重量などの属性 選択したフォントのが、このダイアログの戻り値として返されます。
このクラスコンストラクターに必要なFontdataパラメーターは、これらの属性を初期化するために使用されます。
wx.FontDialog(parent, data)
このクラスのGetFontData()メソッドには、選択したフォントのパラメーターが含まれています。
FontDialogの使用方法を示す次のコードには、ボタンとラベル(StaticTextオブジェクト)があります。
self.text = wx.StaticText(pnl, label = "hello")
self.btn1 = wx.Button(pnl, label = "Choose Font")
ボタンをクリックすると、OnClick()イベントハンドラー関数がトリガーされます。
def OnClick(self, e):
dlg = wx.FontDialog(self,wx.FontData())
if dlg.ShowModal() == wx.ID_OK:
data = dlg.GetFontData()
font = data.GetChosenFont()
self.text.SetFont(font)
dlg.Destroy()
次に、選択したフォントがラベルのテキストに適用されます。
完全なコードは次のとおりです-
import wx
import os
class Mywin(wx.Frame):
def __init__(self, parent, title):
super(Mywin, self).__init__(parent, title = title, size = (250,200))
self.InitUI()
def InitUI(self):
self.count = 0
pnl = wx.Panel(self)
vbox = wx.BoxSizer(wx.VERTICAL)
hbox1 = wx.BoxSizer(wx.HORIZONTAL)
hbox2 = wx.BoxSizer(wx.HORIZONTAL)
self.text = wx.StaticText(pnl, label = "hello")
self.btn1 = wx.Button(pnl, label = "Choose Font")
self.Bind(wx.EVT_BUTTON, self.OnClick, self.btn1)
hbox1.Add(self.text, proportion = 1, flag = wx.ALIGN_CENTRE)
hbox2.Add(self.btn1, proportion = 1, flag = wx.ALIGN_CENTRE, border = 10)
vbox.Add(hbox2, flag = wx.ALIGN_CENTRE)
vbox.Add(hbox1, proportion = 1, flag = wx.ALIGN_CENTRE)
pnl.SetSizer(vbox)
self.Centre()
self.Show(True)
def OnClick(self, e):
dlg = wx.FontDialog(self,wx.FontData())
if dlg.ShowModal() == wx.ID_OK:
data = dlg.GetFontData()
font = data.GetChosenFont()
self.text.SetFont(font)
dlg.Destroy()
ex = wx.App()
Mywin(None,'FileDialog Demo')
ex.MainLoop()
上記のコードは、次の出力を生成します-