Introduction à Perl/Tk

Interfaces graphiques avec Perl


précédentsommairesuivant

XVII. Configuration des widgets avec configure et cget

Tous les widgets de Perl/Tk (et certains fournis séparément) peuvent utiliser les méthodes configure et cget. Les paramètres passés à ces méthodes sont les mêmes quel que soit le widget, et leurs résultats ont le même format.

La méthode configure vous permet d'assigner ou de modifier la valeur d'une option d'un widget, et d'en obtenir la valeur. La méthode cget ne peut affecter des valeurs, mais elle permet d'interroger les options plus simplement que configure.

XVII-A. La méthode configure

La forme classique d'un appel à configure est la suivante :

 
Sélectionnez
$widget->configure( [ option => nouvelle_valeur… ] );

Selon les paramètres qui lui sont passés, cette méthode réalisera l'une de ces trois opérations :

  • affectation ou modification des valeurs des options de $widget ;
  • renvoi de la valeur courante de n'importe quelle option de $widget ;
  • renvoi des valeurs courantes de toutes les options de $widget.

Pour affecter ou modifier la valeur d'une option, il suffit de passer en paramètre la paire option/valeur, comme on le fait lors de la création d'un widget :

 
Sélectionnez
$widget->configure(-option => nouvelle_valeur);

Quelle que soit l'option concernée, son effet se produira immédiatement. Pour connaître la valeur d'une seule option, il suffit de la passer en paramètre : la valeur renvoyée dépendra du fait que configure a été appelé dans un contexte de liste ou un contexte scalaire. La ligne suivante appelle la méthode dans un contexte de liste (car sa valeur de retour est assignée à un tableau) :

 
Sélectionnez
@infos = $widget->configure(-highlightthickness);

Dans un tel contexte, le résultat est un tableau de scalaires. Pour cet appel, il pourrait être :

 
Sélectionnez
-highlightthickness highlightThickness HighlightThickness 2 2

Le tableau renvoyé est composé des cinq valeurs suivantes (indiquées ici avec leur indice) :

0

Nom de l'option

1

Nom de l'option de la base de données des options (tel qu'il apparaîtrait dans le fichier .Xdefaults)

2

Classe dans la base de données des options

3

Valeur par défaut de l'option

4

Valeur courante de l'option

C'est souvent la valeur courante de l'option qui nous intéresse : en ce cas, il suffit d'appeler configure dans un contexte scalaire en affectant son résultat à une variable scalaire :

 
Sélectionnez
$valeur = $widget->configure(-highlightthickness);
print "$valeur\n";

Le résultat serait alors :

 
Sélectionnez
2

Si vous voulez obtenir la liste des valeurs de toutes les options reconnues par le widget, utilisez cette forme d'appel :

 
Sélectionnez
@config = $widget->configure();

@config est un tableau de tableaux. La façon la plus simple de l'afficher consiste à utiliser Tk::Pretty, qui se chargera de la tâche délicate de parcourir les tableaux et de mettre les informations sous une forme lisible :

 
Sélectionnez
use Tk;
use Tk::Pretty;

$mw = MainWindow->new();
$widget = $mw->Button;
@config = $widget->configure();
print Pretty @config;

Le résultat est le suivant(46) :

 
Sélectionnez
['-activebackground',activeBackground,Foreground,'#ececec','#ececec'],
['-activeforeground',activeForeground,Background,Black,Black],
['-activeimage',activeImage,ActiveImage,undef,undef],
['-anchor','anchor',Anchor,'center','center'],
['-background','background',Background,'#d9d9d9','#d9d9d9'],
['-bd',borderWidth],['-bg','background'],
['-bitmap','bitmap',Bitmap,undef,undef],
['-borderwidth',borderWidth,BorderWidth,2,2],
['-command','command',Command,undef,undef],
['-cursor','cursor',Cursor,undef,undef],
['-default','default',Default,'disabled','disabled'],
['-disabledforeground',disabledForeground,DisabledForeground,'#a3a3a3', '#a3a3a3'],
['-fg','foreground'],
['-font','font',Font,'Helvetica -12 bold', bless('Helvetica -12 bold',Tk::font)],
['-foreground','foreground',Foreground,Black,Black],
['-height','height',Height,0,0],
['-highlightbackground',highlightBackground,HighlightBackground,'#d9d9d9', '#d9d9d9'],
['-highlightcolor',highlightColor,HighlightColor,Black,Black],
['-highlightthickness',highlightThickness,HighlightThickness,1,1],
['-image','image',Image,undef,undef],
['-justify','justify',Justify,'center','center'],
['-padx',padX,Pad,3m,9],['-pady',padY,Pad,1m,3],
['-relief','relief',Relief,'raised','raised'],
['-state','state',State,'normal','normal'],
['-takefocus',takeFocus,TakeFocus,undef,undef],
['-text','text',Text,undef,''],
['-textvariable',textVariable,Variable,undef,undef],
['-underline','underline',Underline,-1,-1],
['-width','width',Width,0,0],
['-wraplength',wrapLength,WrapLength,0,0]

Bien que cette liste semble illisible, Tk::Pretty place des crochets et des virgules pour que les différentes sous-listes soient bien distinctes. Habituellement, cette liste ne sert que dans les phases de mises au point. La fin de cette annexe énumère les valeurs par défaut pour chaque type de widget.

XVII-A-1. La méthode cget

Les valeurs des options peuvent également être obtenues avec la méthode cget (configuration get) :

 
Sélectionnez
$widget->cget(-option);

Cet appel renvoie uniquement la valeur courante de l'option (ou une adresse, si l'option sert à stocker une référence) plutôt que la liste entière, telle qu'elle est produite par configure. Voici quelques exemples d'utilisation :

 
Sélectionnez
print $b->cget(-highlightthickness), "\n";
# Affiche 2

# Renvoie la référence :
print $menu_option->cget(-textvariable), "\n";

# Renvoie la valeur réelle :
print ${$option_menu->cget(-textvariable)}, "\n";
# ou…
$ref = $option_menu->cget(-textvariable);
print $$ref, "\n";

XVII-B. Valeurs par défaut, pour chaque widget

Les tableaux suivants contiennent toutes les options de tous les widgets standards de Tk8. Les quatre colonnes représentent les quatre premières valeurs renvoyées pour chaque option par configure.

Les informations contenues dans ces tableaux ont été obtenues en utilisant le bout de code suivant (substituez le widget voulu à Widget) :

 
Sélectionnez
$w = $mw->Widget->pack;
@config = $w->configure();
print Pretty @config;

XVII-B-1. Widget Button

Nom de l'option

Nom dans .Xdefault

Nom de la classe

Valeur par défaut

-activebackground

activeBackground

Foreground

SystemButtonFace

-activeforeground

activeForeground

Background

SystemButtonText

-activeimage

activeImage

ActiveImage

undef

-anchor

anchor

Anchor

center

-background

background

Background

SystemButtonFace

-bd

borderWidth

   

-bg

background

   

-bitmap

bitmap

Bitmap

undef

-borderwidth

borderWidth

BorderWidth

2

-command

command

Command

undef

-cursor

cursor

Cursor

undef

-default

default

Default

disabled

-disabledforeground

disabledForeground

DisabledForeground

SystemDisabledText

-fg

foreground

   

-font

font

Font

{MSSansSerif}8

-foreground

foreground

Foreground

SystemButtonText

-height

height

Height

0

-highlightbackground

highlightBackground

HighlightBackground

SystemButtonFace

-highlightcolor

highlightColor

HighlightColor

SystemWindowFrame

-highlightthickness

highlightThickness

HighlightThickness

1

-image

image

Image

undef

-justify

justify

Justify

center

-padx

padX

Pad

1

-pady

padY

Pad

1

-relief

relief

Relief

raised

-state

state

State

normal

-takefocus

takeFocus

TakeFocus

undef

-text

text

Text

undef

-textvariable

textVariable

Variable

undef

-underline

underline

Underline

-1

-width

width

Width

0

-wraplength

wrapLength

WrapLength

0

XVII-B-2. Widget Canvas

Nom de l'option

Nom dans .Xdefault

Nom de la classe

Valeur par défaut

-background

background

Background

SystemButtonFace

-bd

borderWidth

   

-bg

background

   

-borderwidth

borderWidth

BorderWidth

0

-closeenough

closeEnough

CloseEnough

1

-confine

confine

Confine

1

-cursor

cursor

Cursor

undef

-height

height

Height

7c

-highlightbackground

highlightBackground

HighlightBackground

SystemButtonFace

-highlightcolor

highlightColor

HighlightColor

SystemWindowFrame

-highlightthickness

highlightThickness

HighlightThickness

2

-insertbackground

insertBackground

Foreground

SystemButtonText

-insertborderwidth

insertBorderWidth

BorderWidth

0

-insertofftime

insertOffTime

OffTime

300

-insertontime

insertOnTime

OnTime

600

-insertwidth

insertWidth

InsertWidth

2

-relief

relief

Relief

flat

-scrollregion

scrollRegion

ScrollRegion

undef

-selectbackground

selectBackground

Foreground

SystemHighlight

-selectborderwidth

selectBorderWidth

BorderWidth

1

-selectforeground

selectForeground

Background

SystemHighlightText

-takefocus

takeFocus

TakeFocus

undef

-width

width

Width

10c

-xscrollcommand

xScrollCommand

ScrollCommand

undef

-xscrollincrement

xScrollIncrement

ScrollIncrement

0

-yscrollcommand

yScrollCommand

ScrollCommand

undef

-yscrollincrement

yScrollIncrement

ScrollIncrement

0

XVII-B-3. Widget Checkbutton

Nom de l'option

Nom dans .Xdefault

Nom de la classe

Valeur par défaut

-activebackground

activeBackground

Foreground

SystemButtonFace

-activeforeground

activeForeground

Background

SystemWindowText

-anchor

anchor

Anchor

center

-background

background

Background

SystemButtonFace

-bd

borderWidth

   

-bg

background

   

-bitmap

bitmap

Bitmap

undef

-borderwidth

borderWidth

BorderWidth

2

-command

command

Command

undef

-cursor

cursor

Cursor

undef

-disabledforeground

disabledForeground

DisabledForeground

SystemDisabledText

-fg

foreground

   

-font

font

Font

{MSSansSerif}8

-foreground

foreground

Foreground

SystemWindowText

-height

height

Height

0

-highlightbackground

highlightBackground

HighlightBackground

SystemButtonFace

-highlightcolor

highlightColor

HighlightColor

SystemWindowFrame

-highlightthickness

highlightThickness

HighlightThickness

1

-image

image

Image

undef

-indicatoron

indicatorOn

IndicatorOn

1

-justify

justify

Justify

center

-offvalue

offValue

Value

0

-onvalue

onValue

Value

1

-padx

padX

Pad

1

-pady

padY

Pad

1

-relief

relief

Relief

flat

-selectcolor

selectColor

Background

SystemWindow

-selectimage

selectImage

SelectImage

undef

-state

state

State

normal

-takefocus

takeFocus

TakeFocus

undef

-text

text

Text

undef

-textvariable

textVariable

Variable

undef

-underline

underline

Underline

-1

-variable

variable

Variable

undef

-width

width

Width

0

-wraplength

wrapLength

WrapLength

0

XVII-B-4. Widget Entry

Nom de l'option

Nom dans .Xdefault

Nom de la classe

Valeur par défaut

-background

background

Background

SystemWindow

-bd

borderWidth

   

-bg

background

   

-borderwidth

borderWidth

BorderWidth

2

-cursor

cursor

Cursor

xterm

-exportselection

exportSelection

ExportSelection

1

-fg

foreground

   

-font

font

Font

{MSSansSerif}8

-foreground

foreground

Foreground

SystemWindowText

-highlightbackground

highlightBackground

HighlightBackground

SystemButtonFace

-highlightcolor

highlightColor

HighlightColor

SystemWindowFrame

-highlightthickness

highlightThickness

HighlightThickness

0

-insertbackground

insertBackground

Foreground

SystemWindowText

-insertborderwidth

insertBorderWidth

BorderWidth

0

-insertofftime

insertOffTime

OffTime

300

-insertontime

insertOnTime

OnTime

600

-insertwidth

insertWidth

InsertWidth

2

-justify

justify

Justify

left

-relief

relief

Relief

sunken

-selectbackground

selectBackground

Foreground

SystemHighlight

-selectborderwidth

selectBorderWidth

BorderWidth

0

-selectforeground

selectForeground

Background

SystemHighlightText

-show

show

Show

undef

-state

state

State

normal

-takefocus

takeFocus

TakeFocus

undef

-textvariable

textVariable

Variable

undef

-width

width

Width

20

-xscrollcommand

xScrollCommand

ScrollCommand

undef

XVII-B-5. Widget Frame

Nom de l'option

Nom dans .Xdefault

Nom de la classe

Valeur par défaut

-background

background

Background

SystemButtonFace

-bd

borderWidth

   

-bg

background

   

-borderwidth

borderWidth

BorderWidth

0

-class

class

Class

Frame

-colormap

colormap

Colormap

undef

-container

container

Container

0

-cursor

cursor

Cursor

undef

-fg

foreground

   

-foreground

foreground

Foreground

Black

-height

height

Height

0

-highlightbackground

highlightBackground

HighlightBackground

SystemButtonFace

-highlightcolor

highlightColor

HighlightColor

SystemWindowFrame

-highlightthickness

highlightThickness

HighlightThickness

0

-label

undef

undef

undef

-labelPack

undef

undef

undef

-labelVariable

undef

undef

undef

-relief

relief

Relief

flat

-takefocus

takeFocus

TakeFocus

0

-visual

visual

Visual

undef

-width

width

Width

0

XVII-B-6. Widget Label

Nom de l'option

Nom dans .Xdefault

Nom de la classe

Valeur par défaut

-anchor

anchor

Anchor

center

-background

background

Background

SystemButtonFace

-bd

borderWidth

   

-bg

background

   

-bitmap

bitmap

Bitmap

undef

-borderwidth

borderWidth

BorderWidth

2

-cursor

cursor

Cursor

undef

-fg

foreground

   

-font

font

Font

{MSSansSerif}8

-foreground

foreground

Foreground

SystemButtonText

-height

height

Height

0

-highlightbackground

highlightBackground

HighlightBackground

SystemButtonFace

-highlightcolor

highlightColor

HighlightColor

SystemWindowFrame

-highlightthickness

highlightThickness

HighlightThickness

0

-image

image

Image

undef

-justify

justify

Justify

center

-padx

padX

Pad

1

-pady

padY

Pad

1

-relief

relief

Relief

flat

-takefocus

takeFocus

TakeFocus

0

-text

text

Text

undef

-textvariable

textVariable

Variable

undef

-underline

underline

Underline

-1

-width

width

Width

0

-wraplength

wrapLength

WrapLength

0

XVII-B-7. Widget Listbox

Nom de l'option

Nom dans .Xdefault

Nom de la classe

Valeur par défaut

-background

background

Background

SystemButtonFace

-bd

borderWidth

   

-bg

background

   

-borderwidth

borderWidth

BorderWidth

2

-cursor

cursor

Cursor

undef

-exportselection

exportSelection

ExportSelection

1

-fg

foreground

   

-font

font

Font

{MSSansSerif}8

-foreground

foreground

Foreground

SystemButtonText

-height

height

Height

10

-highlightbackground

highlightBackground

HighlightBackground

SystemButtonFace

-highlightcolor

highlightColor

HighlightColor

SystemWindowFrame

-highlightthickness

highlightThickness

HighlightThickness

1

-relief

relief

Relief

sunken

-selectbackground

selectBackground

Foreground

SystemHighlight

-selectborderwidth

selectBorderWidth

BorderWidth

1

-selectforeground

selectForeground

Background

SystemHighlightText

-selectmode

selectMode

SelectMode

browse

-setgrid

setGrid

SetGrid

0

-takefocus

takeFocus

TakeFocus

undef

-width

width

Width

20

-xscrollcommand

xScrollCommand

ScrollCommand

undef

-yscrollcommand

yScrollCommand

ScrollCommand

undef

XVII-B-8. Widget Menu

Nom de l'option

Nom dans .Xdefault

Nom de la classe

Valeur par défaut

-activebackground

activeBackground

Foreground

SystemHighlight

-activeborderwidth

activeBorderWidth

BorderWidth

1

-activeforeground

activeForeground

Background

SystemHighlightText

-background

background

Background

SystemButtonFace

-bd

borderWidth

   

-bg

background

   

-borderwidth

borderWidth

BorderWidth

1

-cursor

cursor

Cursor

arrow

-disabledforeground

disabledForeground

DisabledForeground

SystemDisabledText

-fg

foreground

   

-font

font

Font

Tim10

-foreground

foreground

Foreground

Black

-overanchor

undef

undef

undef

-popanchor

undef

undef

undef

-popover

undef

undef

undef

-postcommand

postCommand

Command

undef

-relief

relief

Relief

flat

-selectcolor

selectColor

Background

SystemMenuText

-takefocus

takeFocus

TakeFocus

0

-tearoff

tearOff

TearOff

1

-tearoffcommand

tearOffCommand

TearOffCommand

undef

-title

title

Title

undef

-type

type

Type

normal

XVII-B-9. Widget Radiobutton

Nom de l'option

Nom dans .Xdefault

Nom de la classe

Valeur par défaut

-activebackground

activeBackground

Foreground

SystemButtonFace

-activeforeground

activeForeground

Background

SystemWindowText

-anchor

anchor

Anchor

center

-background

background

Background

SystemButtonFace

-bd

borderWidth

   

-bg

background

   

-bitmap

bitmap

Bitmap

undef

-borderwidth

borderWidth

BorderWidth

2

-command

command

Command

undef

-cursor

cursor

Cursor

undef

-disabledforeground

disabledForeground

DisabledForeground

SystemDisabledText

-fg

foreground

   

-font

font

Font

{MSSansSerif}8

-foreground

foreground

Foreground

SystemWindowText

-height

height

Height

0

-highlightbackground

highlightBackground

HighlightBackground

SystemButtonFace

-highlightcolor

highlightColor

HighlightColor

SystemWindowFrame

-highlightthickness

highlightThickness

HighlightThickness

1

-image

image

Image

undef

-indicatoron

indicatorOn

IndicatorOn

1

-justify

justify

Justify

center

-padx

padX

Pad

1

-pady

padY

Pad

1

-relief

relief

Relief

flat

-selectcolor

selectColor

Background

SystemWindow

-selectimage

selectImage

SelectImage

undef

-state

state

State

normal

-takefocus

takeFocus

TakeFocus

undef

-text

text

Text

undef

-textvariable

textVariable

Variable

undef

-underline

underline

Underline

-1

-value

value

Value

undef

-variable

variable

Variable

selectedButton

-width

width

Width

0

-wraplength

wrapLength

WrapLength

0

XVII-B-10. Widget Scale

Nom de l'option

Nom dans .Xdefault

Nom de la classe

Valeur par défaut

-activebackground

activeBackground

Foreground

SystemButtonFace

-background

background

Background

SystemButtonFace

-bigincrement

bigIncrement

BigIncrement

0

-bd

borderWidth

   

-bg

background

   

-borderwidth

borderWidth

BorderWidth

2

-command

command

Command

undef

-cursor

cursor

Cursor

undef

-digits

digits

Digits

0

-fg

foreground

   

-font

font

Font

{MSSansSerif}8

-foreground

foreground

Foreground

SystemButtonText

-from

from

From

0

-highlightbackground

highlightBackground

HighlightBackground

SystemButtonFace

-highlightcolor

highlightColor

HighlightColor

SystemWindowFrame

-highlightthickness

highlightThickness

HighlightThickness

2

-label

label

Label

undef

-length

length

Length

100

-orient

orient

Orient

vertical

-relief

relief

Relief

flat

-repeatdelay

repeatDelay

RepeatDelay

300

-repeatinterval

repeatInterval

RepeatInterval

100

-resolution

resolution

Resolution

1

-showvalue

showValue

ShowValue

1

-sliderlength

sliderLength

SliderLength

10m

-sliderrelief

sliderRelief

SliderRelief

raised

-state

state

State

normal

-takefocus

takeFocus

TakeFocus

undef

-tickinterval

tickInterval

TickInterval

0

-to

to

To

100

-troughcolor

troughColor

Background

SystemScrollbar

-variable

variable

Variable

undef

-width

width

Width

5m

XVII-B-11. Widget Scrollbar

Nom de l'option

Nom dans .Xdefault

Nom de la classe

Valeur par défaut

-activebackground

activeBackground

Foreground

SystemButtonFace

-activerelief

activeRelief

Relief

raised

-background

background

Background

SystemButtonFace

-bd

borderWidth

   

-bg

background

   

-borderwidth

borderWidth

BorderWidth

0

-command

command

Command

undef

-cursor

cursor

Cursor

undef

-elementborderwidth

elementBorderWidth

BorderWidth

-1

-highlightbackground

highlightBackground

HighlightBackground

SystemButtonFace

-highlightcolor

highlightColor

HighlightColor

SystemWindowFrame

-highlightthickness

highlightThickness

HighlightThickness

0

-jump

jump

Jump

0

-orient

orient

Orient

vertical

-relief

relief

Relief

sunken

-repeatdelay

repeatDelay

RepeatDelay

300

-repeatinterval

repeatInterval

RepeatInterval

100

-takefocus

takeFocus

TakeFocus

undef

-troughcolor

troughColor

Background

SystemScrollbar

-width

width

Width

13

XVII-B-12. Widget Text

Nom de l'option

Nom dans .Xdefault

Nom de la classe

Valeur par défaut

-background

background

Background

SystemWindow

-bd

borderWidth

   

-bg

background

   

-borderwidth

borderWidth

BorderWidth

2

-cursor

cursor

Cursor

xterm

-exportselection

exportSelection

ExportSelection

1

-fg

foreground

   

-font

font

Font

{MSSansSerif}8

-foreground

foreground

Foreground

SystemWindowText

-height

height

Height

24

-highlightbackground

highlightBackground

HighlightBackground

SystemButtonFace

-highlightcolor

highlightColor

HighlightColor

SystemWindowFrame

-highlightthickness

highlightThickness

HighlightThickness

0

-insertbackground

insertBackground

Foreground

SystemWindowText

-insertborderwidth

insertBorderWidth

BorderWidth

0

-insertofftime

insertOffTime

OffTime

300

-insertontime

insertOnTime

OnTime

600

-insertwidth

insertWidth

InsertWidth

2

-padx

padX

Pad

1

-pady

padY

Pad

1

-relief

relief

Relief

sunken

-selectbackground

selectBackground

Foreground

SystemHighlight

-selectborderwidth

selectBorderWidth

BorderWidth

0

-selectforeground

selectForeground

Background

SystemHighlightText

-setgrid

setGrid

SetGrid

0

-spacing1

spacing1

Spacing

0

-spacing2

spacing2

Spacing

0

-spacing3

spacing3

Spacing

0

-state

state

State

normal

-tabs

tabs

Tabs

undef

-takefocus

takeFocus

TakeFocus

undef

-width

width

Width

80

-wrap

wrap

Wrap

char

-xscrollcommand

xScrollCommand

ScrollCommand

undef

-yscrollcommand

yScrollCommand

ScrollCommand

undef

XVII-B-13. Widget Toplevel

Nom de l'option

Nom dans .Xdefault

Nom de la classe

Valeur par défaut

-background

background

Background

SystemButtonFace

-bd

borderWidth

   

-bg

background

   

-borderwidth

borderWidth

BorderWidth

0

-class

class

Class

Toplevel

-colormap

colormap

Colormap

undef

-container

container

Container

0

-cursor

cursor

Cursor

undef

-fg

foreground

   

-foreground

foreground

Foreground

Black

-height

height

Height

0

-highlightbackground

highlightBackground

HighlightBackground

SystemButtonFace

-highlightcolor

highlightColor

HighlightColor

SystemWindowFrame

-highlightthickness

highlightThickness

HighlightThickness

0

-menu

menu

Menu

undef

-overanchor

undef

undef

undef

-popanchor

undef

undef

undef

-popover

undef

undef

undef

-relief

relief

Relief

flat

-screen

screen

Screen

undef

-takefocus

takeFocus

TakeFocus

0

-title

undef

undef

Toplevel

-use

use

Use

undef

-visual

visual

Visual

undef

-width

width

Width

0


précédentsommairesuivant
NDT Pour améliorer la lisibilité, j'ai fait en sorte de placer chaque tableau sur une ligne distincte. Le script de l'exemple ne produit qu'une ligne unique.

Vous avez aimé ce tutoriel ? Alors partagez-le en cliquant sur les boutons suivants : Viadeo Twitter Facebook Share on Google+   

  

Licence Creative Commons
Le contenu de cet article est rédigé par Nancy Walsh et est mis à disposition selon les termes de la Licence Creative Commons Attribution - Pas d'Utilisation Commerciale - Pas de Modification 3.0 non transposé.
Les logos Developpez.com, en-tête, pied de page, css, et look & feel de l'article sont Copyright © 2018 Developpez.com.