Wxpython-wx-dialog-class

提供:Dev Guides
移動先:案内検索

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()

上記のコードは、次の出力を生成します-

フォントダイアログのデモ出力