3 votes

Comment distinguer les boutons gauche et droit dans SpanSelector ?

Je veux utiliser SpanSelector pour sélectionner deux intervalles dans une parcelle. Pour enregistrer les différents extrema des intervalles, j'aimerais utiliser un indicateur selon que j'ai sélectionné l'intervalle à l'aide du bouton de droite ou de gauche (afin de pouvoir distinguer les deux intervalles souhaités).

Est-ce possible ?


Édité :

Pour être plus précis : j'aimerais qu'une fois le tracé affiché, l'élément SpanSelector dessine une zone rouge si l'on utilise le bouton gauche et une zone bleue si l'on utilise le bouton droit.


Exemple :

Le code ci-dessous permet à l'utilisateur de sélectionner un intervalle de manière interactive, puis d'imprimer cet intervalle.

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.widgets as mwidgets  

fig = plt.figure() 
ax = plt.axes() 
x = np.arange(0,2*np.pi)  
y = np.sin(x) 
ax.plot(x,y) 

def onselect(vmin, vmax):
    print(vmin, vmax)

span = mwidgets.SpanSelector(ax, onselect, 'horizontal') 

plt.show()                                                               

J'aimerais modifier le code ci-dessus de telle sorte que si l'intervalle est dessiné par le bouton gauche, il s'imprime "LEFT: vimin, vmax" et que, si l'intervalle est dessiné par le bouton droit, il s'imprime "RIGHT: vmin, vmax" .

Est-ce possible ?

2voto

SpanSelector(..., button=1)

serait le sélecteur de portée pour le bouton gauche de la souris et

SpanSelector(..., button=3)

serait le sélecteur de portée pour le bouton droit de la souris.

0voto

Stefano Points 433

J'ai résolu le problème en utilisant mpl_connect . Je n'ai pas fait la distinction entre le clic gauche et le clic droit, mais j'ai fait en sorte que le code traite le clic gauche comme un clic droit. SpanSelector de manière différente selon que l'espace sélectionné par la souris a été précédé d'un enter ou une touche shift+enter frappe. Je laisse le code ci-dessous au cas où il serait utile à quelqu'un d'autre.

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.widgets as mwidgets  

fig = plt.figure() 
ax = plt.axes() 
x = np.arange(0,2*np.pi)  
y = np.sin(x) 
ax.plot(x,y) 
ax.set_title('[Press \'enter\' and \'shift+enter\' to select the intervals]')

def onselect(vmin, vmax):
    if plot_key_input == 'enter':
        print('Interval type 1:', vmin, vmax)
    if plot_key_input == 'enter+shift':
        print('Interval type 2:', vmin, vmax)

# The variable plot_key_input will store the key that is pressed during the plot visualization
plot_key_input = None
# Get the key pressed during the plot visualization
def onPressKey(event):
# Defined as a global variable so it will affect other programs and functions
    global plot_key_input
    plot_key_input = event.key

# Connect the keys to the function onPressKey during the plot visualization
cid = fig.canvas.mpl_connect('key_press_event', onPressKey)

span = mwidgets.SpanSelector(ax, onselect, 'horizontal') 

plt.show() 

# Disconnect the keys to the function onPressKey
fig.canvas.mpl_disconnect(cid)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X