5

Apple の Magic Mouse の垂直方向および水平方向のスワイプ/スクロールに python tkinter キャンバスが応答しないのはなぜですか? キャンバスのスクロールバーは適切に機能します (つまり、マウスで水平にスワイプ/スクロールすると水平バーが機能しますが、垂直にスワイプ/スクロールすると機能しません。また、垂直にスワイプ/スクロールすると垂直スクロールバーが移動しますが、水平に反応しません。スワイプ/スクロール モーション)、しかしキャンバスはマウスのスワイプ/スクロールに反応しません。

これが私の例/テストコードです:

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. スクロール イベントを処理するコールバック関数が 2 つありますon_verticalon_horizontal
  2. キャンバス<MouseWheel>とイベントは、それぞれ と<Shift-MouseWheel>にバインドされます。on_verticalon_horizontal
于 2015-10-28T23:10:34.157 に答える
0

ntk Canvas を使用してスクロール可能な Canvas を作成します。デフォルトではマウス スクロールで動作しますが、ntk Scrollbar ウィジェットを作成してキャンバスに割り当てると、問題なく使用できます。

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()

このキャンバスはマウス スクロールでスクロールできますが、バーを設定する場合は、スクロール バー ウィジェットを作成し、このキャンバス オブジェクトを 2 番目のパラメータとして渡すことができます。

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 に答える