使用Tkinter和Python在Mac OS X中实现惯性滚动

14

我正在开发一个使用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才能使此功能正常工作,还是它本来就是有问题的?

3个回答

10

这些错误可以被捕获:

while True:
    try:
        root.mainloop()
        break
    except UnicodeDecodeError:
        pass
这似乎完美运作,甚至在惯性滚动时也不需要任何安装/升级。

1
Neptune798,它应该能够工作。显然,这个bug在ActiveTcl 8.6中重新出现了。这绝对是Tk的一个bug,因为我在测试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。

1
这看起来像是这里描述的问题。如果你正在使用python.org 64位/32位安装程序3.3(当前版本为3.3.2),请确保已经安装了最新的ActiveTcl版本,目前为8.5.13,如此处所述。

这似乎没有解决问题。可能是错误被重新引入了? - dougalg
你安装了ActiveTcl 8.5.15吗? - Ned Deily
1
我刚解决了这个问题。问题出在我使用的Homebrew版本的Python上。安装官方的python3版本后,问题得到了解决。 - dougalg
我仍然有这个问题,正在运行Python 3.4.1并更新我的ActiveTcl。对于任何查看旧问题的人,还有其他想法吗? - en_Knight
你是否正在使用python.org 64位3.4.1安装程序和ActiveTcl 8.5.15.1? - Ned Deily
我使用官方的Python 3.4和ActiveTcl 8.5也遇到了完全相同的问题。有人找到了有效的解决方法吗? - Michal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接