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

时间:2013-06-08 04:13:13

标签: python tkinter tk

我正在开发一个使用Tkinter作为Window管理器的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 个答案:

答案 0 :(得分:8)

可以捕获这些错误:

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

这似乎完美无缺,即使是惯性滚动,也不需要任何安装/升级。

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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。