触摸屏滚动Tkinter Python

时间:2019-05-16 09:28:14

标签: python tkinter scroll touchscreen

我正在为带有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)

2 个答案:

答案 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>'), '+')

enter image description here

我希望您会发现它有用。

答案 1 :(得分:1)

Saad的代码为基础,我对其进行了修改,使其可以在每个S.O上使用。 (win,linux,mac)使用$currentdate = Carbon::now();,并且我已经在此说明了一些修改。

编辑:我已经编辑了代码以显示完整的类。

yview_moveto