py2exe - 编译Tkinter gui可执行文件后缺少模块FileDialog

djo*_*joe 8 compilation tkinter py2exe setup.py python-2.7

我的问题与这个已经回答的问题非常相似(转换为py2exe可执行文件后缺少tkinter属性).但它与使用Tkinter而不是tkinter的python 2.7有关.

我编译后运行我的可执行文件时基本上遇到同样的问题.

Traceback (most recent call last):
  File "main.py", line 5, in <module>
  File "gui.pyc", line 5, in <module>
  File "matplotlib\backends\backend_tkagg.pyc", line 7, in <module>
  File "six.pyc", line 199, in load_module
  File "six.pyc", line 113, in _resolve
  File "six.pyc", line 80, in _import_module
ImportError: No module named FileDialog
Run Code Online (Sandbox Code Playgroud)

但是当我使用Tkinter和python 2.7时,这意味着我无法做到:

from tkinter import FileDialog
Run Code Online (Sandbox Code Playgroud)

我试过用

from tkFileDialog import askopenfilename
Run Code Online (Sandbox Code Playgroud)

import tkFileDialog
Run Code Online (Sandbox Code Playgroud)

但没有一个有用.我是否需要将python升级到3只是为了能够正确编译Tkinter?或者有一种我缺少的解决方法吗?

这是我目前的setup.py

from distutils.core import setup
from glob import glob
import py2exe
import sys
import matplotlib

sys.path.append("C:\\Program Files (x86)\\Microsoft Visual Studio 12.0\\VC\\redist\\x86\\Microsoft.VC90.CRT")

data_files = [("Microsoft.VC90.CRT",
           glob(r'C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\redist\x86\Microsoft.VC90.CRT\*.*'))]
data_files.extend(matplotlib.get_py2exe_datafiles())

setup(
    data_files=data_files,
    windows=['main.py'],
    packages=[''],
    name='ZLA',
    version='0.1 beta',
    description='Troubleshooter.',
    requires=['matplotlib', 'PIL', 'py2exe']
)
Run Code Online (Sandbox Code Playgroud)

我试图在选项中指定tkFileDialog:includes:但仍然没有运气:(

options={'py2exe': {'includes': ['Tkinter', 'tkFileDialog']}, }
Run Code Online (Sandbox Code Playgroud)

更新:

经过一番调查,我找到了答案.你其实可以

import FileDialog
Run Code Online (Sandbox Code Playgroud)

UPDATE2:

如果你想避免一些调试器和ide给你的"未使用的导入"反馈,你可以将包FileDialog添加到py2exe的包字典中

options={'py2exe': {'packages': ['FileDialog']},}
Run Code Online (Sandbox Code Playgroud)

也许有人可以帮助澄清为什么更合适?

Wer*_*ner 3

不要使用“includes”,而是使用“packages”,并且仅指定包,在本例中为“Tkinter”。