IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Interfaces Graphiques Perl Discussion :

[Tk] Obtention d'informations sur une ligne


Sujet :

Interfaces Graphiques Perl

  1. #1
    Membre chevronné Avatar de dmganges
    Homme Profil pro
    Retraité. Ne recherche pas un emploi.
    Inscrit en
    Septembre 2011
    Messages
    1 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Retraité. Ne recherche pas un emploi.
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2011
    Messages : 1 392
    Points : 2 044
    Points
    2 044
    Par défaut [Tk] Obtention d'informations sur une ligne
    Bonjour,
    Dans Introduction à Perl/Tk de Nancy Walsh p191 il est précisé comment obtenir des informations concernant une ligne dans un widget texte :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ($x, $y, $l, $h, $base) = $texte->dlineinfo("indice");
    Dans une fonction, le programme complet est ICI, je tente d'obtenir les informations concernant la dernière ligne écrite :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    sub Regex {
    	if ( !$Regex ) {
    		$LabRegex   = "Regex vide !";
    		$LabMessage = "Regex vide !";
    		print "\a\a";
    		return;
    	}
    	my $TexteInput = $widget_input->get( '1.0', 'end' );
    	my $Pattern = $Regex;
    	$Pattern =~ s/ /\\ /go;
    	$LabRegex = $Pattern;
    	my $i = 0;
    	my @array = ($TexteInput =~ m/(\b.{0,40}$Pattern.{0,40}\b)/gx);
    	my $Nb = @array;
    	if ($Nb == 1){
    		my @NewArray = split /$Pattern/, $TexteInput ;
    		$widget_output->insert( 'end', $NewArray[0]." " );
    		$widget_output->see( 'end' );
    		my ($x, $y, $l, $h, $base) = $widget_output->dlineinfo( 'end' );
    		$widget_output->insert( 'end', $Regex." ", "g22");
    		$widget_output->insert( 'end', $NewArray[1] );
    		$LabRegex   = "$x $y $l $h $base"; # juste pour voir ce qu'il y a dans ces variables...
    	} else {
    		foreach my $Ligne ( @array ) {
    			$widget_output->insert( 'end', ++$i .": ".$Ligne."\n" );
    		}
    	}
    }
    Mon but serait de faire si possible un see sur le widget input avec les informations de positionnement obtenues dans le widget output.
    Les widgets input et output contiennent le même texte hors mis que dans le output j'ai le pattern sous la forme regex.
    En me positionnant approximativement au même endroit dans le widget input je devrais voir la chaîne réelle.

    Cependant, bien que la position dans le widget output soit visible, je viens de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $widget_output->see( 'end' );
    J'ai tenté d'ajouter sans succès :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $widget_output->update;
    La ligne suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my ($x, $y, $l, $h, base) = $widget_output->dlineinfo( 'end' );
    me renvoie des variables non initialisées.
    Avez-vous une idée ?
    D'avance MERCI !

  2. #2
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 499 184
    Points
    499 184
    Par défaut
    Indice end : la fin du widget texte, après le dernier caractère \n. (p178)
    "end" : la position juste après la dernière ligne de texte du widget, quel que soit le volume de texte dans celui-ci. (p179).

    Je te recommande de choisir un autre indice et tu ne devrais pas avoir de problème .

    Sinon, tu pourrais jouer avec des marqueurs uniques afin d'identifier tous tes motifs dans output et input, non ?

  3. #3
    Membre chevronné Avatar de dmganges
    Homme Profil pro
    Retraité. Ne recherche pas un emploi.
    Inscrit en
    Septembre 2011
    Messages
    1 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Retraité. Ne recherche pas un emploi.
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2011
    Messages : 1 392
    Points : 2 044
    Points
    2 044
    Par défaut
    Salut djibril !
    Toujours présent, MERCI !

    Je te recommande de choisir un autre indice et tu ne devrais pas avoir de problème


    Sauf qu'à cet instant le 'end' du widget_output est le seul indice que j'ai à ma disposition
    En gros j'ai un texte dans widget_input dont je ne connais ni la longueur, ni le nombre de ligne.
    Ce texte je le divise en deux, au pif, avec une regex :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my @NewArray = split /$Pattern/, $TexteInput ;
    Je colle le début $NewArray[0] dans widget_output.
    A cet instant le seul indice que j'ai à ma disposition est le 'end' de widget_output.
    Placer un marqueur dans widget_output ne me sert à rien car un simple widget_output->see('end') me permet d'afficher cet emplacement.

    Maintenant je veux, voudrais réaliser le même déplacement dans widget_input, dans lequel je n'ai aucun marqueur, mon texte arrive d'un copier/coller...

    J'étais heureux d'avoir trouvé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my ($x, $y, $l, $h, $base) = $widget_output->dlineinfo( 'end' );
    pensant que je pourrais en tirer suffisamment d'info pour réaliser le même déplacement dans widget_input, et voir ainsi dans widget_input la correspondant de la regex...

    Tu vas dire que j'ai le chic pour me créer des pb s'il me faut une excuse je dirais que c'est pour voir l'utilité de dlineinfo...
    Je pourrais bien sûr me débrouiller pour coller le clair et non la regex dans widget_output...
    Mais j'ai envie de ramener l'affichage du widget_input aux environs du widget_output...
    Je suis chiant, mais à mon âge il paraît qu'on ne se refait pas
    Je confirme
    Ceci dit, comme d'hab... n'y perd pas ton temps !
    MERCI déjà pour ta réponse !

  4. #4
    Membre chevronné Avatar de dmganges
    Homme Profil pro
    Retraité. Ne recherche pas un emploi.
    Inscrit en
    Septembre 2011
    Messages
    1 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Retraité. Ne recherche pas un emploi.
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2011
    Messages : 1 392
    Points : 2 044
    Points
    2 044
    Par défaut
    C'est OK :

    1 - Placer un marqueur dans widget_output mais à 'end -2 chars' car à 'end' c'est pas bon
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $widget_output->tagAdd( 'MARK', 'end -2 chars' );
    2 - Récupérer l'emplacement de ce marqueur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my @Mark = $widget_output->tagRanges( 'MARK' );
    4 - visualiser le widget_input à cette position :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $widget_input->see( $Mark[0] );
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    sub Regex {
    	if ( !$Regex ) {
    		$LabRegex   = "Regex vide !";
    		$LabMessage = "Regex vide !";
    		print "\a\a";
    		return;
    	}
    	my $TexteInput = $widget_input->get( '1.0', 'end' );
    	my $Pattern = $Regex;
    	$Pattern =~ s/ /\\ /go;
    	$LabRegex = $Pattern;
    	my $i = 0;
    	my @array = ($TexteInput =~ m/(\b.{0,40}$Pattern.{0,40}\b)/gx);
    	my $Nb = @array;
    	if ($Nb == 1){
    		my @NewArray = split /$Pattern/, $TexteInput ;
    		$widget_output->insert( 'end', $NewArray[0]." " );
    		$widget_output->see( 'end' );
    		$widget_output->update;
    		$widget_output->tagAdd( 'MARK', 'end -2 chars' );
    		my @Mark = $widget_output->tagRanges( 'MARK' );
    		$widget_input->see( $Mark[0] );
    		$widget_output->insert( 'end', $Regex." ", "g22");
    		$widget_output->insert( 'end', $NewArray[1] );
    		$LabRegex = $Pattern;
    	} else {
    		foreach my $Ligne ( @array ) {
    			$widget_output->insert( 'end', ++$i .": ".$Ligne."\n" );
    		}
    	}
    }
    MERCI djibril de m'avoir mis sur la bonne voie !
    PS : Il semble qu'il y ait des pb avec dlineinfo : qq sujets sur le net...

  5. #5
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 499 184
    Points
    499 184
    Par défaut
    !

    Par contre, je n'ai pas compris ce que tu cherches concrètement à faire. Tu souhaites mettre en surbrillance tous les motif trouvés dans input en fonction de la regex ?

  6. #6
    Membre chevronné Avatar de dmganges
    Homme Profil pro
    Retraité. Ne recherche pas un emploi.
    Inscrit en
    Septembre 2011
    Messages
    1 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Retraité. Ne recherche pas un emploi.
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2011
    Messages : 1 392
    Points : 2 044
    Points
    2 044
    Par défaut
    Pas nécessairement tous les motifs, bien que j'accepte le cumul de la surbrillance dans le input.

    Sur de longs textes, j'effectue souvent les recherches en 2 temps :
    1er - Avec un seul mot, en clair ou en regex, souvent, du genre /[Aa]mitié./ ... 2 mots séparés par n mots... ça me permet de sélectionner dans le output n occurrences avec le(s) mot(s) entouré(s) du contexte,
    2ème - Si un contexte me parle, j'en fait un copier/coller, de tout ou partie, dans la zone input de la regex et je relance la recherche. Là j'ai de fortes chances de n'avoir plus qu'une seule réponse.

    Si j'ai une seule réponse dans le tableau @Array, je copie le Widget_input dans le wdget_output en 2 fois et en incluant au milieu la regex.
    J'avais envie de me positionner au même endroit dans les deux Widgets, voila qui est fait.
    Maintenant j'en profite pour mettre en surbrillance dans le Widget_input également... là ça accepte le cumul des surbrillances. Il me faut corriger un pb de longueur de surbrillance...

    Il y a la dernière version ICI Jedai m'a trouvé la bonne regex pour obtenir le contexte, je ne suis pas doué en regex, d'autant que je ne fais jamais de recherches très compliquées...

    Il me faut encore l'améliorer :
    - Gérer l'effacement des surbrillances
    - Charger le input avec un fichier
    ...
    Enfin ça me vient au fur et à mesure au fil de mes gros besoins de recherche
    Je m'en suis fait un en Addon Firefox, très complet, malheureusement Mozilla a fait des modifs conséquentes, de plus ils effacent la barre Ctrl_F à chaque changement d'onglet, ce qui ne me va pas, du coup j'ai 2 Firefox un à jour, l'autre en 24.0 qui fonctionne au poil (Mots entiers, Regex, liste des occurrences trouvées dans leurs contextes, zone de recherche sous forme de liste sauvegardée, fonctionne avec tous les alphabet Utf8 ...

    J'en profite pour une question, je n'ai pas approfondi, mais je me suis rendu compte que dans le widget_input qui est en read/write, une fois que j'ai appliqué un tag (de couleur(rouge)), sur du texte, je ne peux plus faire un copier/ sur la partie taguée.
    Y a-t-il un truc ?

  7. #7
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 499 184
    Points
    499 184
    Par défaut
    OK. Pour le copier/coller d'une zone taguée, je n'ai jamais constaté ce genre de souci .

  8. #8
    Membre chevronné Avatar de dmganges
    Homme Profil pro
    Retraité. Ne recherche pas un emploi.
    Inscrit en
    Septembre 2011
    Messages
    1 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Retraité. Ne recherche pas un emploi.
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2011
    Messages : 1 392
    Points : 2 044
    Points
    2 044
    Par défaut
    Ne cherche pas d'avantage, comme c'est encore de l'expérimental, j'ai dû faire une ânerie

  9. #9
    Membre chevronné Avatar de dmganges
    Homme Profil pro
    Retraité. Ne recherche pas un emploi.
    Inscrit en
    Septembre 2011
    Messages
    1 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Retraité. Ne recherche pas un emploi.
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2011
    Messages : 1 392
    Points : 2 044
    Points
    2 044
    Par défaut
    Pour info, le copier/coller fonctionne bien, seule chose lorsque je passe sur le tag les mots tagués ne sont pas mis en surbrillance.
    Un double clic sur un mot tagué ne le fait pas passé en surbrillance non plus, mais il est bien dans le presse-papier.
    Du coup je croyais que la sélection ne s'effectuait pas !

    J'ai recollé la version avec la surbrillance corrigée.
    Encore MERCI pour tes LUMIÈRES

  10. #10
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 499 184
    Points
    499 184
    Par défaut

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Afficher les informations sur une même ligne
    Par JayenseN dans le forum PL/SQL
    Réponses: 2
    Dernier message: 24/05/2012, 15h12
  2. [DATA] Réunir information sur plusieures lignes en une seule ligne
    Par philippeadp dans le forum SAS Base
    Réponses: 1
    Dernier message: 25/10/2011, 16h03
  3. Regroupement d'informations sur une seule ligne
    Par KiteAtao dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 21/03/2011, 08h27
  4. Réponses: 10
    Dernier message: 02/09/2010, 09h19
  5. Réponses: 2
    Dernier message: 02/05/2007, 17h08

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo