Ткинтер как отключить прокрутку при B1-Motion вне виджета - PullRequest
0 голосов
/ 15 апреля 2019

Итак, у меня есть программа, которую я создаю для планшета, которая содержит текстовые виджеты. Я хотел иметь возможность прокручивать текстовые виджеты, просто щелкая и перетаскивая их (поскольку полосы прокрутки трудно использовать на сенсорном экране).

Проблема возникает, хотя всякий раз, когда вы покидаете текстовый виджет во время прокрутки, вы увидите функцию, с которой я столкнулся, с тем, как обычно реагирует Tkinter.

Обычно, если вы перетаскиваете текстовый виджет, он будет прокручиваться в этом направлении, но это противоречит моей функции.

Извините, поскольку я знаю, что это было написано плохо, но если вы попробуете код и просто перетащите его для прокрутки, вы увидите мою проблему.

import Tkinter as Tk
last_y= None
root = Tk.Tk()
Text_widget= Tk.Text(root, height=20, width=30)
Text_widget.pack()
Text_widget.insert(Tk.END, "t\nh\ni\ns\n \na\n \nt\ne\ns\nt\n \nt\no\n \nf\ni\ng\nu\nr\ne\n \nt\nh\ni\ns\n \no\nu\nt\n\
    t\nh\ni\ns\n \na\n \nt\ne\ns\nt\n \nt\no\n \nf\ni\ng\nu\nr\ne\n \nt\nh\ni\ns\n \no\nu\nt\n\
    t\nh\ni\ns\n \na\n \nt\ne\ns\nt\n \nt\no\n \nf\ni\ng\nu\nr\ne\n \nt\nh\ni\ns\n \no\nu\nt\n\
    t\nh\ni\ns\n \na\n \nt\ne\ns\nt\n \nt\no\n \nf\ni\ng\nu\nr\ne\n \nt\nh\ni\ns\n \no\nu\nt\n\
    t\nh\ni\ns\n \na\n \nt\ne\ns\nt\n \nt\no\n \nf\ni\ng\nu\nr\ne\n \nt\nh\ni\ns\n \no\nu\nt\n")
Text_widget.config(state='disabled')


def tablet_drag_y(event):
    global last_y
    print 5
    if last_y==None:
        last_y=event.y_root
        event.widget.tag_remove(Tk.SEL, "1.0", Tk.END)
        return "break"
    movement= (event.y_root-last_y)
    event.widget.yview(Tk.SCROLL,-1*(movement), "pixels")
    last_y=event.y_root
    event.widget.tag_remove(Tk.SEL, "1.0", Tk.END)
    return "break"
Text_widget.bind("<B1-Motion>", tablet_drag_y)


Tk.mainloop()

1 Ответ

0 голосов
/ 15 апреля 2019

Так что на случай, если кто-то еще попытается сделать это, я просто хочу официально ответить, все заслуги переданы фурам за решение.

Проблема имела место в событиях "<Enter>" и "<Leave>"поэтому мне просто пришлось связать их с помощью функции, которая использовала return "break", чтобы остановить его выполнение.

Вот обновленная версия моего примера кода с реализованным решением.

import Tkinter as Tk
last_y= None
root = Tk.Tk()
Text_widget= Tk.Text(root, height=20, width=30)
Text_widget.pack()
Text_widget.insert(Tk.END, "t\nh\ni\ns\n \na\n \nt\ne\ns\nt\n \nt\no\n \nf\ni\ng\nu\nr\ne\n \nt\nh\ni\ns\n \no\nu\nt\n\
    t\nh\ni\ns\n \na\n \nt\ne\ns\nt\n \nt\no\n \nf\ni\ng\nu\nr\ne\n \nt\nh\ni\ns\n \no\nu\nt\n\
    t\nh\ni\ns\n \na\n \nt\ne\ns\nt\n \nt\no\n \nf\ni\ng\nu\nr\ne\n \nt\nh\ni\ns\n \no\nu\nt\n\
    t\nh\ni\ns\n \na\n \nt\ne\ns\nt\n \nt\no\n \nf\ni\ng\nu\nr\ne\n \nt\nh\ni\ns\n \no\nu\nt\n\
    t\nh\ni\ns\n \na\n \nt\ne\ns\nt\n \nt\no\n \nf\ni\ng\nu\nr\ne\n \nt\nh\ni\ns\n \no\nu\nt\n")
Text_widget.config(state='disabled')


def tablet_drag_y(event):
    global last_y
    print 5
    if last_y==None:
        last_y=event.y_root
        event.widget.tag_remove(Tk.SEL, "1.0", Tk.END)
        return "break"
    movement= (event.y_root-last_y)
    event.widget.yview(Tk.SCROLL,-1*(movement), "pixels")
    last_y=event.y_root
    event.widget.tag_remove(Tk.SEL, "1.0", Tk.END)
    return "break"


def cancel_normal_scroll(event):
    return "break"


Text_widget.bind("<B1-Motion>", tablet_drag_y)
Text_widget.bind("<Enter>", cancel_normal_scroll)
Text_widget.bind("<Leave>", cancel_normal_scroll)


Tk.mainloop()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...