matplotlib:如何在图形上捕捉Shift+单击?

9

我有一个 matplotlib,并创建了一个 button_press_event,代码如下:

self.fig.canvas.mpl_connect('button_press_event', self.onClick)

def onClick(self, event)
    if event.button == 1:
        # draw some artists on left click

    elif event.button == 2:
        # draw a vertical line on the mouse x location on wheel click

    elif event.button == 3:
        # clear artists on right click

现在,是否可以将滚轮点击处理程序修改为以下内容:
    elif event.button == 2 or (event.button == 1 and event.key == "shift"):
        # draw a vertical line on the mouse x location 
        # on wheel click or on shift+left click 
        # (alternative way if there is no wheel for example)

似乎不支持按键操作,而不支持鼠标点击,但我不确定。有没有什么方法呢?
2个回答

15

你也可以绑定按键按下和松开事件,然后执行类似以下操作:

self.fig.canvas.mpl_connect('key_press_event', self.on_key_press)
self.fig.canvas.mpl_connect('key_release_event', self.on_key_release)

...

def on_key_press(self, event):
   if event.key == 'shift':
       self.shift_is_held = True

def on_key_release(self, event):
   if event.key == 'shift':
       self.shift_is_held = False

然后你可以在 onClick 函数中检查 self.shift_is_held 是否已经按下。

if event.button == 3:
    if self.shift_is_held:
        do_something()
    else:
        do_something_else()

似乎是一个好主意和解决方法,直到鼠标按钮与修饰键的适当支持得以实现。谢谢维克托! - NotNone
你可以使用 event.key == 'shift+left' 来捕获 shift + left 键盘按钮。 - Nir
我喜欢这个答案,但是我认为当按下多个键时会出现问题,因为key_release_event没有说明_释放_哪个键。例如:
  1. 按下Shift键(key_press_eventkey='shift'
  2. 按下Ctrl键(key_press_eventkey='ctrl+shift'
  3. 释放Shift键(key_release_eventkey='ctrl+shift'
  4. 释放Ctrl键(key_release_eventkey='ctrl') 最后,没有按下任何键,但是shift_is_held==True。你可以将条件改为if 'shift' in event.key,但是如果你先释放Ctrl键,Shift键仍然被按住,但shift_is_held==False... 有什么建议吗?
- Emma

2

如果您使用Qt,则可以简单地使用以下方法:

def onClick(self, event)
    # queries the pressed modifier keys
    mods = QGuiApplication.queryKeyboardModifiers()
    if event.button == 1 and mods == Qt.ShiftModifier:
        # do something when shift-clicking

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接