Int*_*san 5 python macos tkinter magic-mouse
为什么我无法让 python tkinter 画布响应 Apple Magic Mouse 的垂直和水平滑动/滚动?画布的滚动条工作正常(这意味着当我在鼠标上水平滑动/滚动时水平条起作用,但当我垂直滑动/滚动时则不起作用,并且当我垂直滑动/滚动时垂直滚动条移动但不对任何水平做出反应滑动/滚动运动),但画布不会对鼠标的任何滑动/滚动做出反应。
这是我的示例/测试代码:
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()
Run Code Online (Sandbox Code Playgroud)
对于 Python 和 tkinter,我完全是新手,但我觉得这应该非常简单和明显(或者至少是可行的)。然而我已经查遍了,仍然找不到答案(尽管我可能使用了错误的术语进行搜索)。
怎样才能让画布像滚动条一样对来自 Magic Mouse 的滚动/滑动输入做出反应?
编辑:我正在使用 Python 3.4、Tkinter 8.5.18、Mac OS X 10.9.5 和 Apple Magic Mouse
假设魔术鼠标的滚动和滑动输入像标准触控板上的滚动区域一样工作,您需要绑定<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()
Run Code Online (Sandbox Code Playgroud)
如您所见,只有 2 处更改。
on_vertical和on_horizontal<MouseWheel>和<Shift-MouseWheel>事件分别绑定到on_vertical和on_horizontal。