LoginSignup
shirousagi123
@shirousagi123 (Y K)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

Pyinstallerを用いたスクリプトのapp化における不完全なGUI

解決したいこと

PythonでPyinstallerを用いてスクリプトのapp化を試みました。
しかし、スクリプトファイルでの実行ではGUIの表示含め全て正常に起動することを確認できているのにも関わらず、
作成したappではGUIが不完全に表示されてしまいます。
特にエラーコードも出ていません。
原因は何だと考えられますでしょうか?
また、何か解決策はございますでしょうか?

発生している問題・エラー

画像左がスクリプトファイルでの実行結果、画像右がappでの実行結果
スクリーンショット 2024-05-27 12.55.39.png

使用しているライブラリ、モジュール

main.py
import os
import tkinter as tk
from tkinter import messagebox, ttk, Frame, Label, filedialog
from tkcalendar import Calendar
import pandas as pd
import matplotlib.pyplot as plt
from datetime import datetime
# 作成した外部モジュール
from DownloadFromDropbox import START_DOWNLOAD

DownloadFromDropbox.py
import dropbox
import os
import tkinter as tk
import concurrent.futures

実行コマンド

pyinstaller --onefile --noconsole --clean --windowed --name=AnalysisChamber main.py

自分で試したこと

auto-py-to-exe を実行して使用したり、--noconsoleをオフにしてコンソールにて出力を確認したり、--debugにて内容を確認したりしていますが、特にwarningやエラーは出ておらずsuccessとなっています。

環境

・MacOS
・Python 3.12.2 64-bit
・VScode

1

3Answer

皆様コメント大変ありがとうございました。
おかげさまで解決に至り、無事に開発環境だけではなくappで実行することが出来ました。
いくつかの要因が重なったことにより生じていたようでしたが、
最も支配的な要因は@suipy様が仰られていたpyinstaller実行時に以下のオプションを追加することでした。

--hidden-import babel.numbers

babel依存の検出に問題が生じているのにも関わらず、
コンソールへのエラー出力無しでGUIのカレンダー表示処理が止まるのみという場合もあるようですね。

また、今回は原因ではございませんでしたが@nak435様が仰る
Macはセキュリティが厳しいことによりappに個別に権限を付与する必要がある場合もある点について、
Windowsを主として使用している者として大変勉強になりました。

改めて、誠にありがとうございました。

<以下今回の問題に対する個人用メモ>
・--hidden-importに以下を追加
 ・babel.numbers
 ・DownloadFromDropbox ※自作外部モジュール
 ・matplotlib.pyplot
・開発環境スクリプトに以下を追加
 ・matplotlib.use('TkAgg') ※import matplotlibの直下
  →appだとこの追加をしないとグラフが描画されない

<実行コマンド>

pyinstaller --noconfirm --onefile --windowed --icon "画像path.png" --name "APPname" --clean --add-data "(念の為)外部モジュールpath:." --hidden-import "babel.numbers" --hidden-import "DownloadFromDropbox" --hidden-import "matplotlib.pyplot"  "APP化したいスクリプトのpath.py"
3

Rosettaで起動するとどうなりますか?

画面を見比べると、appの方は処理の途中で止まっていて、すべての情報が表示されていないようにも見えます。

Macはセキュリティが厳しいので、appに個別に権限を付与する必要があるのかも?
どんなリソースをアクセスしますか? dropboxのみ?

1

pyinstaller実行時に以下のオプションを追加してみてください。

--hidden-import babel.numbers

Pyinstallerでアプリケーションをバンドルするとき、tkcalendarのbabel依存の検出に問題が生じるみたいです。tkcalendarのHowToに記載されています。
私も似たような現象が発生しましたが、上記のコマンドで解決しましたのでご参考にしてください。

1

Your answer might help someone💌