Pythonスキルの習得

【 Python 】 かっこいいGUI wxPythonの使い方入門 その1

【 Python 】 かっこいいGUI wxPythonの使い方入門 その1

本記事は、

  • Pythonのスキル、初心者以上の方

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

本記事を含む、一連の記事を読むことで、(全7回)

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

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

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

右絵みたいな、見た目(Macの場合)になります。

wxPythonは

  • Windowsアプリの作成
  • Macアプリの作成

両方、対応しています。

注意点:

アプリにビルドする時に、各OSから、実行する必要があります。

つまり、Macから、Windowsアプリの作成はできません。

各GUIライブラリの特徴 と、なぜ wxPython?

Pythonの代表的なGUI作成ライブラリとして、以下のものが、挙げられます。

  • TkInter
  • PySide
  • PyQt
  • Kivy
  • wxPython

各ライブラリの特徴は、以下の通りです。

TkInter

  • Pythonの標準ライブラリ(インストール不要)
  • クロスプラットフォーム(WindowsやUnix等にて動作可能)
  • コードがシンプルで癖がない(学習しやすい)
  • 見た目が、少し古い(2022年時点、だいぶよくなりました。)

PySide

  • C++向けGUIフレームワーク「Qt」のPythonラッパー
  • GUIが簡単に作れる
  • クロスプラットフォーム対応(WIndows、Mac、Linux)
  • LGPLライセンス

PyQt

  • PySideと同じく、C++向けGUIフレームワーク「Qt」のPythonラッパー
  • クロスプラットフォーム対応(Windows、Mac、Linux、Android、IOS)
  • 処理速度が早い(C++で書かれている)
  • 付随するライブラリが豊富(SQL関係とか)
  • GPLライセンスと商用ライセンスで提供(商用では、制限がある。)

Kivy

  • GUIレイアウトを作るために、Kv言語を使用する。(学習コスト、少々発生)
  • クロスプラットフォーム対応(WIndows、Mac、Linux、Android、iOS、ラズパイ)
  • グラフィック処理が高速(OpenGL対応)
  • 処理速度が早い(処理が重いところは、Cで書かれている)
  • ゲームアプリ向け
  • MITライセンス(ver. 1.7.2以降)

wxPython

  • クロスプラットフォーム対応(Windows、Mac、Linux)
  • 処理速度が早い(C++で書かれている)
  • 動作が安定している
  • 付随するライブラリが豊富
  • 商用利用OK(wxWindows ライセンスという緩いライセンス)

まとめてみると

標準ライブラリ(TkInter)以外は、どのライブラリでも、

  • クロスプラットフォーム
  • 高速

等々の特徴は「同じである」と、うたっています。

一方、

  • ライセンス関係

が大きく違います。

本記事では、

  • 無料で商用利用でき、
  • 緩いライセンスが好きという方向けで、
  • GUIがかっこよくでき、
  • 学習コストが少ない

という観点から、wxPythonをご紹介しております。

wxPythonの環境構築(インストール方法)

wxPythonは、pipにてインストール可能です。

pip install wxPython

pip?って方は、下記が参考になります。

【Python】pipの使い型入門 - コマンドライン、Anaconda、PyCharmからの操作方法を解説 -
【Python】pipの使い方入門 - コマンドライン、Anaconda、PyCharmからの操作方法を解説 -Python入門者を対象に、pipの使い型を解説した記事です。 コマンドライン、Anaconda、PyCharmからの操作方法を、わかりやすく解説しました。 ...

wxPythonの使い方

wxPythonで、まずは空白ウィンドウを作ってみる

アプリ作成にあたり、wxPythonの構造をイメージで把握する

下図「wxPython」の構造を、分かりやすさ優先という事で、イメージで書いています。

  • まず、アプリ全体を管理するための、ウインドウアプリケーションを作ります。
  • 次にフレームと呼ばれる、トップウィンドウを作ります
  • このフレームの中に、ボタン等のコントールを、配置していきます。

クラスとか、難しいコードを使わずに作ってみる

import wx

# アプリケーションを作る
app = wx.App()
# Frameの作成
frame = wx.Frame(
    parent=None,
    id=-1,
    title='wxPython',
    size=(400, 400)
)
frame.Show()
app.SetTopWindow(frame)
app.MainLoop()

コードの説明

  • 4行目:wx.App()で、「ウインドウアプリケーション」を作成
  • 6行目:wx.Frame()で、「フレーム」を作成
    • parent=None(親要素を指定、フレームは親はいないのでNone)
    • id は自分自身を、一意の数字で表現。-1なら指定なし
    • title:タイトル名
    • size:立上げ時のウインドウサイズ
  • 12行目:Frame.Show()で、フレームを表示
  • 13行目:app.SetTopWindow(frame)で、つくったフレームを、トップウインドウに設定(省略可)
  • 14行目:app.MainLoop() にて、アプリケーション実行

実行結果

空のウインドウが表示されます。

クラスを使って、作ってみる

import wx

class MyFrame(wx.Frame):
    def __init__(self):
        super().__init__()
        self.SetId(-1)
        self.SetTitle('wxPython')
        self.SetSize((400, 400))
        self.Show()
    # 上記コードは以下のようにも、書ける
    #  super().__init__(None, -1, 'wxPython', (400, 400))
    #  self.Show()

if __name__ == '__main__':
    app = wx.App()
    frame = MyFrame()
    app.SetTopWindow(frame) # 省略可能
    app.MainLoop()

wx.Frameを継承したクラス(上記コードの、MyFrameクラス)にて、id、title、size等を設定する事ができます。

クラスを使った形が、標準です。

実行結果は、空白のウインドウが表示されます。(前章と同じです。)

画像を表示してみる

6行目 〜 14行目が追加の部分になります。

import wx

class MyFrame(wx.Frame):
    def __init__(self):
        super().__init__(None, id=-1, title='wxPython')
        # 画像表示部分
        # bitで表現させる 'gazou.png'は、画像ファイルパスに置換して下さい。
        bitmap = wx.Image('gazou.png').ConvertToBitmap()
        # イメージコントロールを配置
        wx.StaticBitmap(parent=self,
                        bitmap=bitmap,
                        size=bitmap.GetSize()
                        )
        self.SetClientSize(bitmap.GetSize())

        self.Show()

if __name__ == '__main__':
    app = wx.App()
    frame = MyFrame()
    app.MainLoop()

コードの説明

8行目:wxPythonで画像を扱うための処理です。 上記コード中の、’gazou.png’の箇所に、画像ファイルパスを指定します。

10行目:GUI上に画像を表示するための、「コントロール(GUI部品みたいなもの)」を設置しています。

  • 親のウインドウに、「self」つまり、MyFrameクラスを指定
  • 画像として、8行目で変換した画像を指定しています。

14行目:フレームのサイズを、画像サイズに併せて設定しています。

実行結果

予告

今後、wxPythonの続きを投稿する予定です。

次回は

  • 各コントロール(ボタンとか)の紹介
  • ボタンをクリックした時の操作 ← 第5回目の記事で、紹介しています。

を記事にしました。

【 Python 】 かっこいいGUI wxPythonの使い方入門 その2 - ウィジェットの紹介 -
【 Python 】 かっこいいGUI wxPythonの使い方入門 その2 - ウィジェットの紹介 -Pythonの、かっこいいGUIである、wxPythonの使い方を紹介した記事です。ウィジェットの紹介とコードによる配置方法を紹介しました。...

雑談

以下、完全に雑談です。

まとまりのない話になっています。

お時間が許せる方は、お付き合い頂けますと幸いです。

世間では、「クラウド、k8s、CICD、マイクロサービス、メタバース 等々」が流行している中、wxPythonが作る「PC用ネイティブアプリ」は、取り残されている感あります。そう思うのは、私だけでしょうか?

現代の「ネットとスマホの時代」、PC用ネイティブアプリの開発は、優先度は低いように感じてしまいます。

なぜなら、Webアプリや、スマホアプリで、ほとんどが代用できるからだと、思われます。(スプレッドシート等がいい例です。)

私自身、本記事のために、久しぶりに「PC用ネイティブアプリ作り」のためのコードを書いてみました。

すごく懐かしい感じを覚えました。

(もちろん業界により、違いはあると思います。日々、PC用ネイティブアプリを開発されている方々には、不快な思いをさせたかもしれません。その際は、お詫びいたします。)

思い返せば、Windowが95 とか 98 の時代は、Visual C++、Visual Basicが流行っており、PC用ネイティブアプリを作るのが当たり前でした。

(当時、まだ学生でしたが、「VIsual Basic」を買うのに(確か5万円位)、とても苦労した記憶が・・ それが今や無料版があります。)

その時代をインターネットが、流れを変えてしまいました。

ご存じの通り、技術の成長速度は、年々早まっています。

本記事は2022年3月時点に書いていますが、今後の20年は、過去120年分の技術進歩に相当すると、予測している研究者もいます。(技術の成長曲線に対し、外挿が当てはまると、その通りになるとの事。)

その時代にあって、PC用ネイティブアプリを作るニーズは、将来、あまり明るくないかもしれません。

既にBlenderみたいなソフトも、Steamを使って遠隔操作できるので、今後5G、6Gが普及してくと、ますますPC用ネイティブアプリの開発ニーズが、減少していきそうです。

(Blenderや、Steam自体が、PC用ネイティブアプリじゃん! というツッコミが入りそうですが(笑)。 ただ、既に遠隔で操作できるという事から、今後、Webアプリに置き換わっていくかな? と思った次第です。)

そんなネガティブな事も書きましたが、本当にちょっと動かすだけのアプリの場合、すぐに作れてリリースできるので、学習するメリットが十分にあると思っています。

またプログラム初心者にとって、リリースまで、それほどハードルが高くないのも、魅力だと思います。

(Webアプリをリリースしようと思うと、例えば、クラウドの設定、Webサーバの設定、DB関係、ドメインの設定、セキュリティー 等々、色々ありますし・・)

またwxPython自体もそのうち、AndroidやiOSに対応すると、勝手に思っています(笑)(PyQt等は既に対応済なので)

本当にとりとめのない話 & 筆者の偏見を、最後まで読んで頂き、ありがとうございました。

また、お会いしましょう。