Tkinter如何在小部件中退出B1-Motion时禁用滚动功能

时间:2019-04-15 20:00:43

标签: python tkinter

所以我有一个要为平板电脑制作的程序,其中包含文本小部件。我希望能够简单地通过单击并拖动来滚动文本小部件(因为很难通过触摸屏使用滚动条)。

问题会发生,尽管每当您在滚动时离开文本小部件时,您都会看到我为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 :(得分:0)

因此,以防万一其他人尝试这样做,我只想正式回答,所有功劳都归功于该解决方案。

问题发生在"<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()