所以我有一个要为平板电脑制作的程序,其中包含文本小部件。我希望能够简单地通过单击并拖动来滚动文本小部件(因为很难通过触摸屏使用滚动条)。
问题会发生,尽管每当您在滚动时离开文本小部件时,您都会看到我为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()
答案 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()