我正在为带有7英寸触摸屏的python的树莓派制作信息亭应用。 一切正常,现在,我正在尝试使滚动像触摸屏一样工作。我知道raspbian没有正确的触摸界面,因此,屏幕上的每一次触摸都可以像单击鼠标一样工作,并且如果我用手指触摸屏幕,则就像拖动功能一样。
要在python上实现此目的,我在画布上使用了此Vertical Scrolled Frame的修改后的版本代码,并且需要添加绑定<ButtonPress-1>
和<B1-Motion>
的事件。
<ButtonPress-1>
可以保存点击的y位置,并为bind_all
启用<B1-Motion>
功能。
<B1-Motion>
可能会设置滚动设置,以上下滚动设置<ButtonPress-1>
和此事件的event.y
保存的y值。
<ButtonRelease-1>
可能会在滚动的bind_all
中禁用<unbind_all>
功能。
我为事件添加的代码是这样,但我不知道如何使它正常运行,画布的.yview
函数使我的函数按预期工作。
def moving(event):
#In this part I don't know how to make my effect
self.canvas.yview('scroll',event.y,"units")
def clicked(event):
global initialy
initialy = event.y
self.canvas.bind_all('<B1-Motion>', moving)
def released(event):
self.canvas.unbind_all('<B1-Motion>')
self.canvas.bind_all('<ButtonPress-1>',clicked)
self.canvas.bind_all('<ButtonRelease-1>', released)
答案 0 :(得分:1)
我用几行代码修改了VerticalScrolledFrame
,这些代码确实可以滚动您想要的内容。我使用VerticalScrolledFrame测试了代码,并使用鼠标可以正常工作。将以下代码添加到VerticalScrolledFrame
。
self.offset_y = 0
def on_press(evt):
self.offset_y = evt.y_root
def on_touch_scroll(evt):
if evt.y_root-self.offset_y<0:
evt.delta = -1
else:
evt.delta = 1
# canvas.yview_scroll(-1*(evt.delta), 'units') # For MacOS
canvas.yview_scroll( int(-1*(evt.delta/120)) , 'units') # For windows
self.bind("<Enter>", lambda _: self.bind_all('<Button-1>', on_press), '+')
self.bind("<Leave>", lambda _: self.unbind_all('<Button-1>'), '+')
self.bind("<Enter>", lambda _: self.bind_all('<B1-Motion>', on_touch_scroll), '+')
self.bind("<Leave>", lambda _: self.unbind_all('<B1-Motion>'), '+')
我希望您会发现它有用。
答案 1 :(得分:1)
以Saad的代码为基础,我对其进行了修改,使其可以在每个S.O上使用。 (win,linux,mac)使用$currentdate = Carbon::now();
,并且我已经在此说明了一些修改。
编辑:我已经编辑了代码以显示完整的类。
yview_moveto