python tkinter库画布鼠标拖动监听_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('', xy_motion)

root.mainloop()

问题是,滚动运动是在运动功能,只有当有鼠标移动(如果你停止移动鼠标,滚动也停止)。我想让它成为一种方式,即使鼠标不动(但仍在“滚动区”),窗口将继续滚动,直到它到达结束。在

我认为最明显的方法是将if语句(例如从第30行)更改为while语句,如下所示:

^{pr2}$

但是当鼠标到达这个位置时,程序就会冻结(我想是等待while循环完成)。在

有什么建议吗?在

提前谢谢。在

更新

这是一个(或可能的)答案的工作代码。我不知道用答案更新问题本身是否正确,但我认为这对其他人是有用的。在x, y = 0, 0

def scroll():

global x, y

if x < 30:

delta = - 1

canvas.xview('scroll', delta, 'units')

elif x > (ws - 30):

delta = 1

canvas.xview('scroll', delta, 'units')

elif y < 30:

delta = -1

canvas.yview('scroll', delta, 'units')

elif y > (ws - 30):

delta = 1

canvas.yview('scroll', delta, 'units')

canvas.after(100, scroll)

def xy_motion(event):

global x, y

x, y = event.x, event.y

scroll()

canvas.bind('', xy_motion)

请告诉我是否正确。感谢大家的讨论和建议。Theselinkswere也很有用。在

你可能感兴趣的:(python)