2016-02-24 12 views
11

Tkinterモジュールを使用してGUIを作成してテストしています。私はPILを使ってGUIに画像を追加しようとしていました。TKフレームワークの二重実装問題

import Tkinter as tk 
from PIL import Image, ImageTk 

root = tk.Tk() 
root.title('background image') 

imfile = "foo.png" 
im = Image.open(imfile) 
im1 = ImageTk.PhotoImage(im) 

私はこのコードを実行すると、私はセグメンテーション違反につながるいくつかのエラーを思い付く:私のコードは次のようになります。

objc[5431]: Class TKApplication is implemented in both/Users/sykeoh/anaconda/lib/libtk8.5.dylib and /System/Library/Frameworks/Tk.framework/Versions/8.5/Tk. One of the two will be used. Which one is undefined. 
objc[5431]: Class TKMenu is implemented in both /Users/sykeoh/anaconda/lib/libtk8.5.dylib and /System/Library/Frameworks/Tk.framework/Versions/8.5/Tk. One of the two will be used. Which one is undefined. 
objc[5431]: Class TKContentView is implemented in both /Users/sykeoh/anaconda/lib/libtk8.5.dylib and /System/Library/Frameworks/Tk.framework/Versions/8.5/Tk. One of the two will be used. Which one is undefined. 
objc[5431]: Class TKWindow is implemented in both /Users/sykeoh/anaconda/lib/libtk8.5.dylib and /System/Library/Frameworks/Tk.framework/Versions/8.5/Tk. One of the two will be used. Which one is undefined. 
Segmentation fault: 11 

私はオンライン見てきたし、それは私のシステムライブラリ内のTkのフレームワークとアナコンダライブラリ内の他の問題になりそうです。しかし、いずれのソリューションも本当にうまく動作していませんでした。可能な解決策または回避策はありますか?

ImageTk.Photoimageを実行すると問題が発生します。そのコード行を削除しても問題はありません。

+0

「IDLE」または「ターミナル」で同じコードを実行できますか?これが「anaconda」固有の質問であれば、設定に関するより具体的な情報を提供する必要があるかもしれません。 –

+0

元のPILまたはPillowを使用していますか? –

答えて

9

私は賞金を創出したことを知っていますが、私は気難しく、調査することに決めました。今は私のために働くものがあります。私はかなりので、同じように、コマンドラインに渡された画像を表示するためのTkinterを使用しようとする以外に何もしないされ、あなたに非常によく似たPythonの例があります。何が起こっている

calebhattingh $ python imageview.py a.jpg 
objc[84696]: Class TKApplication is implemented in both /Users/calebhattingh/anaconda/envs/py35/lib/libtk8.5.dylib and /System/Library/Frameworks/Tk.framework/Versions/8.5/Tk. One of the two will be used. Which one is undefined. 
objc[84696]: Class TKMenu is implemented in both /Users/calebhattingh/anaconda/envs/py35/lib/libtk8.5.dylib and /System/Library/Frameworks/Tk.framework/Versions/8.5/Tk. One of the two will be used. Which one is undefined. 
objc[84696]: Class TKContentView is implemented in both /Users/calebhattingh/anaconda/envs/py35/lib/libtk8.5.dylib and /System/Library/Frameworks/Tk.framework/Versions/8.5/Tk. One of the two will be used. Which one is undefined. 
objc[84696]: Class TKWindow is implemented in both /Users/calebhattingh/anaconda/envs/py35/lib/libtk8.5.dylib and /System/Library/Frameworks/Tk.framework/Versions/8.5/Tk. One of the two will be used. Which one is undefined. 
Segmentation fault: 11 

バイナリファイルということです、~/anaconda/envs/py35/lib/python3.5/site-packages/PIL/_imagingtk.soはフレームワークにリンクされており、envのTcl/Tkライブラリにはリンクされていません。

(py35) ~/anaconda/envs/py35/lib/python3.5/site-packages/PIL 
calebhattingh $ otool -L _imagingtk.so 
_imagingtk.so: 
     /System/Library/Frameworks/Tcl.framework/Versions/8.5/Tcl (compatibility version 8.5.0, current version 8.5.9) 
     /System/Library/Frameworks/Tk.framework/Versions/8.5/Tk (compatibility version 8.5.0, current version 8.5.9) 
     /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 159.1.0) 
     /usr/lib/libgcc_s.1.dylib (compatibility version 1.0.0, current version 1.0.0) 

は、これら二つの「フレームワーク」の行を参照してください:あなたは、リンクの設定を参照してくださいotoolを使用してこれを見ることができますか?アナコンダでは、それを望んでいません。私たちはenvのライブラリを使いたいと思っています。だから彼らを変えよう!

まず(場合には、あなたが戻したい)バイナリのバックアップを行います。

$ cp _imagingtk.so _imagingtk.so.bak 

は今(あなたがenvname/libと同じフォルダにあると仮定した場合)、コマンドラインでこれを実行します。

$ install_name_tool -change "/System/Library/Frameworks/Tk.framework/Versions/8.5/Tk" "@rpath/libtk8.5.dylib" _imagingtk.so 
$ install_name_tool -change "/System/Library/Frameworks/Tcl.framework/Versions/8.5/Tcl" "@rpath/libtcl8.5.dylib" _imagingtk.so 

あなたはそこに@rpathビットが表示されますか?つまり、のパスにあるのいずれかが見つかります。アナコンダにはうってつけの作品です。 _imagingtk.soライブラリ内のリンクは次のようになります。この後

(py35) ~/anaconda/envs/py35/lib/python3.5/site-packages/PIL 
calebhattingh $ otool -L _imagingtk.so 
_imagingtk.so: 
     @rpath/libtcl8.5.dylib (compatibility version 8.5.0, current version 8.5.9) 
     @rpath/libtk8.5.dylib (compatibility version 8.5.0, current version 8.5.9) 
     /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 159.1.0) 
     /usr/lib/libgcc_s.1.dylib (compatibility version 1.0.0, current version 1.0.0) 

、あなたのコードが実行されます。誰かがおそらくこの上流を取得しようとする必要があります。

補遺:Pythonディストリビューションに結合Tkinterの、すなわち、現在アクティブなcondaのENVは、以下のリンクがあります

~/anaconda/envs/py35/lib/python3.5/lib-dynload 
calebhattingh $ otool -L _tkinter.cpython-35m-darwin.so 
_tkinter.cpython-35m-darwin.so: 
     @loader_path/../../libtcl8.5.dylib (compatibility version 8.5.0, current version 8.5.18) 
     @loader_path/../../libtk8.5.dylib (compatibility version 8.5.0, current version 8.5.18) 
     /usr/lib/libgcc_s.1.dylib (compatibility version 1.0.0, current version 1.0.0) 
     /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 111.0.0) 

ご希望の場合は、むしろ代わりに@loader_path/../../を使用するようにinstall_name_toolを使用することができます私が上記で使用したもののうち、@rpath/。それは、おそらくでも動作し、さらに良いかもしれません。

+1

それは私のために働いています、ありがとう! また、単純なコマンドでシステムTkinterにリンクされたバイナリを見つけることができます: 'grep -rnw 'Tk.framework'と' grep -rnw 'Tcl.framework' – lucidyan

+0

ありがとうございます。コンダのバグですか? – Gus

+0

いいえ、私はそれが枕と関係があると思います。パッケージがcondaパッケージの場合、そのバグは正しく構築されていないということです。パッケージがpipインストールされていれば(私は覚えていません)、コンドーム環境にインストールされているnon-condaパッケージが動作することを期待していました; –

2

私は図書館で

  • システムのTcl/Tkのライブラリパスにリンクされ、私はバイナリを見つけしよう(matplotlibのに問題だった私の場合)

    • をこの問題の私自身の調査をしてみてくださいファイルが見つかりました。これは本当に面白いようです。これは、名前の名前osx-tk.patchを持っていると私は間違ったパッケージのインストールについての最終的確信になったパッチとConda documentationを読んだ後GitHub

    • 見つかりosx-tk.patch~/anaconda/pkgs/matplotlib-1.5.1-np111py35_0/info/recipe/に置かれた、と私はmatplotlibのインストールのためにpipを使用したことを、覚えておいてください!

    • 私は今、すべてが魔法のように働き始めpipで古いパッケージを削除し、conda install matplotlibコマンド

    • で新しいものをインストール!

    簡単な要約:condaは特別recipes、conda仮想環境

    をに正しくパッケージをインストールするにはどのようにそのポイントのインストーラを使用して可能性があるため

    conda環境でpipパッケージマネージャを使用して、私は、私の依存関係を台無し

    超短要約:

    依存関係のあるパッケージを完全に削除し、ag condaパッケージマネージャ(のみ困難な場合での使用の再バインド)

  • +0

    これは私が考慮しなかった非常に興味深い点です。私はかなりコンドームを通してピローをインストールすることはかなり確信していますが、パッケージが同じenvにcondaとpipの両方でインストールされている他の状況については検討する価値があります。 –

    0

    とAIN私は@cjrhが_imagetk.soのために言ったまさにでしたが、代わりに~/anaconda/lib/python3.5/lib-dynload/_tkinter.soため、それは素晴らしい仕事を!

    cd ~/anaconda/lib/python3.5/lib-dynload 
    
    $ install_name_tool -change "/System/Library/Frameworks/Tk.framework/Versions/8.5/Tk" "@rpath/libtk8.5.dylib" _tkinter.so 
    $ install_name_tool -change "/System/Library/Frameworks/Tcl.framework/Versions/8.5/Tcl" "@rpath/libtcl8.5.dylib" _tkinter.so