Pythonスキルの習得

【 Python 】かっこいいGUI wxPythonの使い方入門 その6 – ファイルダイアログの作り方 紹介 –

【 Python 】かっこいいGUI wxPythonの使い方入門 その6 – ファイルダイアログの作り方 紹介 –

本記事は、

  • Pythonのスキル、初心者以上の方
  • wxPythonの、イベントハンドラをご存知の方

を対象にした内容になっております。

イベントハンドラに関しては、第5回の記事で、ご紹介しております。

ご存知ない方は、先にそちらを読まれる事を、オススメします。

本記事は、連載記事となっています。(全7回)

一連の記事を読むことで、

  • かっこよくて
  • おしゃれな

「簡単なGUIアプリ」を作成できるようになります。

例えば、wxPythonで、画像表示アプリを作ってみました。

上記みたいな、見た目(Macの場合)となります。

本記事は、下記の続編となります。

【 Python 】 かっこいいGUI wxPythonの使い方入門 その1
【 Python 】 かっこいいGUI wxPythonの使い方入門 その1Pythonの、かっこいいGUIである、wxPythonの使い方を紹介した記事です。...
【 Python 】 かっこいいGUI wxPythonの使い方入門 その2 - ウィジェットの紹介 -
【 Python 】 かっこいいGUI wxPythonの使い方入門 その2 - ウィジェットの紹介 -Pythonの、かっこいいGUIである、wxPythonの使い方を紹介した記事です。ウィジェットの紹介とコードによる配置方法を紹介しました。...
【 Python 】かっこいいGUI wxPythonの使い方入門 その3 - レイアウト( Panel , Sizer )の紹介 -
【 Python 】かっこいいGUI wxPythonの使い方入門 その3 - レイアウト( Panel , Sizer )の紹介 -Pythonの、かっこいいGUIである、wxPythonの使い方を紹介した記事です。wxPythonにおいて、レイアウト設計の考え方と設置方法をご紹介しました。パネルと、サイザー(wrapsizer、staticboxsizer、flexgridsizer、gridsizer、boxsizer)の概要説明と、Pythonによるコード紹介をした記事です。...
【 Python 】かっこいいGUI wxPythonの使い方入門 その4 – ステータスバー 、メニューバー の紹介 –
【 Python 】かっこいいGUI wxPythonの使い方入門 その4 – ステータスバー 、メニューバー の紹介 –Pythonの、かっこいいGUIである、wxPythonの使い方を紹介した記事です。wxPythonにおいて、ステータスバー、メニューバーの設置方法を、Pythonによるコードにて紹介した記事です。...
【 Python 】かっこいいGUI wxPythonの使い方入門 その5 – ボタン、メニュー選択等で発生する、イベントの処理方法 を紹介 –
【 Python 】かっこいいGUI wxPythonの使い方入門 その5 – ボタン、メニュー選択等で発生する、イベントの処理方法 を紹介 –Pythonの、かっこいいGUIである、wxPythonの使い方を紹介した記事です。wxPythonにおいて、メニューを選択したり、ボタン押下時等に発生する、イベントの処理方法を紹介した記事です。...

本記事のゴール設定

  • ファイルダイアログの作成

としております。

本記事では、

  • 特定のファイル(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)ファイルにビルドする方法

を紹介して、本シリーズの最後にしたいと思います。

記事が完成しましたら、下記にリンクを貼り付けます。

それでは、次回もまた、お会いしましょう!