Perl/Tk getOpenFile

Le
genomart
Bonjour,

J'utilise la méthode getOpenFile pour ouvrir un popup windows et
sélectionner plusieurs fichiers.
Mais j'ai un bug et je ne sais pas comment le résoudre.

Voici le bout de script :

# Get the file (.txt files)
my @types = ( [ "Data Files", '.txt', 'TEXT' ], [ "All Files",
"*" ] );
my @TabFiles = $Widget->getOpenFile(
-initialdir => "C:/",
-multiple => 1,
-filetypes => @types,
);

J'essaye donc de sélectionner plusieurs fichiers en même temps.
Dans la fenêtre popup windows, je peux sélectionner autant de fichiers
que je souhaites. Le souci est au niveau de
@TabFiles.
Si je sélectionne plus de 500 ou 600 fichiers, je n'ai pas le nombre
exact, @TabFiles est vide. en dessous, je n'ai pas de soucis.

Comment résoudre ce problème ?
Y a t il une limite ? Est ce dû à la taille du tableau @TabFiles ? Ou
bien est ce un souci Windows ?

Si j'utilise excel ou PsPad par exemple pour ouvrir ces 600 fichiers,
j'ai le même popup windows, mais ils arrivent à ouvrir les fichiers
(ça rame, normal), mais il essaye de les ouvrir un à un. Donc c'est un
souci Tk, non!!

Merci

--
genome
Questions / Réponses high-tech
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses Page 1 / 2
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Frantz DORSEMAINE
Le #18743751
a écrit :
Bonjour,

J'utilise la méthode getOpenFile pour ouvrir un popup windows et
sélectionner plusieurs fichiers.
Mais j'ai un bug et je ne sais pas comment le résoudre.

Voici le bout de script :

# Get the file (.txt files)
my @types = ( [ "Data Files", '.txt', 'TEXT' ], [ "All Files",
"*" ] );
my @TabFiles = $Widget->getOpenFile(
-initialdir => "C:/",
-multiple => 1,
-filetypes => @types,
);

J'essaye donc de sélectionner plusieurs fichiers en même temps.
Dans la fenêtre popup windows, je peux sélectionner autant de fichiers
que je souhaites. Le souci est au niveau de
@TabFiles.
Si je sélectionne plus de 500 ou 600 fichiers, je n'ai pas le nombre
exact, @TabFiles est vide. en dessous, je n'ai pas de soucis.

Comment résoudre ce problème ?
Y a t il une limite ? Est ce dû à la taille du tableau @TabFiles ? Ou
bien est ce un souci Windows ?

Si j'utilise excel ou PsPad par exemple pour ouvrir ces 600 fichiers,
j'ai le même popup windows, mais ils arrivent à ouvrir les fichiers
(ça rame, normal), mais il essaye de les ouvrir un à un. Donc c'est un
souci Tk, non!!

Merci

--
genome



Voici mon script qui marche
sub OpenFileExcel {

$Extention = [
['Fichier xls', ['.xls']],
['Autre fichier', '*']
];

$FichierExcel=$Win->getOpenFile(-filetypes => $Extention, -multiple => 1
);
if($FichierExcel ne "") {
print "@$FichierExceln";
$FichierOpen=$FichierExcel;

}
}
Paul Gaborit
Le #18743911
À (at) Mon, 23 Feb 2009 08:20:37 -0800 (PST),
écrivait (wrote):
J'utilise la méthode getOpenFile pour ouvrir un popup windows et
sélectionner plusieurs fichiers.


[...]
Dans la fenêtre popup windows, je peux sélectionner autant de fichiers
que je souhaites. Le souci est au niveau de
@TabFiles.
Si je sélectionne plus de 500 ou 600 fichiers, je n'ai pas le nombre
exact, @TabFiles est vide. en dessous, je n'ai pas de soucis.

Comment résoudre ce problème ?
Y a t il une limite ? Est ce dû à la taille du tableau @TabFiles ? Ou
bien est ce un souci Windows ?



A priori, sans en être sûr, je dirai que c'est un problème lié à
Perl/Tk... Peut-être faudrait-il faire un tout petit script démontrant
le bug et l'envoyer à l'auteur de Perl/Tk.

--
Paul Gaborit - Perl en français -
genomart
Le #18743901
On 23 fév, 17:42, Frantz DORSEMAINE
a écrit :



> Bonjour,

> J'utilise la méthode getOpenFile pour ouvrir un popup windows et
> sélectionner plusieurs fichiers.
> Mais j'ai un bug et je ne sais pas comment le résoudre.

> Voici le bout de script :

>   # Get the file (.txt files)
>   my @types = ( [ "Data Files", '.txt', 'TEXT' ], [ "All Files",
> "*" ] );
>   my @TabFiles = $Widget->getOpenFile(
>     -initialdir => "C:/",
>     -multiple => 1,
>     -filetypes  => @types,
>   );

> J'essaye donc de sélectionner plusieurs fichiers en même temps.
> Dans la fenêtre popup windows, je peux sélectionner autant de fichi ers
> que je souhaites. Le souci est au niveau de
> @TabFiles.
> Si je sélectionne plus de 500 ou 600 fichiers, je n'ai pas le nombre
> exact, @TabFiles est vide. en dessous, je n'ai pas de soucis.

> Comment résoudre ce problème ?
> Y a t il une limite ? Est ce dû à la taille du tableau @TabFiles ?  Ou
> bien est ce un souci Windows ?

> Si j'utilise excel ou PsPad par exemple pour ouvrir ces 600 fichiers,
> j'ai le même popup windows, mais ils arrivent à ouvrir les fichiers
> (ça rame, normal), mais il essaye de les ouvrir un à un. Donc c'est un
> souci Tk, non!!

> Merci

> --
> genome

Voici mon script qui marche
sub OpenFileExcel {

        $Extention = [
                ['Fichier xls', ['.xls']],
                ['Autre fichier', '*']
        ];

        $FichierExcel=$Win->getOpenFile(-filetypes => $Extent ion, -multiple => 1
        );
if($FichierExcel ne "") {
print "@$FichierExceln";
     $FichierOpen=$FichierExcel;

}
}



Votre code est similaire au mien mais ne change rien à mon souci.
Frantz DORSEMAINE
Le #18744071
a écrit :
On 23 fév, 17:42, Frantz DORSEMAINE
a écrit :



Bonjour,
J'utilise la méthode getOpenFile pour ouvrir un popup windows et
sélectionner plusieurs fichiers.
Mais j'ai un bug et je ne sais pas comment le résoudre.
Voici le bout de script :
# Get the file (.txt files)
my @types = ( [ "Data Files", '.txt', 'TEXT' ], [ "All Files",
"*" ] );
my @TabFiles = $Widget->getOpenFile(
-initialdir => "C:/",
-multiple => 1,
-filetypes => @types,
);
J'essaye donc de sélectionner plusieurs fichiers en même temps.
Dans la fenêtre popup windows, je peux sélectionner autant de fichiers
que je souhaites. Le souci est au niveau de
@TabFiles.
Si je sélectionne plus de 500 ou 600 fichiers, je n'ai pas le nombre
exact, @TabFiles est vide. en dessous, je n'ai pas de soucis.
Comment résoudre ce problème ?
Y a t il une limite ? Est ce dû à la taille du tableau @TabFiles ? Ou
bien est ce un souci Windows ?
Si j'utilise excel ou PsPad par exemple pour ouvrir ces 600 fichiers,
j'ai le même popup windows, mais ils arrivent à ouvrir les fichiers
(ça rame, normal), mais il essaye de les ouvrir un à un. Donc c'est un
souci Tk, non!!
Merci
--
genome


Voici mon script qui marche
sub OpenFileExcel {

$Extention = [
['Fichier xls', ['.xls']],
['Autre fichier', '*']
];

$FichierExcel=$Win->getOpenFile(-filetypes => $Extention, -multiple => 1
);
if($FichierExcel ne "") {
print "@$FichierExceln";
$FichierOpen=$FichierExcel;

}
}



Votre code est similaire au mien mais ne change rien à mon souci.



Ragardez bien ça

print "@$FichierExceln"; le systeme renvoie bien tous les fichiers
selectionés?
genomart
Le #18744061
On 23 fév, 17:51, Paul Gaborit
À (at) Mon, 23 Feb 2009 08:20:37 -0800 (PST),
écrivait (wrote):

> J'utilise la méthode getOpenFile pour ouvrir un popup windows et
> sélectionner plusieurs fichiers.
[...]
> Dans la fenêtre popup windows, je peux sélectionner autant de fichi ers
> que je souhaites. Le souci est au niveau de
> @TabFiles.
> Si je sélectionne plus de 500 ou 600 fichiers, je n'ai pas le nombre
> exact, @TabFiles est vide. en dessous, je n'ai pas de soucis.

> Comment résoudre ce problème ?
> Y a t il une limite ? Est ce dû à la taille du tableau @TabFiles ?  Ou
> bien est ce un souci Windows ?

A priori, sans en être sûr, je dirai que c'est un problème lié à
Perl/Tk... Peut-être faudrait-il faire un tout petit script démontran t
le bug et l'envoyer à l'auteur de Perl/Tk.

--
Paul Gaborit - Perl en français -


Voici un bout de script,

Vous pouvez essayer chez moi et nous dire si vous reproduisez le bug
(Il faut avoir au moins 600
à sélectionner :-) ).
#!/usr/bin/perl
use strict;
use Carp;
use warnings;

use Tk;

my $mw = MainWindow->new(
-title => "test getOpenFile",
-background => "white",
);
my $test;
$mw->Label(
-textvariable => $test,
)->pack;

$mw->Button(
-text => "test getOpenFile",
-command => sub {
# Get the file (.txt files)
my @types = ( [ "Data Files", '.txt', 'TEXT' ], [ "All Files",
"*" ] );
my @TabFiles = $mw->getOpenFile(
-initialdir => $ENV{AppliConfig}->{DefaultDirectory},
-multiple => 1,
-filetypes => @types,
);

$test = scalar(@TabFiles);

},
)->pack();



MainLoop;
genomart
Le #18744171
On 23 fév, 18:08, Frantz DORSEMAINE
a écrit :



> On 23 fév, 17:42, Frantz DORSEMAINE >> a écrit :

>>> Bonjour,
>>> J'utilise la méthode getOpenFile pour ouvrir un popup windows et
>>> sélectionner plusieurs fichiers.
>>> Mais j'ai un bug et je ne sais pas comment le résoudre.
>>> Voici le bout de script :
>>>   # Get the file (.txt files)
>>>   my @types = ( [ "Data Files", '.txt', 'TEXT' ], [ "All Files",
>>> "*" ] );
>>>   my @TabFiles = $Widget->getOpenFile(
>>>     -initialdir => "C:/",
>>>     -multiple => 1,
>>>     -filetypes  => @types,
>>>   );
>>> J'essaye donc de sélectionner plusieurs fichiers en même temps.
>>> Dans la fenêtre popup windows, je peux sélectionner autant de fic hiers
>>> que je souhaites. Le souci est au niveau de
>>> @TabFiles.
>>> Si je sélectionne plus de 500 ou 600 fichiers, je n'ai pas le nombr e
>>> exact, @TabFiles est vide. en dessous, je n'ai pas de soucis.
>>> Comment résoudre ce problème ?
>>> Y a t il une limite ? Est ce dû à la taille du tableau @TabFiles ?  Ou
>>> bien est ce un souci Windows ?
>>> Si j'utilise excel ou PsPad par exemple pour ouvrir ces 600 fichiers,
>>> j'ai le même popup windows, mais ils arrivent à ouvrir les fichie rs
>>> (ça rame, normal), mais il essaye de les ouvrir un à un. Donc c'e st un
>>> souci Tk, non!!
>>> Merci
>>> --
>>> genome
>> Voici mon script qui marche
>> sub OpenFileExcel {

>>         $Extention = [
>>                 ['Fichier xls', ['.xls']],
>>                 ['Autre fichier', '*']
>>         ];

>>         $FichierExcel=$Win->getOpenFile(-filetypes => $Ext ention, -multiple => 1
>>         );
>> if($FichierExcel ne "") {
>> print "@$FichierExceln";
>>      $FichierOpen=$FichierExcel;

>> }
>> }

> Votre code est similaire au mien mais ne change rien à mon souci.

Ragardez bien ça

print "@$FichierExceln"; le systeme renvoie bien tous les fichiers
selectionés?



ça ne change rien.
$FichierExcel=$Win->getOpenFile .... retourne une reference d'un
tableau contenant les fichiers.
my @TabFiles = $mw->getOpenFile ... un tableau

j'ai testé les 2 méthodes et ça ne change rien.
$FichierExcel est
jl_morel
Le #18746331
Dans l'article <e08cff24-b233-4686-86f6-
, a dit...

Voici un bout de script,

Vous pouvez essayer chez moi et nous dire si vous reproduisez le bug
(Il faut avoir au moins 600
à sélectionner :-) ).



#!/usr/bin/perl
use strict;
use Carp;


[couic]

Ce n'est pas un bug, c'est une limitation (nuance ! ;-)
Dans le fichier tkWinDialog.c, on peut lire le commentaire suivant :

/*
* The value of TK_MULTI_MAX_PATH dictactes how many files can
* be retrieved with tk_get*File -multiple 1. It must be allocated
* on the stack, so make it large enough but not too large. -- hobbs
* The data is stored as * MAX_PATH == 260 on Win2K/NT, so *40 is ~10K.
*/

#define TK_MULTI_MAX_PATH (MAX_PATH*40)

Voir :
http://cpansearch.perl.org/src/SREZIC/Tk-804.028/pTk/mTk/win/tkWinDialog.c

Les noms des fichiers sélectionnés sont écrits dans une chaîne de 10400
octets de long qui est allouée sur la pile. Le nombre maximum de fichiers
sélectionnés dépend de la longueur du chemin et de la longueur des noms des
fichiers.

Une solution est de recompiler Tk après avoir augmenté cette constante
(faut avoir une grosse pile!).

Je peux vous faire une version "customisée" de Tk si vous voulez.

HTH
--
J-L.M.
http://www.bribes.org/perl
Paul Gaborit
Le #18746711
À (at) Mon, 23 Feb 2009 09:10:45 -0800 (PST),
écrivait (wrote):
Vous pouvez essayer chez moi et nous dire si vous reproduisez le bug
(Il faut avoir au moins 600
à sélectionner :-) ).



Ici, sur Linux, avec la version 804.028 de Perl/Tk, c'est plus
simple : ça plante à partir du moment où on fournit l'option
'-multiple' ! ;-)

Le message d'erreur est le suivant :
Tk::Error: Failed to AUTOLOAD 'Tk::FBox::_get_select_Path'

Avant de pouvoir tester, il faut appliquer le patch suivant :
-------------------------------------------------------------
*** /usr/lib/perl5/Tk/FBox.pm 2007-05-05 20:37:56.000000000 +0200
--- Tk/FBox.pm 2009-02-23 23:49:10.000000000 +0100
***************
*** 907,911 ****
$selectFilePath = [];
for my $f (@{ $w->{'selectFile'} }) {
! push @$selectFilePath, JoinFile($w->_get_select_Path, $f);
}
} else {
--- 907,911 ----
$selectFilePath = [];
for my $f (@{ $w->{'selectFile'} }) {
! push @$selectFilePath, JoinFile($w->_get_select_path, $f);
}
} else {
-------------------------------------------------------------

Et ensuite, ça passe très bien même sur 10000 fichiers : c'est juste
un peu lent... ;-)

Votre bug est donc dans le code de Perl/Tk spécifique à Windows.

Propositions :

1- vous vous contentez d'un maximum de 600 fichiers en sélection
mutliple mais uniquement sous Windows (sous X11, ça plante sans le
patch ci-dessus).

2- vous signalez le bug et proposez ou attendez un correctif général.

3- vous écrivez votre propre dialogue de sélection de fichiers (ou
vous reprenez celui de X11) mais vous perdez l'interface native.

Aucune de ces propositions n'est exclusive d'une autre.

--
Paul Gaborit - Perl en français -
Paul Gaborit
Le #18746951
À (at) 23 Feb 2009 22:13:10 GMT,
(Jean-Louis MOREL) écrivait (wrote):
Ce n'est pas un bug, c'est une limitation (nuance ! ;-)
Dans le fichier tkWinDialog.c, on peut lire le commentaire suivant :

/*
* The value of TK_MULTI_MAX_PATH dictactes how many files can
* be retrieved with tk_get*File -multiple 1. It must be allocated
* on the stack, so make it large enough but not too large. -- hobbs
* The data is stored as * MAX_PATH == 260 on Win2K/NT, so *40 is ~10K.
*/

#define TK_MULTI_MAX_PATH (MAX_PATH*40)

Voir :
http://cpansearch.perl.org/src/SREZIC/Tk-804.028/pTk/mTk/win/tkWinDialog.c

Les noms des fichiers sélectionnés sont écrits dans une chaîne de 10400
octets de long qui est allouée sur la pile. Le nombre maximum de fichiers
sélectionnés dépend de la longueur du chemin et de la longueur des noms des
fichiers.



Bien vu ! J'avais jeté un oeil mais sans voir ce commentaire.

Une solution est de recompiler Tk après avoir augmenté cette constante
(faut avoir une grosse pile!).

Je peux vous faire une version "customisée" de Tk si vous voulez.



Comme c'est aussi une limitation de l'API Windows (GetOpenFileName),
je ne suis pas sûr que ça résolve le problème. Ce qui est étonnant,
c'est qu'a priori (si j'ai bien lu la doc de Microsoft) Windows limite
à 32K pas à ~10K...

--
Paul Gaborit - Perl en français -
genomart
Le #18749071
On 24 fév, 00:32, Paul Gaborit
À (at) 23 Feb 2009 22:13:10 GMT,
(Jean-Louis MOREL) écrivait (wrote):



> Ce n'est pas un bug, c'est une limitation (nuance ! ;-)
> Dans le fichier tkWinDialog.c, on peut lire le commentaire suivant :

> /*
>  * The value of TK_MULTI_MAX_PATH dictactes how many files can
>  * be retrieved with tk_get*File -multiple 1.  It must be allocated
>  * on the stack, so make it large enough but not too large.  -- hob bs
>  * The data is stored as >  * MAX_PATH == 260 on Win2K/NT, so *40 is ~10K.
>  */

> #define TK_MULTI_MAX_PATH  (MAX_PATH*40)

> Voir :
>  http://cpansearch.perl.org/src/SREZIC/Tk-804.028/pTk/mTk/win/tkWinDi a...

> Les noms des fichiers sélectionnés sont écrits dans une chaîne de 10400
> octets de long qui est allouée sur la pile. Le nombre maximum de fich iers
> sélectionnés dépend de la longueur du chemin et de la longueur de s noms des
> fichiers.

Bien vu ! J'avais jeté un oeil mais sans voir ce commentaire.

> Une solution est de recompiler Tk après avoir augmenté cette consta nte
> (faut avoir une grosse pile!).

> Je peux vous faire une version "customisée" de Tk si vous voulez.

Comme c'est aussi une limitation de l'API Windows (GetOpenFileName),
je ne suis pas sûr que ça résolve le problème. Ce qui est étonn ant,
c'est qu'a priori (si j'ai bien lu la doc de Microsoft) Windows limite
à 32K pas à ~10K...

--
Paul Gaborit - Perl en français -


Merci pour vos réponses.
Je me doutais bien que ça venait de Tk, mais j'avais pas réussi à
trouver le script incriminé.

1 - A savoir si il serait possible de recustomiser Tk, pourquoi pas,
mais est une bonne solution, je sais pas. En tout cas, je suis
preneur.
2 - Apparemment, sous linux, l'option -mulitple plante, donc faudrait
aussi y faire quelque chose :-)
3 - J'ai envoyé un mail à Mr slaven pour lui faire part du problème.
4 - Maintenant en ce qui concerne se limiter à 600 fichiers, le
probleme est que ce ne sera pas possible car :
- En fonction de l'utilisateur et des chemins de ses fichiers, il
pourra autant être bloqué à 400 ou 600 fichiers.
- Je ne peux pas contrôler la fenêtre de sélection de fichiers et
donc connaitre le nombre de fichiers qu'un utilisateur souhaite
sélectionner.

Donc, y a t il un moyen pour contrôler et par exemple limiter le
nombre de fichiers à sélectionner ? (Même si cette solution ne
m'arrange pas vraiment)
Existe il d'autre dialogue de sélection de fichiers, aussi jolie que
la native ?
Si je dois en recréer une quel est le(s) module(s) a utiliser ?

Merci
Publicité
Poster une réponse
Anonyme