【问题标题】:tkinter inter-windows drag and drop supporttkinter 窗口间拖放支持
【发布时间】:2021-06-02 21:44:27
【问题描述】:

我正在尝试帮助 tkdnd 的所有者生成一个轮子并将其分发给 Pypi,以便用户可以使用简单的 pip install TkinterDnD2 简单地安装 tkdnd 扩展。

过去两天我一直在关注这个“挑战”,但到目前为止我自己无法解决它,但我相信对 python 打包和安装过程有深入了解的人可以帮助在短时间内解决它。

目前为了获得这个扩展工作,您需要执行以下步骤(as mentioned here):

  1. download the compiled tkdnd files 为您的操作系统。现在转到您的 base interpreter 目录/tcl 并将此文件夹复制到下面。例如:
--<python3.9-directory>
  --tcl
    --tkdnd2.9.2
    ...
  ...

注意 - 如果我在导入的 TkinterDnD2 项目的 venv 中创建匹配的 tcl/tkdnd2.9.2 目录,它对我不起作用

  1. 现在download the python wrapper 并将其添加到您的 venv 站点包目录(或基本解释器无关紧要)。 因此将导入 TkinterDnD2 的 python 项目将如下所示:
--<python-test-project>
  --venv
    --Lib
      --site-packages
        --TkinterDnD2
        ...
  ...

现在可以成功运行 tkdnd 扩展了。

您可能会说这与安装普通的 python 库不太一样。 这里的问题是额外的 tkdnd2.9.2 文件夹必须位于基本解释器的 tcl 文件夹中。

也许可以在 setup.py 中使用 package_datadata_files 来告诉 python 在从轮子安装期间添加这个 tcl 文件,但我不确定。见Packaging and distributing projects 供完整参考。

不完整的 setup.py:

import setuptools

with open("README.md", "r", encoding="utf-8") as fh:
    long_description = fh.read()

setuptools.setup(
    name="TkinterDnD2",
    version="2.9.2",
    author="petasis",
    description="TkDND is an extension that adds native drag & drop capabilities to the Tk toolkit.",
    long_description=long_description,
    long_description_content_type="text/markdown",
    url="https://github.com/petasis/tkdnd",
    project_urls={
        "Bug Tracker": "https://github.com/petasis/tkdnd/issues",
    },
    classifiers=[
        "Programming Language :: Python :: 2",
        "Programming Language :: Python :: 3",
        "Operating System :: OS Independent",
    ],
    packages=setuptools.find_packages(),
    python_requires=">=2, >=3",
    # some extra logic probably belong here
    # ...     
)

您可以跟踪问题here,其中包括一些额外的讨论。

非常有用的 stackoverflow 问题:

  1. How to avoid building C library with my python package?
  2. How to Install and Use TkDnD with Python Tkinter on OSX?

非常有用的指南:

  1. Packaging and distributing projects
  2. Packaging Python Projects
  3. Python Bindings: Calling C or C++ From Python

任何帮助将不胜感激!

【问题讨论】:

  • 您是否在启用存根的 Tcl/Tk 端构建扩展包?如果你不是,那将是一个严重的头痛。启用存根(并且最初针对您希望支持的最低 API 版本构建)在运行时设置整个 Tcl 端只需将正确的目录放在TCLLIBPATHauto_path 上。 (Tkdnd 好像有个non-trivial package index file...)
  • 其实我不是自己构建的,只是从发行版下载编译好的文件,所以我不知道是否启用了存根。我的问题更多地与如何配置 setup.py 以使用编译文件而不是编译 tcl 文件来构建轮子有关。
  • 唉,我对构建 Python 轮子了解不多;我当前的项目只使用它们(因为它的某些部分需要针对嵌入式 ARM 处理器的交叉编译器,这需要与普通代码完全不同的工具链)。但是只要 Tcl 端相对于彼此保持正确——尤其是相对于包索引文件——并且在启用存根的情况下构建,它应该加载到任何可用的地方;否则它可能不需要太多特殊的路径处理。

标签: python tkinter tcl setup.py python-wheel


【解决方案1】:

只是为其他人像我一样被困了几个星期的案子负责。

您可以在此处查看 pmagne 创建的 dist 存储库: https://github.com/pmgagne/tkinterdnd2

该软件包尚未在 pypi 上发布,但您可以按照我打开的有关此问题的说明构建一个轮子并安装它:https://github.com/pmgagne/tkinterdnd2/issues/5

希望作者能尽快构建并发布它,因此您只需 python -m pip install tkinterdnd2 即可享受 tkinter 跨窗口拖放支持!

如果您不想自己构建它,请在此处下载轮子:tkinterdnd2-0.3.0-py2.py3-none-any.zip 解压zip然后你就可以python -m pip install tkinterdnd2-0.3.0-py2.py3-none-any.whl然后你就可以在你的python项目中import tkinterdnd2了。

更新

作者没有回复所以我forked它自己发表了。 您现在可以简单地使用安装

pip install tkinterdnd2

享受吧!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-06
    • 1970-01-01
    相关资源
    最近更新 更多