Я думаю, что это очень распространенный вопрос, но я не смог найти ответ.
Я пытаюсь сделать окно, которое прокручивается в зависимости от положения мыши: если мышь находится близко к верхней части экрана, она прокручивается к вершине, если она находится близко к правой границе, она прокручивается вправо. и так далее. Вот код:
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()
Проблема в том, что движение прокрутки находится в функции движения, которая работает только при наличии движения мыши (если вы перестанете двигать мышь, прокрутка тоже остановится). Я хотел бы сделать так, чтобы даже если мышь не двигалась (но все еще находилась в «области прокрутки»), окно продолжало бы прокручиваться, пока не достигло конца.
Я думал, что очевидным способом будет изменение оператора if (например, из строки 30) на оператор while, например:
while x < 30:
Но затем, когда мышь достигает этой позиции, программа останавливается (думаю, что я ожидаю завершения цикла while).
Есть предложения?
Заранее спасибо.
UPDATE
Вот рабочий код с (или одним из возможных) ответом. Я не знаю, правильно ли обновлять сам вопрос с ответом, но я думаю, что он может быть полезен для других.
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('<Motion>', xy_motion)
Пожалуйста, дайте мне знать, если это правильно. Спасибо всем за обсуждение и предложения. Эти ссылки были полезными тоже.