71560


pyinstallerコマンドでbmi.py(Tkinterを利用してbmiの計算するGUIを表示するファイル)を単一実行ファイル化することはできたのですが、distフォルダ下のbmi.appファイルをダブルクリックしても一瞬Dockにアイコンが表示されて、すぐに消えてしまいます。

## pyinstallerのコマンド

[code]

    pyinstaller bmi.py --onefile --noconsole
    
[/code]

## bmi.py

[code]

    import tkinter as tk
    
    def calc_bmi():
        h = float(textHeight.get()) / 100
        w = float(textWeight.get())
        bmi = w / h ** 2
        rw = h ** 2 * 22
        per = int(w / rw * 100) - 100
        s = "肥満 {0}% (bmi={1})".format(per, bmi)
        labelResult['text'] = s
    
    win = tk.Tk()
    win.title('肥満判定')
    win.geometry("500x250")
    
    labelHeight = tk.Label(win, text=u'身長(cm):')
    labelHeight.pack()
    
    textHeight = tk.Entry(win)
    textHeight.insert(tk.END, '160')
    textHeight.pack()
    
    labelWeight = tk.Label(win, text=u'体重(kg):')
    labelWeight.pack()
    
    textWeight = tk.Entry(win)
    textWeight.insert(tk.END, '70')
    textWeight.pack()
    
    labelResult = tk.Label(win, text=u'---')
    labelResult.pack()
    
    calcButton = tk.Button(win, text=u'計算')
    calcButton["command"] = calc_bmi
    calcButton.pack()
    
    win.mainloop()
    
    
[/code]

### 環境

macOS Catalina  
バージョン10.15.7

Python 3.6.12  
PyInstaller 4.0  
Tkinter 8.6

### 調べたこと

pyinstallerのドキュメントをみると--noconsoleオプションに関して、以下のように記述されていました。

> WindowsおよびMacOS X：標準I / O用のコンソールウィンドウを提供しません。 **Mac OS Xでは、これによりOS
> X.appバンドルの構築もトリガーされます。**

確かにdistフォルダ下にはbmi(Unix実行ファイル)とbmi.app(アプリケーションファイル)が生成されています。

dist  
├── bmi  
└── bmi.app

bmi(Unix実行ファイル)をダブルクリックすると、コンソールが表示されてからGUIが表示されるのですが、--noconsoleオプションが機能していません。  
おそらく、bmi(Unix実行ファイル)は--
nosonsoleを指定しなくても同じように作成され同じ挙動なので、bmi.app(アプリケーションファイル)のほうがコンソールなしで起動できるのが正解だと思われます。

  
  
初めてpyinstallerを触ってみて調べても解決策がなかなか見つからなかったため、質問を投稿させて頂きました。 どなたか教えていただけると幸いです。


CC BY-SA 4.0
2020-10-26T12:32:49.963
71522
2020-12-07T06:41:36.897
2020-10-28T15:59:22.710
26370
36888
question
python macos tkinter gui pyinstaller
PyInstallerで--noconsoleオプション指定時に作成される.appファイルが起動しない


コメント欄で紹介して頂いた以下のサイトが参考になりました。

[PyInstaller - Standalone Python Applications for MacOS, Windows, and
Linux](https://jacob-brown.github.io/2019-09-10-pyinstaller/)

こちらのサイトによると以下のように書かれていました。

> -F, –onefile - App is bundled into a single file.Create a one-file bundled
> executable.If you are a MacOS user don’t use –onefile, I’ll elaborate below.

簡単な和訳  
_-F, -onefile
オプションで一つのファイルにバンドルできます。単一実行ファイルが作れます。もしあなたがMacOSユーザーなら、-onefileオプションは使わないでください。下に詳しく述べます。_

そしてその理由が以下のように記述されていました。

> Currently the pyinstaller build on MacOS uses an incompatible version of
> tcl, resulting in the app immediately crashing when it opens (i.e. if you
> follow the above). Below is a method which allows the application to be
> opened by editing the init.tcl file. I have written a python script which
> makes these changes.

簡単な和訳  
_現在のMacOSで動くpyinstallerはtclの互換性がないバージョンです。その結果、アプリ起動時にすぐにクラッシュしてしまいます。以下の方法によりinit.tclファイルを作ることでアプリケーションを開くことを可能にします。私はその変更を行うためのpythonのスクリプトを記述しました。_

このサイトを作成された方が [GitHub にそのスクリプトを公開されている](https://github.com/jacob-
brown/TCLChanger) ので、単一実行ファイル化したいファイル (私の場合bmi.py) のあるディレクトリで、その GitHub
のフォルダをクローンし実行することで解決できました。

以下が解決のためのコマンドです。(MacOSの場合)

  * 手順1 pyinstallerコマンド
[code]     pyinstaller --noconsole bmi.py

    
[/code]

  * 手順2 GitHub からクローンするコマンド
[code]     git clone https://github.com/jacob-brown/TCLChanger.git

    
[/code]

  * 手順3 クローンしたスクリプトを実行
[code]     python TCLChanger/TCLChanger.py

    
[/code]

同じように困っている方の参考になれば幸いです。


CC BY-SA 4.0
2020-10-28T08:10:06.450
71560
2020-12-07T06:41:36.897
2020-12-07T06:41:36.897
3060
36888
71522
answer