wxPythonを使って頑張って作ったGUIをPythonが入ってないPCの人も使えるようにするのにpy2exeで変換したら見た目が変わってしまった(古い?TK?)のでその対処法。

必要なファイル

Microsoft.VC90.CRT.manifest

msvcm90.dll

msvcp90.dll

msvcr90.dll

の4つのファイルが必要。自分の環境だとPython 2.7 Portableを入れたフォルダに全部入っていたので、Py27MSdllsというフォルダをsetup.pyと同じ階層に作って全部入れました。

Microsoft.VC90.CRT.manifest の中で示されてるdllのバージョンが合ってるかどうか確認する。

違ってたら適宜修正する。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?><br>
<!-- Copyright (c) Microsoft Corporation.  All rights reserved. --><br>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"><br>
    <noInheritable/><br>
    <assemblyIdentity<br>
        type="win32"<br>
        name="Microsoft.VC90.CRT"<br>
        <s>version="9.0.21022.8"</s>
        <span style=color:red;>version="9.0.30729.6161"</span><br>
        processorArchitecture="x86"<br>
        publicKeyToken="1fc8b3b9a1e18e3b"<br>
    /><br>
    <file name="msvcr90.dll" /> <file name="msvcp90.dll" /> <file name="msvcm90.dll" /><br>
</assembly><br>

setup.py

setup.pyを書き換えて用意したこれらのファイルを読み込むように変更する。

# -*- coding: utf-8 -*-<br>
#<br>
# setup.py<br>
<br>
from distutils.core import setup<br>
import py2exe<br>
import glob<br>
<br>
<br>
class Target(object):<br>
    """ A simple class that holds information on our executable file. """<br>
    def __init__(self, **kw):<br>
        """ Default class constructor. Update as you need. """<br>
        self.__dict__.update(kw)<br>
        <br>
MANIFEST_TEMPLATE = """<br>
<?xml version="1.0" encoding="UTF-8" standalone="yes"?><br>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"><br>
  <assemblyIdentity<br>
    version="5.0.0.0"<br>
    processorArchitecture="x86"<br>
    name="%(prog)s"<br>
    type="win32"<br>
  /><br>
  <description>%(prog)s</description><br>
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3"><br>
    <security><br>
      <requestedPrivileges><br>
        <requestedExecutionLevel<br>
            level="asInvoker"<br>
            uiAccess="false"><br>
        </requestedExecutionLevel><br>
      </requestedPrivileges><br>
    </security><br>
  </trustInfo><br>
  <dependency><br>
    <dependentAssembly><br>
      <assemblyIdentity<br>
            type="win32"<br>
            name="Microsoft.VC90.CRT"<br>
            version="9.0.30729.6161"<br>
            processorArchitecture="x86"<br>
            publicKeyToken="1fc8b3b9a1e18e3b"><br>
      </assemblyIdentity><br>
    </dependentAssembly><br>
  </dependency><br>
  <dependency><br>
    <dependentAssembly><br>
        <assemblyIdentity<br>
            type="win32"<br>
            name="Microsoft.Windows.Common-Controls"<br>
            version="6.0.0.0"<br>
            processorArchitecture="X86"<br>
            publicKeyToken="6595b64144ccf1df"<br>
            language="*"<br>
        /><br>
    </dependentAssembly><br>
  </dependency><br>
</assembly><br>
"""<br>
<br>
other_resources = [(24, 1, MANIFEST_TEMPLATE % dict(prog="MyAppName"))]<br>
py26MSdll = glob.glob(r"Py27MSdlls\*.*")<br>
data_files = [("", py26MSdll),]<br>
<br>
py2exe_options = {"compressed":1,<br>
                  "optimize":2,<br>
                  "bundle_files":2}<br>
<br>
setup(<br>
    data_files = data_files,<br>
    options={"py2exe": py2exe_options},<br>
    windows= [Target(script = 'movie_info.py', other_resources = other_resources)]<br>
    )

これで上手く行けば見た目がWindowsXP以降のキレイな表示に変わります。

環境

Windows 7(64bit)

Python 2.7.3

参考

the appearance of wxpython using py2exe – Google グループ
https://groups.google.com/forum/?fromgroups=#!topic/wxpython-users/OJ91DqSm3xw

py2exe-python26 – wxPyWiki
http://wiki.wxpython.org/py2exe-python26