使用 Tkinter 和 Python 在 Mac OS X 中进行惯性滚动

Posted

技术标签:

【中文标题】使用 Tkinter 和 Python 在 Mac OS X 中进行惯性滚动【英文标题】:Inertial scrolling in Mac OS X with Tkinter and Python 【发布时间】:2013-06-04 11:04:10 【问题描述】:

我正在开发一个使用 Tkinter 作为窗口管理器的 Python 3.3 项目。我为画布设置了鼠标滚轮事件。滚动在 Windows 7、8 和 Ubuntu 中有效,但在 Mac OS X Mountain Lion 中使用 Magic Mouse 滚动时,程序崩溃并在 Tk 主循环中出现以下错误:

File "/Users/xxxx/Documents/Repositories/tycoon/agentsim.py", line 291, in start
    self._root.mainloop()
  File "/Library/Frameworks/Python.framework/Versions/3.3/lib/python3.3/tkinter/__init__.py", line 1038, in mainloop
self.tk.mainloop(n)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe7 in position 0: invalid continuation byte

我的代码是:

self._hscroll.configure( command=self._canvas.xview )
self._vscroll.configure( command=self._canvas.yview )
self._canvas.bind('<MouseWheel>', lambda event: self.rollWheel(event))

其中 hscroll 和 vscroll 是表单中的滚动条对象。

如果我使用普通鼠标,则不会出现此问题。当我尝试使用触控板滚动时也会发生这种情况(打开惯性滚动)

我是否必须更新 Tk 才能使此功能正常工作,还是一般情况下它只是损坏了?

【问题讨论】:

【参考方案1】:

可以捕获这些错误:

while True:
    try:
        root.mainloop()
        break
    except UnicodeDecodeError:
        pass

这似乎工作得很好,即使是惯性滚动,也不需要任何安装/升级。

【讨论】:

【参考方案2】:

这看起来像here 描述的问题。如果您使用 python.org 64 位/32 位安装程序 3.3(当前为 3.3.2),请确保您还安装了最新的 ActiveTcl 版本,当前为 8.5.13,如 here 所述。

【讨论】:

这似乎不能解决问题。可能该错误被重新引入? 你安装 ActiveTcl 8.5.15 了吗? 我刚刚解决了这个问题。问题在于我从 Homebrew 获得的 Python 版本。安装官方 python3 版本后,它运行良好。 我仍然有这个问题,运行 Python 3.4.1 并更新我的 ActiveTcl。任何其他想法(对于任何查看旧问题的人)? 您是否在为 OS X 和 ActiveTcl 8.5.15.1 使用 python.org 64 位 3.4.1 安装程序?【参考方案3】:

Neptune798,它应该可以工作。显然这个错误在 ActiveTcl 8.6 中重新出现。这绝对是 Tk 的一个错误,因为我在使用 Python 3.4.4、3.5.4 和 3.6.2 进行测试时遇到了同样的问题。他们都报告了使用安装在以下位置的 Tcl/Tk 库:

**/System**/Library/Frameworks/Tcl.framework/Versions/8.5/ 

我在 ActiveTcl 8.6.6 中遇到了这个错误,降级到 8.5.18.0 后它就消失了。检查降级后Python使用的是什么,它报告:

>>> import tkinter
>>> root = tkinter.Tk()
>>> print(root.tk.exprstring('$tcl_library'))
/Library/Frameworks/Tcl.framework/Versions/8.5/Resources/Scripts
>>> print(root.tk.exprstring('$tk_library'))
/Library/Frameworks/Tk.framework/Versions/8.5/Resources/Scripts

注意它现在只在 /Library 中找到 ActiveTcl,而不是 /System/Library

虽然他们不再提供旧版本供下载,但我找到了一个仍然有效的旧链接here

在 Python 3.7 中,Tcl/Tk 与 Python 捆绑在一起,tkinter 不再依赖系统的 Tcl/Tk 版本。我已经测试了 CPython 版本和 Anaconda 版本,都可以在包含的捆绑 Tcl/Tk 8.6 中正常工作。

【讨论】:

以上是关于使用 Tkinter 和 Python 在 Mac OS X 中进行惯性滚动的主要内容,如果未能解决你的问题,请参考以下文章

在使用 Python 3 的 Mac 上没有名为“_tkinter”的模块

边框和背景颜色未在 mac [python -Tkinter] 中显示

为什么我无法在Mac上的Tkinter Python中显示按钮的背景颜色?

无法在终端执行使用 tkinter 和 py2app 创建的 Mac 应用程序

如何在 Mac OS X 上更改 Tkinter 按钮的前景色或背景色?

Tkinter 在 Mac 上的 Tk() 上不断崩溃