Précédent   Forum du club des développeurs et IT Pro > Autres langages > Perl > Interfaces Graphiques
Interfaces Graphiques Forum d'entraide pour les interfaces graphiques en Perl (TK, GTK, Tk-Zinc, 2D et 3D avec OpenGPL, ....). Avant de poster, veuillez consulter la FAQ Perl/Tk , les cours Perl.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 23/12/2011, 00h28   #1
phoenix420
Futur Membre du Club
 
Homme mAtT
Etudiant en Bioinformatique
Inscription : avril 2010
Messages : 132
Détails du profil
Informations personnelles :
Nom : Homme mAtT
Âge : 24
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Etudiant en Bioinformatique

Informations forums :
Inscription : avril 2010
Messages : 132
Points : 19
Points : 19
Par défaut Perl Gtk2 - Problème remplir Combobox

Bonjour tout le monde.

Je ne sais pas si quelqu'un va pouvoir m'aider, car je travaille en Perl, plus précisément j'essaie de développer une application avec interface graphique Gtk2.

Mon problème est le suivant : dans cette partie du code, mon interface dispose d'une fenêtre de type Dialog. A l'intérieur, j'affiche un Label, et deux cadres, chacun contenant une ComboBox.

Je réussis à créer mes widgets, cependant je n'arrive pas à remplir mes ComboBox ! On ne rentre même pas dans les boucles for qui sont censées les remplir alors que ces boucles sont situées en plein milieu du code de la création des widgets, c'est à n'y rien comprendre ....

Voilà le code :

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
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
sub timeSeriesChooser
{
	my($source) = @_;
	
	headersExtract($source);
	
	#fileProgress($source);
	
	$window->iconify();							# réduit la fenêtre principale
	# $file_entry->set_sensitive(0);			# rend le champ de saisie du fichier source inutilisable
	# $buttParcourir->set_sensitive(0);			# rend le bouton Parcourir inutilisable
	# $buttLancer->set_sensitive(0);			# rend le bouton Explorer inutilisable
	
	# création de la boîte de dialogue
	# la boîte de dialogue comporte un TITRE, son widget parent est la fenêtre WINDOW,
	# elle est modale donc la fenêtre principale WINDOW ne peut être utilisée tant que la fenêtre de dialogue est ouverte
	# si on supprime la fenêtre principale, la fenêtre de dialogue est détruite également
	$dialogWindow = Gtk2::Dialog->new('TimeSeriesAnalyzer : sélection des données à analyser',
										 $window,
										 [qw/ destroy-with-parent/],
										 'gtk-ok' => 'ok',
										 'gtk-cancel' => 'cancel');
	
	# on rend le bouton OK inutilisable
	$dialogWindow->set_response_sensitive('ok',0);
	# fermeture du programme quand on clique sur la croix rouge
	$dialogWindow->signal_connect('delete_event', sub{$window->deiconify();$dialogWindow->destroy();});
	# centrage de la fenêtre de dialogue à l'écran
	$dialogWindow->set_position('center');
	# ajout de la fenêtre dans le hash de composants
	$W{dialogWindow} = $dialogWindow;
	
	my $vbox = $dialogWindow->vbox;
	$vbox->set_border_width(10);
	
	########
	my $hbox = Gtk2::HBox->new();
	$hbox->set_border_width(10);
	$vbox->pack_start($hbox,1,1,0);
	
	my $labIntro = Gtk2::Label->new('Veuillez maintenant sélectionner les données à analyser :');
	$labIntro->set_justify('center');
	$hbox->add($labIntro);
	
        ### creation de la partie contenant les ComboBox
	my $hboxDiff = &ret_hbox();
	
	$vbox->pack_start($hboxDiff,1,1,0);
	
	# on montre la fenêtre princpale en dernier

	$dialogWindow->show_all();
	
	$dialogWindow->run();
}

##### creation de la HBox qui contient mes ComboBox
sub ret_hbox
{
	########
	my $hbox2 = Gtk2::HBox->new();
	$hbox2->set_border_width(20);
	
	###
	my $cadre1 = Gtk2::Frame->new("  Série temporelle (Abscisses) ");
	$cadre1->set_border_width(10);
	
	
	my $hboxCadre1 = Gtk2::HBox->new();
	$hboxCadre1->set_border_width(20);
	
	
	$comboBoxX = Gtk2::ComboBox->new_text;
	$comboBoxX->set_border_width(10);
	### remplissage de la combobox
	for(my $i=0;$i < scalar(@entetes);$i++)
	{
		print "OK";
		$comboBoxX->append_text($entetes[$i]);
	}
	$comboBoxX->set_active(0);
	
	
	###
	my $cadre2 = Gtk2::Frame->new("  Ordonnées  ");
	$cadre2->set_border_width(10);
	
	
	my $hboxCadre2 = Gtk2::HBox->new();
	$hboxCadre2->set_border_width(20);
	
	
	$comboBoxY = Gtk2::ComboBox->new_text;
	$comboBoxY->set_border_width(10);
	
        ### remplissage de la combobox
	for(my $i=0;$i < scalar(@entetes);$i++)
	{
		print "OKbis";
		$comboBoxY->append_text($entetes[$i]);
	}
	$comboBoxY->set_active(0);
	
	
	$hboxCadre1->add($comboBoxX);
	$hboxCadre2->add($comboBoxY);
	
	$cadre2->add($hboxCadre2);
	$cadre1->add($hboxCadre1);
	
	$hbox2->add($cadre1);
	$hbox2->add($cadre2);
	
	$hbox2->show_all();
	
	return $hbox2;
}
Je vous remercie, et souhaite à tout le monde de passer de bonnes fêtes de fin d'année !


Matt.
phoenix420 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/12/2011, 16h47   #2
Beniou
Membre expérimenté
 
Avatar de Beniou
 
Homme
Inscription : novembre 2009
Messages : 357
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 33
Localisation : France, Nord (Nord Pas de Calais)

Informations forums :
Inscription : novembre 2009
Messages : 357
Points : 509
Points : 509
Bonjour,

Une idée comme ça : si tu ne rentre pas dans les boucles mises en couleur c'est peut être que parce que ton tableau @entetes ne contient rien ??
Fais un print des données de ton tableau @entetes avant la boucle pour voir...

Comme dans ce bout de code, on ne voit pas comment est créé ton tableau...(attention aussi à la portée des variables...)
Beniou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/12/2011, 03h29   #3
phoenix420
Futur Membre du Club
 
Homme mAtT
Etudiant en Bioinformatique
Inscription : avril 2010
Messages : 132
Détails du profil
Informations personnelles :
Nom : Homme mAtT
Âge : 24
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Etudiant en Bioinformatique

Informations forums :
Inscription : avril 2010
Messages : 132
Points : 19
Points : 19
Par défaut Résolu

En effet c'était bien un gros problème en amont au niveau du tableau entetes. Je m'en suis rendu compte avant de lire cette réponse mais c'était bien vu !

Ce qui est bizarre c'est que je n'avais pas de message d'erreur m'informant que le tableau était vide.

Autre question : j'essaie de créer un fichier avec un widget FileChooserDialog qui fonctionne très bien en ouverture. Cependant quand je l'utilise en écriture ('save') même si le chemin du fichier est valide, le script s'arrête en me disant que le fichier n'existe pas ... Ce qui est normal puisque je veux le créer ...

Ma fonction pour ouvrir ou sauver un fichier (avec mon filechooserdialog) :

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
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
sub openOrSaveFile
{
	#---------------------------------------------------------
	# Ouvre une fenêtre pop-up pour choisir un fichier source-
	# Specify a header to be displayed------------------------
	# Specify a type depending on your needs------------------
	# Optionally add a filter to show only certain files------
	# will return a path, if valid----------------------------
	#---------------------------------------------------------
 
    my($type,$filter,$outputType) =@_;
	#$type peut être : 'open', 'save', 'select-folder' ou 'create-folder'
	
    my $file_chooser =  Gtk2::FileChooserDialog->new ('Choisissez le fichier à utiliser :',
													  $window,
													  $type,
													  'gtk-ok' => 'ok',
													  'gtk-cancel' => 'cancel');
    
	$file_chooser->set_do_overwrite_confirmation(1);
	
	if ((defined $filter)&&($filter ne 'none'))
	{
		$file_chooser->add_filter($filter);
    }
	
    # suggestion d'un nom par défaut si le type est 'save'
    if ($type eq 'save')
	{
		my $nomX = $entetes[$comboBoxX->get_active];
		my $nomY = $entetes[$comboBoxY->get_active];
		
		# on remplace les caractères spéciaux et interdits dans des noms de fichiers par un underscore
		$nomX =~ s/"/_/g;
		$nomX =~ s/\//_/g;
		$nomX =~ s/\\/_/g;
		$nomX =~ s/\*/_/g;
		$nomX =~ s/\?/_/g;
		$nomX =~ s/</_/g;
		$nomX =~ s/>/_/g;
		$nomX =~ s/\|/_/g;
		$nomX =~ s/:/_/g;
		$nomX =~ s/ /_/g;
		
		$nomY =~ s/"/_/g;
		$nomY =~ s/\//_/g;
		$nomY =~ s/\\/_/g;
		$nomY =~ s/\*/_/g;
		$nomY =~ s/\?/_/g;
		$nomY =~ s/</_/g;
		$nomY =~ s/>/_/g;
		$nomY =~ s/\|/_/g;
		$nomY =~ s/:/_/g;
		$nomY =~ s/ /_/g;
		
		$file_chooser->set_current_name("Matrice_-_".$nomX."_and_".$nomY.".txt");
	}
	
    my $filePath = "";
 
    if ($type eq 'open')
	{    
        if ('ok' eq $file_chooser->run)
		{
			$filePath = $file_chooser->get_filename;
			
			if ($filePath ne "")
			{
				$file_entry->set_text($filePath);		# on écrit le chemin du fichier dans le champ de texte de la fenêtre WINDOW
				$buttLancer->set_sensitive(1);			# on rend le bouton Explorer cliquable
				$window->unmaximize();
			}
			
			$file_chooser->destroy;
			return $filePath;
		}
    }
	
	if ($type eq 'save')
	{    
		if ('ok' eq $file_chooser->run)		#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ON S ARRETE ICI 
		{			
			if ($filePath ne "")
			{
				### comportement si l'output à créer est le fichier matrice
				if ($outputType eq 'matrix')
				{
					# on crée le fichier de sortie contenant la matrice de visibilité X/X
					printMatrix($filePath);
				}
				
				### comportement si l'output à créer est l'ensemble des graphes d'analyse
				if ($outputType eq 'graph')
				{
					
					
				}
			}
			######
			######	GESTION ERREUR : else -> si OK pressé mais pas de filePath ?
			######
			
			$file_chooser->destroy;
			return $filePath;				# <==== on récupère le chemin du fichier sélectionné
		}
    }
	
    return;
}
Et ma fonction qui crée le fichier de sortie :

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
 
sub printMatrix
{
	my($outputPath) = @_;
 
	$outputPath =~ s/\\/\//g;
 
	print "\n\noutputPath est : ".$outputPath."\n\n";
 
	open(OUTPUT,">$outputPath");
 
	print OUTPUT "\nMatrice créée :\tX utilisée = ".$colAbsc."\n\n";
	print OUTPUT "X/X\t";
	#affichage des en-têtes
	for(my $o=0;$o < $tailleAb;$o++)
	{
		print OUTPUT $tabAbsc[$o]."\t";
	}
 
	print OUTPUT "\n";
 
	#affichage de la matrice
	for(my $u=0;$u < $tailleAb;$u++)
	{
		print OUTPUT $tabAbsc[$u]."\t";
		print "OK\n";
 
		for (my $t=0;$t < $tailleAb;$t++)
		{
			if ($tabAbsc[$t] eq $tabAbsc[$u])
			{
				#cas d'une distance entre deux X identiques
				print OUTPUT $matrice->{$tabAbsc[$u]}->{$tabAbsc[$t]}->{connected}."\n";
				last;
			}
			else
			{
				print OUTPUT $matrice->{$tabAbsc[$u]}->{$tabAbsc[$t]}->{connected}."\t";
			}
		}
	}
 
	close(OUTPUT);
}
Merci beaucoup !
phoenix420 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 11h02.


 
 
 
 
Partenaires

Hébergement Web