🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

5246閲覧

py2exeによるtkinterを含んだプログラムのexe化がうまくいかない

zzzTKG

総合スコア7

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/03/13 11:16

編集2021/03/13 11:20

前提・実現したいこと

現在Pythonで脱出ゲームを作成しています.身内で楽しむ程度の脱出ゲームですが,中にはPythonを導入していない人も居り,PC自体不得手な人も居るのでexeで配布しようと思います.最初はPyInstallerでexe化しようとしたのですが,Windows Defenderがトロイの木馬判定を下してしまい,ネットにある対策を試しましたが結果は同じだったのでpy2exeを使ってみようと思いました.py2exeで作成したdistファイルはウイルス判定されることなく,光明が見えたのですが,実行が上手くいきませんでした.
exe化の際,コマンドプロンプトでは1 missing Modulesと出ており,その時点で何か上手く読み込めなかったのかなと思いましたが案の定tkinter辺りで問題が発生したようです.
py2exeで作成したexeのエラー時にはlogがtxtファイルで出力されるようで,そこには

Traceback (most recent call last): File "脱出ゲーム_Python_.py", line 41, in <module> File "tkinter\__init__.pyc", line 2023, in __init__ _tkinter.TclError:

と出ております.tkinterのinitに問題があると捉え,対策を試みましたが上手くいかず,投稿させて頂きます.
この方法でなくとも,セキュリティソフトにウイルス判定されず,期待通りの動作をするexe化を可能にする方法をご存知の方いらっしゃいましたらご教示頂けると幸いです.

setup.pyの中身

http://april.fool.jp/blogs/2014/10/23/python-pyinstaller%E3%81%AE%E9%81%85%E3%81%95%E3%81%AB%E3%81%8C%E3%81%A3%E3%81%8B%E3%82%8A%E3%81%97%E3%81%A6py2exe%E3%81%AB%E3%81%97%E3%81%9F%E3%82%89%E7%88%86%E9%80%9F%E3%81%A7%E9%A9%9A%E3%81%84/
を参照しました.

Python

1from distutils.core import setup 2import py2exe, sys, os 3 4sys.argv.append("py2exe") 5 6setup(options={"py2exe":{"bundle_files":3}},zipfile=None, data_files=["C:\Program Files (x86)\Microsoft Visual Studio\Shared\Python37_64\tcl\tcl8.6\init.tcl"],windows=[{"script":"脱出ゲーム_Python_.py"}]) 7if hasattr(sys,"setdefaultencoding"): 8 import locale 9 lang,enc=locale.getdefaultlocale() 10 sys.setdefaultencoding(enc or "cp932") 11 del sys.setdefaultencoding

脱出ゲーム_Python_.pyの中身

基本機能の動作確認段階なので,セーブデータファイルやコンフィグファイルの作成,ボタンを押したら画像が出力されるだけのものです.

Python

1#!python3.7 2 3import tkinter as tk 4import os 5import re 6 7TestMode = True 8 9#reading savedata 10if os.path.isfile("savedata.txt"): 11 mysave = open("savedata.txt","r", encoding="UTF-8") 12 savedata = mysave.readlines() 13 mysave.close 14else: 15 mysave = open("savedata.txt","x",encoding="UTF-8") 16 mysave.write("save1\n") 17 mysave.close() 18 mysave = open("savedata.txt","r",encoding="UTF-8") 19 savedata = mysave.readlines() 20 mysave.close() 21 22#reading config 23if os.path.isfile("config.txt"): 24 myconfig = open("config.txt","r", encoding="UTF-8") 25 config = myconfig.readlines() 26 SecondStage = config[0].replace("SecondStage = ","").strip() 27 ThirdStage = config[1].replace("ThirdStage = ","").strip() 28 myconfig.close 29else: 30 myconfig = open("config.txt","x", encoding="UTF-8") 31 configdefault=["SecondStage = False\n","ThirdStage = False\n"] 32 myconfig.writelines(configdefault) 33 myconfig.close() 34 myconfig = open("config.txt","r") 35 config = myconfig.readlines() 36 SecondStage = config[0].replace("SecondStage = ","").strip() 37 ThirdStage = config[1].replace("ThirdStage = ","").strip() 38 myconfig.close 39 40#set win 41win = tk.Tk() 42if SecondStage == "False": 43 TitleName = "???からの脱出" 44elif SecondStage == "True": 45 TitleName = "運命からの脱出" 46elif ThirdStage == "True": 47 TitleName = "選択からの脱出" 48if TestMode == True:TitleName = "テスト中" 49win.title(TitleName) 50cvs = tk.Canvas(width=880, height=495)#16:9 51cvs.pack() 52 53#set variables 54index = 0 55mouse_x = 0 56mouse_y = 0 57mouse_p = 0 58fnt = "Times New Roman" 59 60#relpos 61def relpx(value): 62 posx = re.findall("(\d*)x\d*", win.geometry()) 63 print(posx) 64 return int((int(posx[0])-4) * value) 65def relpy(value): 66 posy = re.findall("\d*x(\d*)", win.geometry()) 67 print(posy) 68 return int((int(posy[0])-4) * value) 69#def change_size(e): 70 71##img 72testimg = tk.PhotoImage(data=b'長すぎてサイトが応答停止するので省略します.自作の画像バイナリ文字列が記述されています.') 73 74 75#sound 76 77 78 79#get mousexyp 80def mouse_motion(e): 81 global mouse_x, mouse_y 82 mouse_x = e.x 83 mouse_y = e.y 84def mouse_Lpress(e): 85 global mouse_p 86 mouse_p = 1 87def mouse_release(e): 88 global mouse_p 89 mouse_p = 0 90win.bind("<Motion>", mouse_motion) 91win.bind("<Button-1>", mouse_Lpress) 92win.bind("<ButtonRelease>", mouse_release) 93 94def button1_pushed(): 95 global counter 96 counter+=1 97 label = tk.Label(text="gameover") 98 if counter==3:label.place(x=70, y=70) 99 100def start_btn(): 101 cvs.create_image(relpx(0.5),relpy(0.5),image=testimg,tag="mytest") 102 103def Main(): 104 global index 105 if SecondStage == "False" and ThirdStage == "False": 106 if index == 0: 107 print("-Firstタイトル画面") 108 index = 1 109 elif index == 1: 110 print("タイトル表示完了") 111 startbutton = tk.Button(win, text="はじめから",font=(fnt,24),command=start_btn) 112 startbutton.place(x=0,y=0) 113 index = 2 114 elif SecondStage == "True" and ThirdStage == "False": 115 print("-Second") 116 elif SecondStage == "True" and ThirdStage == "True": 117 print("-Third") 118 win.after(100, Main) 119 120 121def FirstSt(): 122 global index 123 124 125def SecondSt(): 126 global index 127 128 129def ThirdSt(): 130 global index 131 132Main() 133win.mainloop() 134

試したこと

https://shrkw.hatenablog.com/entry/20080825/py2exe_with_tkinterを参照してbundleを1から3にしましたが,同じエラーでした.
またlogのエラー情報を見てhttps://cloud6.net/so/python/1657804を参照し,data_filesの項を追加しました.が,logファイルの方には結局同じエラーが出ました.exe化時のコマンドプロンプトの方ではValueError: too many values to unpack (expected 2)というエラーも出ていました.

補足情報(FW/ツールのバージョンなど)

Windows10
Visual Studio
Python 3.7 (64-bit)

py2exeはhttps://github.com/py2exe/py2exe/releasesからpy2exe-0.10.2.1-cp37-none-win_amd64.whlをダウンロードしてVS内でpip installしました.

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

自己解決

原因を突き止めるためより簡易的なプログラムのexe化を幾つか試みていたところ,日本語を含んだファイル名("脱出ゲーム_Python_.py"など)の場合に同様のエラーが生じる傾向にありました.
Escape_pre_.pyといったファイル名ではエラーなく期待通りの動作をするexe化に成功しましたので恐らくpy2exeあるいはdistutilsが日本語を含むファイル名に対応していないことが原因と考えられます.
・追記
この問題,どうやらファイル名に限らずパスに日本語が含まれている時点でアウトなようです.日本語が含まれるフォルダに入れると同様のエラーが生じました.もし日本語が含まれていても実行可能にする方法をご存知の方いらっしゃいましたらご一報頂けますと幸いです.

投稿2021/03/15 05:08

編集2021/03/15 05:33
zzzTKG

総合スコア7

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

test_user_q

2021/12/21 05:54

`TCL_LIBRARY`の環境変数を相対パスで指定すると解決できましたので、共有します。 py2exeの script に指定したPythonファイルにおいて、import文の後に下記を入れてみてください。 ``` tcl_path = os.path.join(os.path.dirname(sys.executable), "lib", "tcl") base_path = os.path.dirname(sys.executable) os.environ["TCL_LIBRARY"] = os.path.relpath(tcl_path, base_path) ``` なお、現在のファイルパスは`__file__`など、いくつか指定方法がありますが、py2exeの場合、Noneになってしまうものがいくつかあるので、`sys.executable`を使用しています。 詳しくは下記を参考にしてください。 [Python exe化]実行ファイル化したPythonプログラムでは__file__を使わない方が良い。[path バグる原因] https://qiita.com/Authns/items/f3cf6e9f27fc0b5632b3
test_user_q

2021/12/21 06:00

環境によっては上記に加えて、ビルドした後にできるlib>tcl・tkフォルダの名前を「tcl8.6」「tk8.6」などバージョンを含む名前にしてやる必要があるようです。
guest

0

これでしょうか。

python - py2exeのTkinterの問題

投稿2021/03/13 11:24

ppaul

総合スコア24670

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

zzzTKG

2021/03/13 11:44

すみませんがそちらは「試したこと」の2つ目にあります通り,解決に至りませんでした.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問