【问题标题】:Apple Python launcher is acting on command key bindingsApple Python 启动器正在作用于命令键绑定
【发布时间】:2011-03-21 01:09:49
【问题描述】:

我编写了一个使用 tkinter 的 Python 实用程序。我在 Macintosh 上运行它。当它被执行时,它会在苹果提供的 Python 启动程序 (/Library/Frameworks/Python.framework/Versions/3.2/Resources/Python.app) 中运行。

我的代码安装了自己的菜单,并且我绑定到通常的 Macintosh 命令键等效项,用于我的编辑菜单(Command-x、command-c、command-x、command-a、command-z)和退出(command -q)。我的问题是 Python 启动程序正在响应命令键绑定。这对于粘贴之类的事情很不方便,因为它需要完成两次。退出是一个真正的问题,因为启动程序会在我保存更改的文件之前杀死我的程序。

有什么方法可以阻止 Python 启动程序对命令键等效项进行操作吗?我试过这个:“rootWindow.unbind ('<Command-Key-q>')”,但无济于事。启动程序在我的代码清理之前退出。

我在 OS X 10.6.6 上使用 CPython 3.2。

【问题讨论】:

    标签: python macos tkinter


    【解决方案1】:

    不要覆盖 Tkinter 的默认键绑定,而是将 re-mapping Tcl's "exit" command 考虑为自定义函数。 (每次你按下 command-q 或使用“退出”菜单项时都会调用它。)

    def save_and_exit():
        save_changed_files()
        sys.exit()
    
    self.createcommand('exit', save_and_exit)
    

    除此之外,我建议您删除复制/粘贴自定义键绑定并让库为您完成工作。如果您仍然一心想要覆盖默认值,Effbot 在Tkinter events and bindings 上有一个很好的教程。

    【讨论】:

    • 谢谢你,科迪。这如宣传的那样工作。顺便说一句,Tck/TkAqua 常见问题解答现在位于 link
    • 让我澄清一下。在喜欢的讨论中引用的 Tck/TkAqua 常见问题现在位于 New Tcl/TkAqua FAQ
    • 太棒了!祝你的应用好运。您介意投票和/或接受我的回答吗?我正在努力收集足够的声誉来投票支持我认为有帮助的其他答案。
    【解决方案2】:

    您使用 Python.app 启动是否有特定原因?这个 .app 很可能是快捷方式行为不端的原因。

    如果我理解正确的话,这个启动器只是带有特殊导入的默认 python (/usr/bin/python) 的包装器。

    如果你从终端运行(-v 是这里的关键):

    /Library/Frameworks/Python.framework/Versions/5.1.1/Resources/Python.app/Contents/MacOS/Python -v
    

    您将在开始时看到它导入的内容。将这些行添加到您的主文件应该使命令行启动与 .app 相同。

    另请注意,python.app 的版本为 5.1.1。

    br,

    朱哈

    【讨论】:

    • 嘿Juha。启动器如何参与对我来说有点神秘,但是当我用 tkinter 打开一个窗口时它会自动发生。查看导入的模块列表似乎并不能说明启动程序/包装程序是如何参与的。我找不到任何文档。但是,我同意这是抢夺我的命令键事件的罪魁祸首。我不确定版本 5.1.1。你是说 3.1.1 吗?
    【解决方案3】:

    首先,/Library/Frameworks/Python.framework/Versions/3.2/Resources/Python.app 不是 Apple 提供的。很可能您使用python.org installers here 之一或从某些第三方分销商安装了 Python 3.2,或者您可能从源代码构建了框架版本。在任何情况下,Python.app 都是包含在每个框架版本中的虚拟应用程序包。它的目的是确保当你调用 python 时,即使是从命令行,它也被 OS X 视为一个成熟的 GUI 应用程序。这在使用tkinter 时尤为重要。您看到的默认菜单和键绑定由Tcl/Tk 提供,而不是tkinter。正如您所发现的,更改这些的正确方法是重新映射默认菜单。请注意,Mac OS X 上目前至少有 Tk 的三个主要变体:Aqua Carbon Tk、Aqua Cocoa Tk 和 X11 Tk。有一些重要的细节,尤其是关于 Mac OS X 10.6,关于 Python and Tcl/Tk on Mac OS X at the python.org website

    【讨论】:

    • 嘿内德。感谢您周到的回答。我纠正了 shell 程序不是来自苹果的说法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-08
    • 1970-01-01
    • 2018-12-19
    • 1970-01-01
    • 1970-01-01
    • 2015-04-16
    • 1970-01-01
    相关资源
    最近更新 更多