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

时间:2017-09-13 10:21:06

标签: python linux events tkinter mousewheel

我有一个带滚动条的Python Tkinter Text小部件。我想定义自己的方法在笔记本电脑的触摸板上使用水平边缘滚动。但是,我不知道允许我这样做的事件名称。垂直事件工作正常(按下shift并使用垂直边缘滚动进行水平滚动也是如此)。我正在寻找什么活动名称?它们似乎不是"<Button-6>""<Button-7>",因为它们会出错; e.g。

_tkinter.TclError: specified keysym "6" for non-key event

我不确定"<Button-6>"与密钥有什么关系,但没关系。

我正在使用Linux(我这样说是因为垂直滚动的事件在Linux上与Windows不同)。我知道如何通过按键发现未知的事件名称,但我也不确定如何使用触摸板。

查看“文本”窗口小部件的事件列表似乎并不特别有洞察力(除了我没有看到类似于水平鼠标滚轮的事件)。

我在Linux上使用Python 3.5.3(Xubuntu 17.04,64位)。

2 个答案:

答案 0 :(得分:2)

我调查了与打印一般事件相关的代码,为按钮按下(不仅仅是按键)制作了代码,我看到了水平鼠标滚轮的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"

无论如何,我测试了这个解决方案并且它有效。问题解决了。 :)

答案 1 :(得分:0)

我只是想在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")