gpt4 book ai didi

python - 使用 py2exe 捆绑 GTK 资源

转载 作者:太空狗 更新时间:2023-10-29 18:06:18 26 4
gpt4 key购买 nike

我正在使用 all-in-one installer 中的 Python 2.6 和 PyGTK 2.22.6在 Windows XP 上,尝试为我的应用构建单文件可执行文件(通过 py2exe)。

我的问题是,当我将我的应用程序作为脚本运行时(即,没有内置到 .exe 文件中,只是作为 .py 文件的松散集合) ,它使用看起来像 native 的 Windows 主题,但是当我运行构建的 exe 时,我看到默认的 GTK 主题。

我知道可以通过将一堆文件复制到由 py2exe 创建的 dist 目录来解决这个问题,但我读过的所有内容都涉及手动复制数据,而我希望这是构建过程的自动部分。此外,关于该主题的所有内容(包括 the FAQ)都已过时 - PyGTK 现在将其文件保存在 C:\Python2x\Lib\site-packages\gtk-2.0\runtime\... ,仅复制 libetc 目录并不能解决问题。

我的问题是:

  1. 我希望能够以编程方式在 setup.py 中找到 GTK 运行时数据,而不是硬编码路径。我该怎么做?

  2. 我需要包含的最少资源是什么?

更新:通过反复试验,我可能几乎已经回答了#2。要使“wimp”(即 MS Windows)主题正常工作,我需要以下文件:

runtime\lib\gtk-2.0\2.10.0\engines\libwimp.dll
runtime\etc\gtk-2.0\gtkrc
runtime\share\icons\*
runtime\share\themes\MS-Windows

...没有 runtime 前缀,但目录结构相同,直接位于 py2exe 生成的 dist 目录中。但是,鉴于 gtk.gtk_version(2,22,0)2.10.0 从何而来?

最佳答案

在这里回答我自己的问题,但如果有人知道更好,请随时回答。其中一些看起来很脆弱(例如路径中的版本号),所以如果您知道更好的方法,请评论或编辑。

1。查找文件

首先,我使用这段代码实际找到了 GTK 运行时的根目录。不过,这与您安装运行时的方式非常具体,并且可能会通过对常见位置进行大量检查来改进:

#gtk file inclusion
import gtk
# The runtime dir is in the same directory as the module:
GTK_RUNTIME_DIR = os.path.join(
os.path.split(os.path.dirname(gtk.__file__))[0], "runtime")

assert os.path.exists(GTK_RUNTIME_DIR), "Cannot find GTK runtime data"

2。要包含哪些文件

这取决于 (a) 关注大小的多少,以及 (b) 应用程序部署的上下文。我的意思是,您是将其部署到任何人都可以进行任意区域设置的整个世界,还是仅供不需要翻译的股票字符串的内部企业使用?

如果您想要 Windows 主题,您需要包括:

GTK_THEME_DEFAULT = os.path.join("share", "themes", "Default")
GTK_THEME_WINDOWS = os.path.join("share", "themes", "MS-Windows")
GTK_GTKRC_DIR = os.path.join("etc", "gtk-2.0")
GTK_GTKRC = "gtkrc"
GTK_WIMP_DIR = os.path.join("lib", "gtk-2.0", "2.10.0", "engines")
GTK_WIMP_DLL = "libwimp.dll"

如果你想要 Tango 图标:

GTK_ICONS = os.path.join("share", "icons")

还有本地化数据(我省略了,但你可能不想):

GTK_LOCALE_DATA = os.path.join("share", "locale")

3。拼凑起来

首先,这是一个在给定点遍历文件系统树并生成适合 data_files 的输出的函数。选项。

def generate_data_files(prefix, tree, file_filter=None):
"""
Walk the filesystem starting at "prefix" + "tree", producing a list of files
suitable for the data_files option to setup(). The prefix will be omitted
from the path given to setup(). For example, if you have

C:\Python26\Lib\site-packages\gtk-2.0\runtime\etc\...

...and you want your "dist\" dir to contain "etc\..." as a subdirectory,
invoke the function as

generate_data_files(
r"C:\Python26\Lib\site-packages\gtk-2.0\runtime",
r"etc")

If, instead, you want it to contain "runtime\etc\..." use:

generate_data_files(
r"C:\Python26\Lib\site-packages\gtk-2.0",
r"runtime\etc")

Empty directories are omitted.

file_filter(root, fl) is an optional function called with a containing
directory and filename of each file. If it returns False, the file is
omitted from the results.
"""
data_files = []
for root, dirs, files in os.walk(os.path.join(prefix, tree)):
to_dir = os.path.relpath(root, prefix)

if file_filter is not None:
file_iter = (fl for fl in files if file_filter(root, fl))
else:
file_iter = files

data_files.append((to_dir, [os.path.join(root, fl) for fl in file_iter]))

non_empties = [(to, fro) for (to, fro) in data_files if fro]

return non_empties

现在您可以像这样调用 setup():

setup(
# Other setup args here...

data_files = (
# Use the function above...
generate_data_files(GTK_RUNTIME_DIR, GTK_THEME_DEFAULT) +
generate_data_files(GTK_RUNTIME_DIR, GTK_THEME_WINDOWS) +
generate_data_files(GTK_RUNTIME_DIR, GTK_ICONS) +

# ...or include single files manually
[
(GTK_GTKRC_DIR, [
os.path.join(GTK_RUNTIME_DIR,
GTK_GTKRC_DIR,
GTK_GTKRC)
]),

(GTK_WIMP_DIR, [
os.path.join(
GTK_RUNTIME_DIR,
GTK_WIMP_DIR,
GTK_WIMP_DLL)
])
]
)
)

关于python - 使用 py2exe 捆绑 GTK 资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7884959/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com