什么是水平边缘滚动的Tkinter事件(在Linux中)?

inkz8wg9  于 2023-04-11  发布在  Linux
关注(0)|答案(3)|浏览(523)

我有一个带滚动条的Python Tkinter文本小部件。我想定义自己的方法,在笔记本电脑的触摸板上使用水平边缘滚动。然而,我不知道活动名称(s)允许我这样做。垂直事件工作正常(按下shift和使用垂直边缘滚动来进行水平滚动也是如此)。我正在寻找的事件名称是什么?它们不t似乎是"<Button-6>""<Button-7>",因为这些给予了误差;例如
_tkinter.TclError: specified keysym "6" for non-key event
我不知道"<Button-6>"和钥匙有什么关系,但是好吧。
我用的是Linux(我这么说是因为Linux上垂直滚动的事件和Windows上的不同),我知道如何从按键中发现未知的事件名称,但我不知道如何在触摸板上做到这一点。
查看Text小部件的事件列表似乎不是很有见地(除此之外,我没有看到一个事件看起来像是用于水平鼠标滚轮的)。
我在Linux(Xubuntu 17.04,64位)上使用Python 3.5.3。

hrysbysz

hrysbysz1#

我研究了与打印一般事件相关的代码,编写了针对按钮按下(而不仅仅是按键按下)的代码,我看到了event.num针对水平鼠标滚轮的代码。所以,我做了以下解决方案:
我不认为有水平鼠标滚动的事件名称(如果我错了请告诉我),但似乎有事件编号(向左滚动为6,向右滚动为7)。虽然"<Button-6>""<Button-7>"似乎不起作用,但水平边缘滚动在Linux上的Python 3.5.3的Tkinter中仍然是可能的(我没有测试其他任何东西)。
您需要绑定"<Button>"而不是"<Button-6>""<Button-7>",并创建一个类似于以下内容的处理程序:

...
    self.bind("<Button>", self.touchpad_events)
...

def touchpad_events(self, event):
    if event.num==6:
        self.xview_scroll(-10, "units")
        return "break"
    elif event.num==7:
        self.xview_scroll(10, "units")
        return "break"

我在if/elif语句的每个部分都做了一个return "break",因为我们不想总是返回“break”,并中断其他按钮事件(仅当水平鼠标滚轮滚动时);我的意思是,如果你打破了所有的时间常规左键将不再工作(除非你的程序),和类似的东西.我只是做10-10而不是event.delta/120,因为它给了我以下错误,否则出于一些奇怪的原因,和只是把数字手动似乎工作得很好:
tkinter.TclError: expected integer but got "0.0"
总之,我测试了这个解决方案,它很有效。问题解决了。:)

qltillow

qltillow2#

对于那些多年后可能在这里的人,在Windows(10如果它的问题),Python 3.10,触摸板滚动值由event.state确定。对于我的笔记本电脑,值是8垂直和9水平。代码示例:

if event.state == 9:
        self.canvas.xview_scroll(int(-1 * (event.delta / 80)), "units")
elif event.state == 8:
        self.canvas.yview_scroll(int(-1 * (event.delta / 100)), "units")
# Way to test YOUR horizontal & vertical scroll:
print(event.state)

这意味着当你尝试滚动时,你可以通过使用print(event.state)来找出你的垂直滚动和水平滚动的值,然后它会打印出你正在做的滚动,让你检查你的值。Brōtsyorfuzthrāx提供的值对我不起作用,这就是为什么我分享。希望它有帮助!

mzmfm0qo

mzmfm0qo3#

我只是想在MacOS上添加它,因为没有地方告诉这一点,我花了相当多的时间进行实验和搜索。event.state从0更改为垂直鼠标滚动和1为水平鼠标滚动。

def mouseScroll(event):
    if event.state == 0:
        canvas.y_viewscroll(-event.delta, "units")
    elif event.state == 1: # you can use just an else as it can only be 0 or 1
        canvas.x_viewscroll(-event.delta, "units")

相关问题