Bonjour,
m'étant remis a perl depuis peut, je voudrais afficher une image comme un fond de façon a ce que je puisse avoir des boutons et autes widgets par dessus mais je ne sais pas comment faire, quelqu'un saurait-t-il m'aider ?
Merci.
Version imprimable
Bonjour,
m'étant remis a perl depuis peut, je voudrais afficher une image comme un fond de façon a ce que je puisse avoir des boutons et autes widgets par dessus mais je ne sais pas comment faire, quelqu'un saurait-t-il m'aider ?
Merci.
C'est possible mais un peu complexe à faire.
Je suppose que ton image est grande, tu devras donc faire un label avec -image à la place de -text. L'image occupera donc toute ta fenêtre. Ensuite, pour placer les autres widgets par dessus l'image, tu devras utiliser le gestionnaire d'espace place à la place de pack ou grid. C'est le seul moyen de superposer des widgets. Tu devras donc jouer ensuite avec les coordonnées pour faire tes placements.
merci c'est vrai que avec grid ou pack, je n'avait pas du tout les résultats que je voulait
arf, c'est justement la question que j'allais poser...
mais depuis que tu m'as poussé à utiliser pack et grid j'ai pu trop envie de revenir à place...
Par contre idée (en écrivant lol) ne pourrait on pas faire le fond avec label comme tu dis, puis faire une frame générale par dessus placée avec place et ensuite utiliser pack et grid dans cette frame...?
Je vais testé ça :ccool:
Bon c'est pas très concluant...
ça marche en soit mais plusieurs problèmes se posent:
1/ les wigets que l'on rajoute par dessus l'image de fond e peuvent pas être définis avec un fond transparent (à part Frame...), donc ça réduit considérablement le concept...
2/ le redimensionnement de l'image ne va pas être facile, tel quel c'est pas faisable...
Du coup perso je vais chercher la possibilité de gérer non pas une mais des morceaux d'images (un peu comme une page html...), par contre je ne sais pas comment intercepter le clic sur les boutons minimize et maximize du mw ... ? J'ai vu qu'avec le protocol DELETE on pouvait, mais comment se nomme les protocols pour ces deux boutons? je ne trouve rien sur le net...?
En effet honte à moi!!!! je crois que là tu aurais pu sortir le fouet tu sais ;)
en faite j'ai hésité mais je pensais pas que ça vous intéresserais...
voilà une idée de code:
J'ai mitCode:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59 use strict; use Tk; use Tk::Photo; use Tk::JPEG; use Tk::Pane; # -- Définition des Variables Tk -- # my ($Fenetre_Principale, $Label_FOND, $Frame_Principale, $Label_TEST); my ($Image_FOND); # -- Création de la fenêtre principale -- # $Fenetre_Principale = MainWindow->new(); $Fenetre_Principale -> minsize('800','600'); $Fenetre_Principale -> title("test fond image"); #$Fenetre_Principale -> protocol("WM_DELETE_WINDOW", sub {return;}); # -- Création de Label Fond -- # $Image_FOND = $Fenetre_Principale -> Photo( -file => "D:/DATA/Images/fond.jpg", -height => 600, -width => 800); $Image_FOND -> redither; $Label_FOND = $Fenetre_Principale -> Label(-image => $Image_FOND, -justify => 'center'); $Label_FOND -> pack(-side => 'left', -fill => 'both', -anchor => 'nw', -expand => 0); # -- Création de la Frame Principale -- # $Frame_Principale = $Label_FOND -> Frame(-background => ''); $Frame_Principale -> place(-x => 0, -y => 0, -width => 800, -height => 600); # -- Création d'un label test -- # $Label_TEST = $Frame_Principale -> Label(-text => "ceci est un test", -background => 'white'); $Label_TEST -> pack(-side => 'top', -anchor => 'n', -expand => 0); #============================ # -- Lanceur d'évènement -- # #============================ MainLoop;
en commenter car ça ne marche pas... mais je pense creuser par là si je trouve comment faire pour intercepter cette fonction (protocol)... car il semblerait que l'on puisse agrandire, copier coller etc... les images dans le script donc il y aurait un truc à faire par là...Code:$Fenetre_Principale -> protocol("WM_DELETE_WINDOW", sub {return;});
Voilà un petit script qui redimensionne l'image à chaque modification de taille de la fenêtre. Bon, ce n'est pas très optimum, c'est juste pour s'amuser un peu. Il faut que tu installes le module PerlMagick.
Test et dis moi ce que tu en penses :
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92 #!/usr/bin/perl use strict; use warnings; use Tk; use Tk::Photo; use Tk::JPEG; use Image::Magick; use File::Temp; my $image = 'D:/DATA/Images/fond.jpg'; # -- Création de la fenêtre principale -- # my $Fenetre_Principale = MainWindow->new(); $Fenetre_Principale->minsize( '800', '600' ); $Fenetre_Principale->title("test fond image"); $Fenetre_Principale->protocol( "WM_DELETE_WINDOW", sub { return; } ); # -- Création de Label Fond -- # my $Image_FOND = $Fenetre_Principale->Photo( -file => $image ); my $Label_FOND = $Fenetre_Principale->Label( -image => $Image_FOND, -justify => 'center' ); # -- Création de la Frame Principale -- # my $Frame_Principale = $Fenetre_Principale->Frame(); my $bouton_exit = $Frame_Principale->Button( -text => 'Quitter', -command => sub { exit; } ); # -- Création d'un label test -- # my $Label_TEST = $Frame_Principale->Label( -text => 'ceci est un test', -background => 'white' ); $Label_FOND->pack(qw/ -fill both -expand 1 /); $Frame_Principale->place( -relx => 0.5, -rely => 0.5, ); $Label_TEST->pack(qw/-side top /); $bouton_exit->pack(qw/-side bottom/); # Update de la fenetre afin de récupérer la taille de l'image $Fenetre_Principale->update; my ( $largeur, $hauteur ) = ( $Fenetre_Principale->width, $Fenetre_Principale->height ); # Redimensionner l'image à chaque fois que la taille du widget change. $Fenetre_Principale->Tk::bind( '<Configure>' => [ \&RedimensionnerImage, { image => $image, image_fond => $Image_FOND, label_fond => $Label_FOND, ref_largeur => \$largeur, ref_longueur => \$hauteur, } ], ); MainLoop; # Redimmensionner l'image à chaque fois que la taille du widget change. sub RedimensionnerImage { my ( $widget, $information_ref ) = @_; my $image = $information_ref->{image}; my $Image_FOND = $information_ref->{image_fond}; my $Label_FOND = $information_ref->{label_fond}; my $largeur = ${ $information_ref->{ref_largeur} }; my $hauteur = ${ $information_ref->{ref_longueur} }; # Calcul de la taille du widget my $largeur_widget = $widget->width; my $hauteur_widget = $widget->height; #print "$largeur_widget == $largeur and $hauteur_widget == $hauteur\n"; # Eviter les boucles infinies if ( $largeur_widget == $largeur and $hauteur_widget == $hauteur ) { return; } # On crée une nouvelle image redimensionnée à cette taille my $Magick = new Image::Magick; $Magick->Read($image); $Magick->Resize( width => $largeur_widget, height => $hauteur_widget ); my ($extension) = $image =~ m{(\.\w+)$}; my ( $fh, $filename ) = File::Temp::tempfile( SUFFIX => $extension, UNLINK => 1 ); close($fh); $Magick->Write($filename); $Image_FOND = $widget->Photo( -file => $filename ); $Label_FOND->configure( -image => $Image_FOND, ); unlink $filename; $largeur = $largeur_widget; $hauteur = $hauteur_widget; return; }
J'essais de tester mais impossible d'installer ce fameux module... je retesterais ce we si j'ai un moment et je mettrais ce que ça donne,
si ça marche vu le code ça peut être une bonne option, certes ça alourdit le code mais ça peut être simpa :)
as tu le repository trouchelle ?
EssayeCitation:
ok je passe vite fait je viens de tester en arrivant au boulot :)
ça a l'air de marcher, le premier clique m'a bien redimensionner le tout mais quand j'ai voulu ragrandir il est partit en boucle ... enfin ceci dit le principe fonctionne donc je vais creuser ;)
bon j'ai essayé de revoir un peu le code ce soir, mais comme le code je tourne en rond...
j'ai tenté de rajouté des controles sur ta ligne pour éviter les boucles mais ça ne change rien... ça ne te le fait pas chez toi?
Non chez moi, ça ne boucle pas à l'infini, mais le script fonctionne tout de même bizarrement. De toute façon, je ne te conseil pas son utilisation en prod. Si tu souhaites vraiment faire ce genre de chose, je pense que le mieux est de fixer définitivement la taille du widget et d'avoir une image de cette taille. L'inconvénient est que l'utilisateur ne pourra pas modifier la taille de la fenêtre.
je suis assez d'accord avec toi, je n'ai pas encore décidé si j'allais la fixer définitivement ou pas mais comme mon appli sert en "libre service" je pourrais très bien le faire en fixe oui...