py2app构建正常,但应用程序失败“_tkinter.TclError”(并且没有错误消息!)

时间:2015-10-23 05:05:12

标签: python-3.x tkinter py2app

我在py2app 0.9使用Mac OSX Yosemite 10.10.1运行Python 3.4来自anaconda发行版并使用Tcl 8.5

在之前的尝试中,构建会失败,但快速搜索会显示这些问题的解决方案(即在['tkinter', 'matplotlib']的OPTIONS中包含'packages':setup.py,并更改MachOGraph.py的第49行}:loader - > loader_path)

现在py2app完成构建,并在Alias模式下运行我的应用程序功能,但是当我以正常模式(python setup.py py2app)构建时,生成的应用程序将无法打开并且控制台显示以下回溯:

  

Traceback(最近一次调用最后一次):文件   “/Users/ryankeenan/Desktop/fishing/gui_test/dist/deani.app/Contents/Resources/boot.py”   第355行,在_run()文件中   “/Users/ryankeenan/Desktop/fishing/gui_test/dist/deani.app/Contents/Resources/boot.py”   第336行,在_run exec中(编译(source,path,'exec'),globals(),   globals())文件   “/Users/ryankeenan/Desktop/fishing/gui_test/dist/deani.app/Contents/Resources/deani.py”   第731行,在app = fishingapp()文件中   “/Users/ryankeenan/Desktop/fishing/gui_test/dist/deani.app/Contents/Resources/deani.py”   第536行,在 init tk.Tk。 init (self,* args,** kwargs)文件   “/Users/ryankeenan/Desktop/fishing/gui_test/dist/deani.app/Contents/Resources/lib/python3.4/tkinter/init.py”   第1851行,在 init self.tk = _tkinter.create(screenName,baseName,   className,interactive,wantobjects,useTk,sync,use)   _tkinter.TclError

令人沮丧的是,它不会为“_tkinter.TclError”打印任何错误消息。我搜索了很多,没有找到任何解决方案或这个问题的复制品。我已经尝试构建各种基于tkinter的应用程序,它们都以同样的方式失败。

这是在我的代码第一次调用tk.Tk。 init (self,* args,** kwargs)时发生的。

我的setup.py文件如下所示:

from setuptools import setup 
APP = ['deani.py'] 
DATA_FILES = [] 
OPTIONS = {'packages': ['tkinter','matplotlib'],'argv_emulation': True} 
setup( 
     app=APP, 
     data_files=DATA_FILES, 
     options={'py2app': OPTIONS},     
     setup_requires=['py2app'], )

1 个答案:

答案 0 :(得分:0)

我遇到了这个问题并发现它是由于/Library/Frameworks中tcl / tk的版本冲突造成的。检查构建的输出(确保先删除旧构建)以获取对不同版本的tcl / tk的引用。我发现我当前版本的tcl / tk是8.6,py2app链接到了,但同时py2app正在从tcl / tk 8.5复制文件。我通过从`/Library/Frameworks/(Tcl/Tk).framework/Versions中删除8.5来解决了这个问题。

注意:除非您在构建输出中看到问题并且知道其他任何内容(您关心的内容)取决于该版本,否则我不建议删除版本。

然而,这不是我唯一的错误,因为当我删除旧版本时,我发现了一个新的_tkinter.Tcl错误,它指出了我的代码中的错误。如果你想在不必去控制台的情况下查看回溯,我建议在你的起始代码周围放置一个try / except语句,它将回溯打印到文件中。例如:

        import sys, time, traceback    
        try:
            run()#Your opening code goes here
        except:
            with open('/Path/to/somewhere/tb.txt','a') as file:
                y,mn,d,h,m,s,a,b,c = time.localtime()
                file.write("==================="+str(mn)+'/'+str(d)+' '+
                           str(h)+':'+str(m)+':'+str(s)+
                           "=====================\n")
                traceback.print_exc(file=file)

希望这会有所帮助。