本記事は、
- 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?って方は、下記が参考になります。
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回目の記事で、紹介しています。
を記事にしました。
雑談
以下、完全に雑談です。
まとまりのない話になっています。
お時間が許せる方は、お付き合い頂けますと幸いです。
世間では、「クラウド、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等は既に対応済なので)
本当にとりとめのない話 & 筆者の偏見を、最後まで読んで頂き、ありがとうございました。
また、お会いしましょう。