【问题标题】:Using "Open with" on a text file with a python application在带有 python 应用程序的文本文件上使用“打开方式”
【发布时间】:2016-07-12 02:38:45
【问题描述】:

我一直在寻找一种方法来使用我用 python 制作的文本编辑器打开文本文件,并假设它与系统参数有关,所以制作了一个简单的应用程序来编写系统发送的参数到一个文本窗口,并在文本文件和应用程序上使用“打开方式”,但唯一的参数是应用程序的路径。这里已经回答了许多与我类似的问题,但没有一个答案对我有用。我该怎么做?

感谢您的任何回复。 (我使用的是 OS X 10.9.5,带有 python 2.7)

尝试过的代码:

from Tkinter import *
import sys, time
root = Tk()
root.geometry('300x200')
text = Text(root)
text.pack(side=TOP, fill="both", expand=True)
text.insert(END, sys.argv)
for x in xrange(len(sys.argv)):
    text.insert(END,sys.argv[x])
root.mainloop()

显示的文字:

['/Path/pyfe.app/Contents/Resources/file_opener.py']/Path/pyfe.app/Contents/Resources/file_opener.py

【问题讨论】:

  • 能否向我们展示您尝试过但不起作用的代码?
  • 您是否检查过发送到您的应用程序的环境变量?
  • 我编辑了代码以显示所有环境变量,但它们都没有引用我使用应用程序打开的文件。

标签: python tkinter


【解决方案1】:

如果我正确理解您的问题,您说的是在单击文件时使用 Finder 的 Open with 上下文菜单打开文件。如果是这样,它可能与MacOSX - File extension associate with application - Programatically 重复。标准方法是创建一个 OS X 应用程序包(对于 Python 程序,您可以使用 py2app 来执行此操作),然后在其 Info.plist 中设置正确的密钥类型。假设您的文本编辑器是一个真正的 GUI 应用程序(使用 Tkinter 或 Cocoa 或其他),而不仅仅是在 shell 终端窗口中运行的程序(例如在 Terminal.app 中)。在这种情况下,您也许可以创建一个简单的包装应用程序(即使使用 AppleScript 或 Automator 并如上所述修改其Info.plist)以在终端窗口中启动您的 Python 程序并从打开事件中传递文件名。要正确处理在不同时间打开的多个文件需要更多的工作。

更新:正如您所澄清的,您使用的是 Python Tkinter 和一个真正的 GUI 应用程序。本机 OS X Tk 实现提供了一个 Apple 事件处理程序,允许您处理像 Open Document 这样的 Apple 事件。支持是described in tcl terms in the Tcl/Tk documentation,因此您需要将其转换为 Python,但这非常简单。 Python 的 IDLE 应用程序有一个示例,例如,请参见 addOpenEventSupport in macosxSupport.py。对于使用 py2app 的简单应用,您可以改用 py2app 的 argv 仿真。

【讨论】:

  • 我的回答与您的更新不一致。所以看起来你正在使用一个 GUI 应用程序,所以答案的第一部分适用。请注意,出于测试目的,您可以在 Finder 中手动设置文件关联,方法是使用 Finder Get Info 命令并更改该文件或所有该类型文件的 Open with 字段。
  • 澄清一下,我不是试图让 OS X 使用应用程序打开文件,而是试图检索系统在单击“打开方式”时发送的任何信息,这将允许应用程序打开文件并检索其中的文本。
  • OS X 通过 Apple 事件(如 open applicationopen document)将该信息传达给应用程序。 py2app` 提供了一个“argv”模拟器来处理初始的open applicationopen document 事件。如果您正在使用其他东西,或者如果您想处理多个文件打开等,您需要提供某种事件处理程序,可能使用pyobjc。这里有更多信息:developer.apple.com/library/mac/documentation/Cocoa/Conceptual/…
  • 啊,但是你使用的是 Tkinter。 Tk 将为您进行事件处理。更新以跟进。
  • 非常感谢,通过在 py2app 的选项中添加“--argv-emulation”,我能够接收文件名作为输入。
【解决方案2】:

我在https://moosystems.com/articles/8-double-click-on-files-in-finder-to-open-them-in-your-python-and-tk-application.html发表了详细说明。

如上所述,您需要调整 Info.plist 文件以告诉 OS X 您的应用至少可以查看您要处理的文件类型。

然后您可以使用 py2app 的 argv 模拟器来访问在您的应用未运行时拖动到您的应用上的任何文件。

然后安装一个 Tk 事件处理程序以在应用程序已经运行时接受文件。

在链接的文章中查找详细信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-07
    • 1970-01-01
    • 2015-07-04
    • 1970-01-01
    • 2020-10-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多