python - 为什么 Python Tkinter Canvas Scroll 不会?

标签 python macos tkinter magic-mouse

为什么我不能让 python tkinter canvas 响应 Apple Magic Mouse 的垂直和水平滑动/滚动? Canvas 的滚动条工作正常(意味着当我在鼠标上水平滑动/滚动时水平条工作,但当我垂直滑动/滚动时水平条工作,当我垂直滑动/滚动时垂直滚动条移动但不对任何水平方向作出 react 滑动/滚动 Action ),但 Canvas 不会对鼠标的任何滑动/滚动使用react。

这是我的示例/测试代码:

from tkinter import *
import tkinter.ttk as ttk
from PIL import Image, ImageTk
root = Tk()

h = Scrollbar(root, orient=HORIZONTAL)
v = Scrollbar(root, orient=VERTICAL)
canvas = Canvas(root, scrollregion=(0, 0, 1000, 1000), yscrollcommand=v.set, xscrollcommand=h.set)
h['command'] = canvas.xview
v['command'] = canvas.yview
theImage = ImageTk.PhotoImage(Image.open('example.png')) #Assume a very large image
canvas.create_image(0,0,image=theImage, anchor='nw')
canvas.grid(column=0, row=0, sticky=(N,W,E,S))
h.grid(column=0, row=1, sticky=(W,E))
v.grid(column=1, row=0, sticky=(N,S))
root.grid_columnconfigure(0, weight=1)
root.grid_rowconfigure(0, weight=1)
root.mainloop()

就 Python 和 tkinter 而言,我完全是个新手,但我觉得这应该非常简单明了(或者至少是可行的)。然而我已经找遍了,仍然找不到答案(尽管我可能使用了错误的术语进行搜索)。

如何使 Canvas 像滚动条一样对 Magic Mouse 的滚动/滑动输入使用react?

编辑:我正在使用 Python 3.4、Tkinter 8.5.18、Mac OS X 10.9.5 和 Apple Magic Mouse

最佳答案

假设魔术鼠标的滚动和滑动输入像标准触控板上的滚动区域一样工作,您需要绑定(bind) <MouseWheel><Shift-MouseWheel>事件。

首先是代码,然后是一些注释。

from tkinter import *
import tkinter.ttk as ttk
from PIL import Image, ImageTk

def on_vertical(event):
    canvas.yview_scroll(-1 * event.delta, 'units')

def on_horizontal(event):
    canvas.xview_scroll(-1 * event.delta, 'units')

root = Tk()
h = Scrollbar(root, orient=HORIZONTAL)
v = Scrollbar(root, orient=VERTICAL)
canvas = Canvas(root, scrollregion=(0, 0, 1000, 1000), yscrollcommand=v.set, xscrollcommand=h.set)
h['command'] = canvas.xview
v['command'] = canvas.yview
theImage = ImageTk.PhotoImage(Image.open('img'))
canvas.create_image(0,0,image=theImage, anchor='nw')
canvas.grid(column=0, row=0, sticky=(N,W,E,S))

canvas.bind_all('<MouseWheel>', on_vertical)
canvas.bind_all('<Shift-MouseWheel>', on_horizontal)

h.grid(column=0, row=1, sticky=(W,E))
v.grid(column=1, row=0, sticky=(N,S))
root.grid_columnconfigure(0, weight=1)
root.grid_rowconfigure(0, weight=1)
root.mainloop()

如您所见,只有 2 处更改。

  1. 有两个回调函数来处理滚动事件on_verticalon_horizontal
  2. Canvas <MouseWheel><Shift-MouseWheel>事件绑定(bind)到 on_verticalon_horizontal分别。

关于python - 为什么 Python Tkinter Canvas Scroll 不会?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33400918/

相关文章:

linux - 在 Shell 脚本中传递 'If statement' 问题

java - 为什么 SimpleDateFormat 不能在 Mac OS X 10.6.5 上运行?

python - 在 Tkinter 中调整滚动条高度?

python - 如何确保我的 ttk.Entry 的无效状态在失去焦点时不被清除?

python - 返回一个赞美的核苷酸字符

Python:内存泄漏?

python - 如何使用 Python 控制 Minecraft 中的鼠标?

python - 如何自动提取由与键关联的 numpy 数组表示的值作为字典中的单独数据

python - 去除标点符号,输出剩余文本-Python 3 Function

python-2.7 - TclError : wrong # args error