5

为什么我无法让 python tkinter 画布响应 Apple 魔术鼠标的垂直和水平滑动/滚动?画布的滚动条正常工作(这意味着当我在鼠标上水平滑动/滚动时水平条工作,但当我垂直滑动/滚动时不工作,当我垂直滑动/滚动时垂直滚动条移动但不响应任何水平滑动/滚动动作),但画布不会对鼠标的任何滑动/滚动做出反应。

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

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 时,我完全是新手,但我觉得这应该非常简单和明显(或者至少是可行的)。然而我已经看遍了,仍然找不到答案(尽管我可能使用错误的术语进行搜索)。

如何让画布像滚动条一样对来自 Magic Mouse 的滚动/滑动输入做出反应?

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

4

2 回答 2

4

假设魔术鼠标的滚动和滑动输入像标准触控板上的滚动区域一样工作,您需要绑定<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. 画布<MouseWheel><Shift-MouseWheel>事件分别绑定到on_verticalon_horizontal
于 2015-10-28T23:10:34.157 回答
0

使用ntk Canvas 创建一个可滚动的 Canvas,默认情况下它适用于鼠标滚动,但是如果您创建一个 ntk Scrollbar 小部件,并将其分配给 canvas,您就可以开始了。

ntk 在 tkinter 之上工作,使用 pip 从 pypi 安装它

pip install ntk

使用 ntk 小部件获得很棒的设计。

from ntk import Tk, Canvas, Scrollbar

def main():
    root = Tk()

canvas = Canvas(root)

    root.mainloop()    

if __name__=='__main__':
    main()

这个画布可以通过鼠标滚动来滚动,但是如果你想用它设置一个栏,你可以创建一个滚动条小部件并将这个画布对象作为第二个参数传递

scroll = Scrollbar(root, canvas)

您可以通过配置从画布更改可滚动区域,或者在创建画布时传递它

canvas = Canvas(root, scrollregion=[0,0,100,50]) # [x1, y1, x2, y2]

或配置它

canvas.config(scrollregion=[0,0,100,50])

欢迎使用更少的代码进行漂亮的设计,快乐的编码。

于 2021-01-07T10:07:03.237 回答