本記事は、
- Pythonのスキル、初心者以上の方
- wxPythonの、イベントハンドラをご存知の方
を対象にした内容になっております。
イベントハンドラに関しては、第5回の記事で、ご紹介しております。
ご存知ない方は、先にそちらを読まれる事を、オススメします。
本記事は、連載記事となっています。(全7回)
一連の記事を読むことで、
- かっこよくて
- おしゃれな
「簡単なGUIアプリ」を作成できるようになります。
例えば、wxPythonで、画像表示アプリを作ってみました。
上記みたいな、見た目(Macの場合)となります。
本記事は、下記の続編となります。
本記事のゴール設定
- ファイルダイアログの作成
としております。
本記事では、
- 特定のファイル(PNGとか)のみを、ダイアログで選択する方法を、
- オリジナルで作成した、簡単な画像表示アプリを使って、
ご紹介します。
ファイルダイアログの作成
ファイルダイアログとは?
ポップアップで出現する、ファイル選択ウィンドウになります。
下記を、ご参照ください。
例)PNGファイルのみ、選択可能にした場合(Macの場合)
(PNGファイルのみ、選択できるアクティブな状態になっています。)
解説用の、オリジナル画像表示アプリの紹介
- 画像を表示する、ウィジェット1個と
- 画像選択のための、ボタンを1個
を配置しただけの、簡単なアプリです。
<事例アプリの見た目>
本コードをWindowsで作られる方へ:
Macで本記事のコードを実行すると、
- 画像がウインドウ内におさまるよう、サイズが自動調整されますが、
Windowsの場合、自動調整されません。
(例えば、大きい画像サイズの場合、ウインドウからはみだします。結果、一部のみが表示されてしまいます。)
画像サイズを調整するコードは、本記事の趣旨とズレるため、割愛しております。
ご了承の程、よろしくお願いします。
<事例アプリの、Pythonコード>
下記、Pythonコード中の
- 22〜24行目部分:イベントとイベントハンドラの関連付け
- 26〜28行目部分:イベントハンドラの記載
を、今後の章で紹介します。
import wx
class MyPanel(wx.Panel):
def __init__(self, parent):
super().__init__(self, parent)
# # bitで表現させる
bitmap = wx.Image('gazou.png').ConvertToBitmap()
# # イメージコントロールを配置
self.image = wx.StaticBitmap(parent=self,
bitmap=bitmap,
size=bitmap.GetSize()
)
image.SetBackgroundColour('white')
button = wx.Button(self, -1, 'Open_File')
box_sizer = wx.BoxSizer(wx.VERTICAL)
box_sizer.Add(image, 1, wx.EXPAND)
box_sizer.Add(button, 0, wx.ALIGN_CENTER | wx.ALL, 10)
self.SetSizer(box_sizer)
######################################################
# この部分に、イベントとイベントハンドラを関連付ける処理を記載
######################################################
######################################################
# この部分に、イベントハンドラを記載
######################################################
class MyFrame(wx.Frame):
def __init__(self):
super().__init__(None, id=-1, title='wxPython')
MyPanel(self)
self.Show()
if __name__ == '__main__':
app = wx.App()
frame = MyFrame()
app.MainLoop()
ファイルダイアログの作り方
イベントとイベントハンドラを関連付ける処理
上記コードの、22〜24行目に入るコードです。
「Open_File」ボタンの「クリック」イベントと、「OnBrowse」メソッドをBindします。
button.Bind(wx.EVT_BUTTON, self.OnBrowse)
ファイルダイアログ作成部分
26〜28行目に入るコードです。
def OnBrowse(self, event):
with wx.FileDialog(self, 'Select Image File',
wildcard='PNG files (*.png)|*.png',
style=wx.FD_OPEN) as dialog:
if dialog.ShowModal() == wx.ID_OK:
bitmap = wx.Image(dialog.GetPaths()[0]).ConvertToBitmap()
self.image.SetBitmap(bitmap)
self.Layout()
コードの解説
2行目 wx.FIleDialog( )に関して
- 第1引数:親を指定
- 第2引数:ポップアップウィンドウの、上部に表示される文字を指定
- wildcard引数:選択できるファイルを指定 (書式: 任意の文字列(ファイル形式)|ファイル形式 )
- * (アスタリスク)は、任意の0文字以上の文字列を、現します。
- 複数指定の場合は、’JPG and PNG files (*.jpg;*.png)|*.jpg;*.png’, のように記載
- style引数:スタイルを指定(次の章で、ご紹介しています。)
5行目 dialog.ShowModal()に関して
- モーダルな状態(開いている間、他
ウインドウ
で、ユーザ入力を受け付けない状態)で、ポップアップウインドウを開く - 「OK」ボタン等の押下げにより、ポップアップウインドウが閉じられたら、押されたボタンのID番号が返る。(「OK」ボタンなら〇〇番、「Cancel」ボタンなら△△番など。ちなみに、コード中の「wx.ID_OK」は、数字の5100が代入されている。)
6行目 dialog.GetPaths()[0]に関して
- ファイルダイアログで選択した、ファイルパスを、取得できます。
- ファイルは、複数選択可能なので、リストで返ってきます。(コードでは、リストの1番目sを取得しています。)
最後の行:self.Layout( )に関して:
レイアウトを強制的に、再調整するメソッドです。
このコードの実行結果が、下図です。
このメソッドを使用せずに、サイズの大きな画像を選択すると、下記のように、レイアウトが崩れてしまいます。
ファイルダイアログ スタイルの種類
ファイルダイアログのスタイルで、よく使用するものを3つ、ご紹介します。
前章で紹介した、wx.FIleDialog ( )メソッドのstyle引数で、変更します。
style=wx.FD_OPEN で設定した場合
style=wx.FD_SHOW_HIDDEN で設定した場合
隠しファイルも含めて、表示されます。
style=wx.FD_SAVE で設定した場合
ファイル保存ダイアログが開きます。
上記の「Save」をクリックすると、メソッドの返り値が、「wx.ID_SAVE」 になります。
ちなみに、「Cancel」ボタンを押した場合は、「wx.ID_CANCEL」が返ります。
style=wx.FD_OVERWRITE_PROMPT で設定した場合
同じく、ファイル保存ダイアログが開きます。
ただ保存する時に、「ファイルを上書き」するかどうか、聞いてきます。
実際の使用は、「wx.FD_SAVE」と併用して、下記のようなコードとなります。
wx.FileDialog(self, 'Select Image File',
wildcard='PNG files (*.png)|*.png',
style=wx.FD_SAVE | wx.FD_OVERWRITE_PROMPT)
次回予告
wxPythonの紹介記事、長い連載となってしまいました。
ここまで読んで下さった方、本当にありがとうございます。
シリーズものの記事で、全記事をご購読される方は大変少なく、全記事を読まれた方は、正直「すごい!」と思います。
正直、筆者なら、途中で挫折していると思います(笑)
ここまで来ると、必定な情報をネットで調べながら、簡単なアプリは作れる状態になっていると思います。
是非、楽しいアプリを作ってみて下さい!
(筆者にもご紹介頂けますと、嬉しい限りです。)
次回は、
- exe(Windows)、app(Mac)ファイルにビルドする方法
を紹介して、本シリーズの最後にしたいと思います。
記事が完成しましたら、下記にリンクを貼り付けます。
それでは、次回もまた、お会いしましょう!