Py2app строит нормально, но приложение терпит неудачу с "_tkinter.TclError" (и нет сообщения об ошибке!)

Я использую py2app 0.9 в Mac OSX Yosemite 10.10.1, выполняющий Python 3.4 из дистрибутива anaconda и Tcl 8.5.

В более ранних попытках сборка завершилась неудачно, но быстрый поиск выявил решения этих проблем (включая "пакеты": ['tkinter', 'matplotlib'] в OPTIONS в setup.py и сменив строку 49 MachOGraph.py: loader → loader_path)

Теперь py2app завершает сборку и работает в режиме псевдонима, мои функции приложения, но когда я строю в обычном режиме (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 (компиляция (источник, путь, '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, интерактивные, 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

У меня возникла эта проблема и я обнаружил, что это произошло из-за противоречивых версий tcl/tk в /Library/Frameworks. Проверьте выходные данные сборки (обязательно удалите старую сборку сначала) для ссылок на разные версии tcl/tk. Я обнаружил, что моя текущая версия tcl/tk была 8.6, к которой ссылалась py2app, но в то же время py2app копировал файлы из tcl/tk 8.5. Я решил проблему, удалив 8.5 из `/Library/Frameworks/(Tcl/Tk).framework/Versions.

ПРИМЕЧАНИЕ. Я бы не рекомендовал удалять версию, если вы не видите проблему в выводе сборки, и знаете, что ничто другое (что вас беспокоит) зависит от этой версии.

Однако это была не моя единственная ошибка, потому что когда я удалил старую версию, я обнаружил новую ошибку _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)

Надеюсь, что это помогло.