【python】作りながら覚えるデスクトップアプリ開発|PySimpleGUI

python

3ページ目です。

前回、せっかく作ったウィンドウですが、EXEになっていないと使いにくいと感じませんか?

①Jupyter Notebook を起動
②コーディングしたファイルを選ぶ(どれだっけ?)
③テストしたコードの中から完成したコードを選ぶ
④実行する➔インポートしてないとエラー
⑤必要なコードを実行➔やっとウィンドウが表示される

こんなことになっていませんか?

EXE ならアイコンをダブルクリックで起動しますよね。

今後、カスタマイズをしていくにしても、途中のバージョンを EXE にしておくと、使う機会が増えて、不具合やバグを見つけやすくなります。

というわけで、今回は EXE化してみようと思います。

  1. Jupyter Notebook とPySimpleGUIで作ったGUI のEXE化
    1. .ipynb を .py で出力
    2. Anaconda Prompt で pyinstaller を実行
    3. エラーの発生と対処方法

Jupyter Notebook とPySimpleGUIで作ったGUI のEXE化

Jupyter Notebook の拡張子は「*.ipynb」なので、EXE 化するには標準的なpython拡張子「*.py」にする必要がありますね。

.ipynb を .py で出力

準備として、Jupyter Notebook で新規 Notebook を作り、「JSON_URL_Opener」とリネームしてください。

コードは、前回完成した以下のコードをコピペしてください。

import PySimpleGUI as sg
import webbrowser
import json
import os

#このぺーじのリンク
link='https://bliss-growth.com/python_pysimplegui/'

#jsonファイルのパスを指定
json_path = os.path.join('json','sitelist.json')  #相対パス

def read_json():
    #jsonの読み込み
    with open(json_path, encoding="utf-8_sig") as f:
        json_load = json.load(f)
    return json_load

def make_list(dic):
    sites=dic['site']
    key_list = []
    val_list = []
    for s_key,s_val in sites.items():
        key_list.append(s_val)
        val_list.append(s_val)
    return key_list,val_list

json_dict = read_json()
keys,vals = make_list(json_dict)

#レイアウトの作成
layout = [
    [sg.Text('よなをブログ')],
    [sg.Text('【python】作りながら覚えるデスクトップアプリ開発')],
    [sg.Text('PySimpleGUI基礎~')],
    [sg.Multiline(link,size=(50,2), key='-URL-')],
    [sg.Submit(button_text='URLを表示')],
    [sg.Listbox(vals,size=(50,5), key='-LIST-',select_mode=sg.LISTBOX_SELECT_MODE_SINGLE,enable_events=True)],
]

window = sg.Window('PySimpleGUIでGUI作成', layout)

while True:
    event, values = window.read()
    
    if event is None:
        print('exit')
        break
        
    if event == 'URLを表示':
        webbrowser.open_new(values['-URL-'])
        
    if event == '-LIST-':
        value = str(values['-LIST-'][0])
        webbrowser.open_new(value)
        
window.close()

動作確認をしてウィンドウが表示され、正しく動作するか、エラーが出ないかを確認しましょう。

メニューのFile > Downlaod as > Python (.py) を選択してください。

Download フォルダに「JSON_URL_Opener.py」が保存されます。

Anaconda Prompt で pyinstaller を実行

Anaconda をインストールしていることを前提に書いていきます。

Anaconda Prompt を起動すると下記のような表示になっていると思います。

(base) C:\Users\username>

C:\Users\username(username はご自分のユーザー名)をエクスプローラで開き、「py2exe」フォルダを作成して、先ほどダウンロードフォルダに保存された「JSON_URL_Opener.py」を移動してください。

また、コード内で参照している JSON ファイル「sitelist.json」も「py2exe」フォルダに「json」フォルダを作成して、その中に保存してください。

Anaconda Prompt を起動して下記のように pyinstaller をインストールを実行してください。

conda install pyinstaller

インストールが終わったら、下記のコードを実行してディレクトリを「py2exe」に移動させます。

cd py2exe

ちなみに cd はカレントディレクトリを変更するコマンドです。

さあ、準備が整い、いよいよEXE化を実行するときが来ました。

下記のコマンドを実行してください。

pyinstaller JSON_URL_Opener.py --clean -F

EXE の作成が終わったら、py2exe フォルダ配下に「dist」フォルダがあり、その中に「JSON_URL_Opener.exe」があります。

早速、ダブルクリックで起動してみましょう。

エラーの発生と対処方法

「ん?」なにやらコマンド画面に文字が書かれてすぐに画面ごと消えますが、早くて読めません。

文字が表示されてから画面が消えるまでの一瞬をキャプチャして確認します。

「dist フォルダの下に、json\sitelist.json が見つかりません!」と怒っていますね(笑)

では、「json」フォルダごと、「JSON_URL_Opener.exe」のある「dist」フォルダにコピーしてみましょう。

そして、EXE を実行してみると。

exeから起動した

今度はちゃんとウィンドウが表示されました。

きっと、コード内部で固定のパスを書いて参照することは「想定外」なのでしょうね。

「sitelist.json」のあるカレントディレクトリに「json」フォルダを置いてから pyinstaller を実行してみましたが、「dist」フォルダにコピーしてはくれませんでした。

まあ、ちゃんと起動できたので良しとしましょう。

EXE のショートカットをデスクトップやタスクバーなど目立つところに置いて使ってください。


今回はここまでです。

また次回お会いしましょう。

コメント

タイトルとURLをコピーしました