2016-01-24 5 views
0

Использование cx_Freeze для создания простых приложений matplotlib отлично работает, однако я столкнулся с проблемой при попытке создать автономный исполняемый файл из приложения Matlotlib Tkinter &.cx_freeze с бэкэндом Tkinter & matplotlib, No module с именем FileDialog

Вот минимальный пример, который бы воспроизвести ошибку:

#!/usr/bin/env python 

import matplotlib 
matplotlib.use('TkAgg') 

from numpy import arange, sin, pi 
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2TkAgg 
# implement the default mpl key bindings 
from matplotlib.backend_bases import key_press_handler 


from matplotlib.figure import Figure 

import sys 
if sys.version_info[0] < 3: 
    import Tkinter as Tk 
else: 
    import tkinter as Tk 

root = Tk.Tk() 
root.wm_title("Embedding in TK") 


f = Figure(figsize=(5, 4), dpi=100) 
a = f.add_subplot(111) 
t = arange(0.0, 3.0, 0.01) 
s = sin(2*pi*t) 

a.plot(t, s) 


# a tk.DrawingArea 
canvas = FigureCanvasTkAgg(f, master=root) 
canvas.show() 
canvas.get_tk_widget().pack(side=Tk.TOP, fill=Tk.BOTH, expand=1) 

toolbar = NavigationToolbar2TkAgg(canvas, root) 
toolbar.update() 
canvas._tkcanvas.pack(side=Tk.TOP, fill=Tk.BOTH, expand=1) 


def on_key_event(event): 
    print('you pressed %s' % event.key) 
    key_press_handler(event, canvas, toolbar) 

canvas.mpl_connect('key_press_event', on_key_event) 


def _quit(): 
    root.quit()  # stops mainloop 
    root.destroy() # this is necessary on Windows to prevent 
        # Fatal Python Error: PyEval_RestoreThread: NULL tstate 

button = Tk.Button(master=root, text='Quit', command=_quit) 
button.pack(side=Tk.BOTTOM) 

Tk.mainloop() 
# If you put root.destroy() here, it will cause an error if 
# the window is closed with the window manager. 

В частности from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2TkAgg, кажется, вызывает проблему. Если я бегу мое собственное приложение, я хотел бы получить такую ​​же ошибку, как если бы я побежал этот выше:

Traceback (most recent call last): 
    File "C:\Anaconda2\lib\site-packages\cx_Freeze\initscripts\Console.py", line 27, in <module> 
    exec(code, m.__dict__) 
    File "Calipso.py", line 25, in <module> 
    File "C:___.py", line 14, in <module> 
    from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg 
    File "C:\Users\Grant\Documents\GitHub\vocal\calipso\build\exe.win32-2.7\matplotlib\backends\backend_tkagg.py", line 7, in <module> 
    from six.moves import tkinter_filedialog as FileDialog 
    File "C:\Anaconda2\lib\site-packages\six.py", line 203, in load_module 
    mod = mod._resolve() 
    File "C:\Anaconda2\lib\site-packages\six.py", line 115, in _resolve 
    return _import_module(self.mod) 
    File "C:\Anaconda2\lib\site-packages\six.py", line 82, in _import_module 
    __import__(name) 
ImportError: No module named FileDialog 

Мои setup.py выглядит следующим образом:

import os 
import sys 
from distutils.core import setup 
import cx_Freeze 
import matplotlib 

base = "Console" 

executable = [ 
    cx_Freeze.Executable("Calipso.py", base = base) 
] 

build_exe_options = {"includes":["matplotlib.backends.backend_tkagg", "ccplot.algorithms", 
           "ccplot.hdf", "Tkinter", "tkFileDialog"], 
        "include_files":[(matplotlib.get_data_path(), "mpl-data")], 
        "excludes": ["collections.abc"], 
        } 

cx_Freeze.setup(
    name = "py", 
    options = {"build_exe": build_exe_options}, 
    version = "0.0", 
    description = "standalone", 
    executables = executable 
) 

Как я могу убедиться, что расслоение FileDialog?

+1

'«tkinter.filedialog»', вероятно, следует в '«включает в себя»', как здесь HTTP://stackoverflow.com/questions/34806650/cx-freeze-converted-gui-app-tkinter-crashes-after-presssing-plot-button –

ответ

0

Обнаружена проблема с этой проблемой. Вопрос заключается в том, что FileDialog отдельный пакет от Tkinter все вместе, так что мой сценарий теперь выглядит следующим образом:

import os 
import sys 
from distutils.core import setup 
import cx_Freeze 
import matplotlib 

base = "Console" 

executable = [ 
    cx_Freeze.Executable("Calipso.py", base = base) 
] 

build_exe_options = {"includes":["matplotlib.backends.backend_tkagg", "ccplot.algorithms", 
           "ccplot.hdf"], 
        "packages:" ["Tkinter", "tkFileDialog"], 
        "include_files":[(matplotlib.get_data_path(), "mpl-data")], 
        "excludes": ["collections.abc"], 
        } 

cx_Freeze.setup(
    name = "py", 
    options = {"build_exe": build_exe_options}, 
    version = "0.0", 
    description = "standalone", 
    executables = executable 
) 
+0

Спасибо! Вот небольшая модификация, которую мне нужно было сделать: вместо «пакетов»: «[Tkinter», «tkFileDialog»], «Мне не нужно было использовать кепки и filedialog ниже tkinter:' tkinter »,« tkinter.filedialog »' , Как написано [здесь] (https://stackoverflow.com/questions/28590669/tkinter-tkfiledialog-doesnt-exist) в Python 3.x 'tkFileDialog был переименован в filedialog и помещен в пакет Tkinter.'. В Python 3.x модуль tkinter также не имеет крышек. – Alex

Смежные вопросы