これは非常によくある質問だと思いますが、答えが見つかりませんでした。Python Tkinter - マウスの位置でスクロールするキャンバス
マウスの位置に応じてスクロールするウィンドウを作成しようとしています。マウスが画面の最上部に近い場合は上部にスクロールし、右側の境界に近い場合はスクロールしてウィンドウにスクロールします右など。ここでは、コードは次のとおりです。
from tkinter import *
from tkinter import ttk
root = Tk()
h = ttk.Scrollbar(root, orient = HORIZONTAL)
v = ttk.Scrollbar(root, orient = VERTICAL)
canvas = Canvas(root, scrollregion = (0, 0, 2000, 2000), width = 600, height = 600, yscrollcommand = v.set, xscrollcommand = h.set)
h['command'] = canvas.xview
v['command'] = canvas.yview
ttk.Sizegrip(root).grid(column=1, row=1, sticky=(S,E))
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)
canvas.create_rectangle((0, 0, 50, 50), fill = 'black')
canvas.create_rectangle((500, 500, 550, 550), fill = 'black')
canvas.create_rectangle((1500, 1500, 1550, 1550), fill = 'black')
canvas.create_rectangle((1000, 1000, 1050, 1050), fill = 'black')
def xy_motion(event):
x, y = event.x, event.y
if x < 30:
delta = -1
canvas.xview('scroll', delta, 'units')
if x > (600 - 30):
delta = 1
canvas.xview('scroll', delta, 'units')
if y < 30:
delta = -1
canvas.yview('scroll', delta, 'units')
if y > (600 - 30):
delta = 1
canvas.yview('scroll', delta, 'units')
canvas.bind('<Motion>', xy_motion)
root.mainloop()
問題は、スクロールの動きがマウスの動きは、(あなたがマウスを動かす停止した場合、スクロールがあまりにも停止)がある場合にのみ動作モーション機能であるということです。私はそれがマウスが動いていなくても(しかし、 "スクロール領域"にいても)ウィンドウが最後までスクロールし続けるようにしたいと思います。
while x < 30:
しかし、その後、マウスがこの位置プログラムがフリーズ(待機中に到達したとき:
私は明白な方法は、このように、while文に(例えばライン30)からif文を変更することだろうと思いましたwhileループが終わると思う)。提案がありますか?
ありがとうございます。
UPDATE
は、ここで(または可能性の1)の答えと作業コードです。私は、質問自体を答えで更新するのが正しいかどうか分かりませんが、他人には役立つと思います。
正しいのかどうか教えてください。誰もが議論と提案に感謝します。 Theselinkswereも便利です。
私はTkinterの専門家ではありませんが、[this](http://old.nabble.com/Cursor-coordinates-td26644652.html)は役に立ちます – inspectorG4dget
変数 'ws 'は定義されていません。文脈では、私はそれが座標であると仮定します –