3

Tkinter ウィジェットを使用して写真の修正を表示するための単一の slideshow.py ファイルを作成しました。これは、Windows と Linux で完全に動作します。Python と tcl がインストールされていない Windows で実行するには、py2exe を使用して win32 実行可能ファイルにコンパイルします。setup.py は簡単です。

from distutils.core import setup
import py2exe
setup(windows=["slideshow.py"])

次に、「python setup.py py2exe」を実行すると、c:\Users\d2xia\ccm_wa\utils\tfps\ に「dist」フォルダーが生成され、「tcl」、「library.zip」、「slideshow.exe」、その下など。

slideshow.exe を実行すると、次のエラーが発生します。

Traceback (most recent call last):
  File "slideshow.py", line 45, in <module>
  File "Tkinter.pyc", line 1685, in __init__
_tkinter.TclError: Can't find a usable init.tcl in the following directories: 
    C:/Users/d2xia/ccm_wa/utils/tfps/lib/tcl8.5 C:/Users/d2xia/ccm_wa/utils/tfps/lib/tcl8.5 C:/Users/d2xia/ccm_wa/utils/lib/tcl8.5 C:/Users/d2xia/ccm_wa/utils/tfps/library C:/Users/d2xia/ccm_wa/utils/library C:/Users/d2xia/ccm_wa/utils/tcl8.5.11/library C:/Users/d2xia/ccm_wa/tcl8.5.11/library

tcl8.5 と tk8.5 は実際には "tcl" フォルダーの下にありますが、py2exe によって生成された exe はまだ "lib" または "library" の下にあるようで、正しい TCL_LIBRARY と TK_LIBRARY が設定されていないようです。

「tcl」の名前を「lib」に変更しても、同じエラーが発生します。

set TCL_LIBRARY=c:\Users\d2xia\ccm_wa\utils\tfps\dist\tcl\tcl8.5\
set TK_LIBRARY=c:\Users\d2xia\ccm_wa\utils\tfps\dist\tcl\tk8.5\

次に、slideshow.exe がいくつかの新しいエラーを生成します。

c:/Users/d2xia/ccm_wa/utils/tfps/dist/tcl/tcl8.5/init.tcl: version conflict for package "Tcl": have 8.5.11, need exactly 8.5.2
version conflict for package "Tcl": have 8.5.11, need exactly 8.5.2
    while executing
"package require -exact Tcl 8.5.2"
    (file "c:/Users/d2xia/ccm_wa/utils/tfps/dist/tcl/tcl8.5/init.tcl" line 20)
    invoked from within
"source c:/Users/d2xia/ccm_wa/utils/tfps/dist/tcl/tcl8.5/init.tcl"
    ("uplevel" body line 1)
    invoked from within
"uplevel #0 [list source $tclfile]"

C:\apps\git\lib\tcl8.5 に Tcl 8.5.11 があり、C:\Python27\tcl\tcl8.5 に Tcl 8.5.2 があります。python で実行すると、python インストールで tcl が検索されるようですパスですが、py2exe は git インストール パスで別のコピーに見えます。

1. dist を作成するときに、正しい tcl8.5 コピーを py2exe に「割り当てる」方法は? 2. 生成された実行可能ファイルに dist 内の tcl パスを認識させるにはどうすればよいですか? 「lib」または「library」の代わりに「tcl」

4

2 に答える 2

6

Tcl バージョン 8.5.11 & 8.5.2 の競合は、手動で tcl8.5、tk8.5、tcl85.dll、tk85.dll を Python インストール パスのものに置き換えることで解決されます。パス環境変数を変更することでも解決できると思います。 . ただし、TCL_LIBRARY と TK_LIBRARY を手動で設定する必要があるため、Windows バッチ ラッパー test.bat を作成しました。

set TCL_LIBRARY=.\tcl\tcl8.5\
set TK_LIBRARY=.\tcl\tk8.5\
slideshow.exe %1

これはうまくいきます。より良いアイデアはありますか?

于 2012-09-26T15:11:07.383 に答える
2

Tcl と Tk を正しくインストールすると、ビルド時にこれらの環境変数の正しい値が焼き付けられます。それらは、インストール前のテストを許可するためにのみ存在します (Tcl/Tk の開発者にとっては非常に便利ですが、それ以外の開発者にとっては避けるのが最善です)。それらが正しく接続されていない場合、または間違ったバージョンのスクリプト ライブラリが見つかった場合は、インストールに重大な問題があります。(これは、通常、インストール後に物を移動するべきではないことを意味しますが、ほとんどの人にとってはそれほど問題ではありません。)

この種の状況での通常のアドバイスは、Tcl と Tk のインストールを消去してからやり直すことです。オプションで正しいインストール場所が指定configureされていることを確認してください。--prefixPython の追加がどのように影響するかはわかりません。

于 2012-09-27T10:07:50.563 に答える