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

Rya*_*nan 13 tkinter py2app python-3.x anaconda

我使用py2app 0.9Mac OSX Yosemite 10.10.1运行Python 3.4,从蟒蛇分布,并用Tcl 8.5.

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

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

回溯(最近一次调用最后一次):文件"/Users/ryankeenan/Desktop/fishing/gui_test/dist/deani.app/Contents/Resources/ boot .py",第355行,在_run()文件"/ Users/ryankeenan /桌面/钓鱼/ gui_test/dist/deani.app/Contents/Resources/boot .py",第336行,在_run exec(编译(源,路径,'exec'),globals(),globals())文件"/用户/ ryankeenan /桌面/钓鱼/ 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..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'], )
Run Code Online (Sandbox Code Playgroud)

Ant*_*ony 1

我遇到了这个问题,发现这是由于 .tcl/tk 版本冲突造成的/Library/Frameworks。检查构建的输出(确保首先删除旧的构建)以获取对不同版本 tcl/tk 的引用。我发现我当前的 tcl/tk 版本是 py2app 链接到的 8.6,但同时 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)
Run Code Online (Sandbox Code Playgroud)

希望这有帮助。