2016-02-24 9 views
11

मैं टिंकर मॉड्यूल का उपयोग करके एक जीयूआई बनाने का परीक्षण कर रहा हूं। मैं पीआईएल का उपयोग कर जीयूआई में एक छवि जोड़ने की कोशिश कर रहा था। मेरा कोड इस तरह दिखता है:टीके फ्रेमवर्क डबल कार्यान्वयन समस्या

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 

मैं ऑनलाइन देखा है और यह मेरे सिस्टम पुस्तकालय में टी ढांचे और एनाकोंडा पुस्तकालय में दूसरे के साथ एक मुद्दा लग रहा है। हालांकि, समाधानों में से कोई भी वास्तव में काम नहीं कर रहा था। कोई भी संभावित समाधान या कामकाज?

यह समस्या चल रहा है ImageTk.Potoimage। अगर मैं कोड की उस पंक्ति को हटा देता हूं, तो कोई समस्या नहीं है।

+0

क्या आप एक ही कोड को 'आईडीईई' या टर्मिनल में चला सकते हैं? यदि यह एक 'एनाकोंडा' विशिष्ट प्रश्न है तो आपको सेटअप –

+0

के बारे में अधिक विशिष्ट जानकारी देने की आवश्यकता हो सकती है बस यह सुनिश्चित करने के लिए, क्या आप मूल पीआईएल, या तकिया का उपयोग कर रहे हैं? –

उत्तर

9

मुझे पता है कि मैंने बक्षीस बनाया है, लेकिन मुझे अधीरता मिली, जांच करने का फैसला किया, और अब मुझे कुछ ऐसा मिला है जो मेरे लिए काम करता है। मैं तुम्हारा काफ़ी मिलती-जुलती अजगर उदाहरण है, जो काफी अन्य कुछ नहीं से, Tkinter का उपयोग करें ताकि तरह एक छवि कमांड लाइन पर पारित कर दिया प्रदर्शित करने के लिए कोशिश करता है है:

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 को एक ढांचे से जोड़ा गया है, न कि एनवी में टीसीएल/टीसीसी libs।

(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) 

इस के बाद, अपने कोड चलेंगे। किसी को शायद इस अपस्ट्रीम को पाने का प्रयास करना चाहिए।

परिशिष्ट: 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) 

आप चाहें, तो आप बल्कि install_name_tool बजाय @loader_path/../../ उपयोग करने के लिए उपयोग कर सकते हैं मैंने ऊपर जो प्रयोग किया, यानी @rpath/। वह शायद भी काम करेगा, और यह भी बेहतर हो सकता है।

+1

यह मेरे लिए काम किया है, धन्यवाद! इसके अलावा, आप बाइनरी पा सकते हैं, जो सामान्य कमांड द्वारा सिस्टम टिंकर से जुड़ा हुआ है: 'grep -rnw 'Tk.framework'' और 'grep -rnw' tcl.framework '' – lucidyan

+0

इसके लिए बहुत बहुत धन्यवाद। तो क्या यह कोंडा में एक बग है? – Gus

+0

नहीं, मुझे लगता है कि यह तकिया के साथ करना है। यदि पैकेज एक कोंडा पैकेज था, तो बग यह है कि पीकेजी सही ढंग से नहीं बनाया गया था। यदि पैकेज पाइप-स्थापित था (मुझे याद नहीं है), तो बग मुझे उम्मीद कर रहा था कि एक कोंडा पर्यावरण में स्थापित एक गैर-कोंडा पैकेज काम करेगा;) –

2

मैं इस समस्या से अपने ही जांच करने

  • मैंने पाया बाइनरी करने की कोशिश, सिस्टम Tcl/टी लाइब्रेरी पथ के साथ जुड़े हुए (मेरे मामले कि matplotlib के साथ समस्या थी में) की कोशिश
  • पुस्तकालयों के साथ
  • मैं फ़ाइल मिली, जो वास्तव में दिलचस्प लगता है। यह नाम नाम osx-tk.patch है और GitHub

  • में ~/anaconda/pkgs/matplotlib-1.5.1-np111py35_0/info/recipe/

  • मिले osx-tk.patch स्रोतों में रखा गया था पैच और Conda documentation मैं अंत में गलत पैकेज स्थापना के बारे में विश्वास हो गया पढ़ने के बाद, और मुझे याद है, कि मैं matplotlib स्थापना के लिए इस्तेमाल किया pip !

  • मैं pip के साथ पुराने पैकेज को नष्ट कर दिया और conda install matplotlib कमांड के साथ नया एक स्थापित

  • अब सब कुछ एक आकर्षण की तरह काम शुरू कर दिया!

संक्षिप्त सारांश:

conda पर्यावरण के साथ pip पैकेज प्रबंधक का उपयोग करना, मैं अपने निर्भरता गड़बड़, क्योंकि conda विशेष recipes, उस बिंदु संस्थापक conda आभासी वातावरण

में सही ढंग से पैकेज स्थापित करने के लिए कैसे का उपयोग कर सकते हैं

अल्ट्रा-संक्षिप्त सारांश:

निर्भरता के साथ पूरी तरह से पैकेज हटाएं और इसे इंस्टॉल करें conda पैकेज प्रबंधक (उपयोग rebinding केवल मुश्किल मामलों में)

+0

यह एक बहुत ही रोचक बिंदु है जिसे मैंने नहीं माना था। मुझे काफी यकीन है कि मैं कंडो के माध्यम से पिल्लो स्थापित करता हूं, लेकिन यह अभी भी अन्य परिस्थितियों के लिए विचार करने योग्य है जहां संकुल एक ही एनवी में कोंडा और पीपी दोनों के साथ स्थापित होते हैं। –

0

मैं बिल्कुल किया जो @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 
संबंधित मुद्दे