Schrift
[thread]5320[/thread]

Tk::Text: Text markieren

Leser: 2


<< >> 9 Einträge, 1 Seite
Gast Gast
 2007-05-26 19:52
#46363 #46363
hi,

ich wollte mit Perl/Tk einen texteditor schreiben.
nun habe ich habe folgende fragen:

1) kann man durch eine funktion/methode in einem textwidget
   etwas markieren?

2) kann man herausfinden, wenn der benutzer etwas in einem
textwidget markiert und was es ist?

danke im vorraus für die antworten
PerlProfi
 2007-05-26 20:06
#46364 #46364
User since
2006-11-29
340 Artikel
BenutzerIn
[default_avatar]
Hast du dir die manpage schon durchgelesen ?

Mit $text -> getSelected(); findest du heraus ob der Benutzer etwas markiert hat, und wenn ja, was es ist.

imho ist es ganz praktisch sich auch die quellen von Tk anzusehen, in Tk::Text gibt es eine Methode select(), die es dir erlaubt Text zu markieren.
Ich kann dir im Moment leider nicht sagen, wie du sie aufrufen musst, da ich sie bei mir abgeändert habe, sodass man bei mehreren markierten Zeilen sieht, wo sie aufhören.
Aber ich meine du musst Start und End Index an sie übergeben.

Ein bind() für das markieren fällt mir gerade nicht ein.
Da könntest du zwar die select() Methode von Tk::Text abändern, aber es geht sicher eleganter.
#Kein Kommentar
 2007-06-09 16:37
#46365 #46365
User since
2007-06-09
575 Artikel
HausmeisterIn
[default_avatar]
danke für deine antwort.
den befehl "select" kannte ich schon, allerdings hat er bei mir nicht funktioniert.

habe dann im quelltext von "Tk::Text" einen befehl gefunden.
er lautet:
Code: (dl )
$Textfeld-> tagAdd ('sel','1.0','end');

damit funktionierts auch
Gerade weil wir alle in einem Boot sitzen, sollten wir froh sein, dass nicht alle auf unserer Seite sind
Sucher
 2007-06-09 22:44
#46366 #46366
User since
2007-03-26
47 Artikel
BenutzerIn
[default_avatar]
[quote=#Kein Kommentar,09.06.2007, 14:37]habe dann im quelltext von "Tk::Text" einen befehl gefunden.
er lautet:
Code: (dl )
$Textfeld-> tagAdd ('sel','1.0','end');
[/quote]

Hallo,

nur damit kein falscher Eindruck entsteht:
sowohl das 'sel' tag, als auch die tagAdd Methode sind gut im pod dokumentiert.

Christoph
PerlProfi
 2007-06-10 14:14
#46367 #46367
User since
2006-11-29
340 Artikel
BenutzerIn
[default_avatar]
Entschuldige, die Methode select() habe ich bei mir vollständig hinzugefügt, sie ist im Modul vom CPAN gar nicht vorhanden.

Allerdings musst du, wenn du tagAdd() für das Selektieren benutzt, auch tagRaise() nehmen, um den Tag immer korrekt darzustellen.
Damit hatte ich schon öfter Schwierigkeiten, dann wurde selektierter Text zwar mit blauem Hintergrund angezeigt aber mit schwarzem Fordergrund, und das sieht einfach nicht gut aus.

Die einfachste select() Methode die du in Tk.pm einfügen könntest sollte so aussehen:
Code: (dl )
1
2
3
4
5
6
7
8
sub select($$$) {
# pick parameters
my($self, $start, $end) = @_;

# select text
$self -> tagAdd('sel', $start, $end);
$self -> tagRaise('sel');
}


Bestimmt ist es schonmal jemandem aufgefallen, dass bei selektiertem Zeilenumbruch, die vollständige Zeile markiert wird.
Ich persöhnlich finde das auch sehr unschön und habe das in meiner select() Methode angepasst.
Natürlich habe ich dann noch alle Stellen im code von Tk::Text entsprechend so abgeändert, dass die select() Methode aufgerufen wird, anstatt tagAdd().
Das ist nicht sehr viel Arbeit und lohnt sich schon, wie ich finde.

MfG
Sucher
 2007-06-10 15:12
#46368 #46368
User since
2007-03-26
47 Artikel
BenutzerIn
[default_avatar]
Hallo,

bei mir (804.027, AS-perl) tut der folgende code genau das, was er soll: Selektieren (und weiss auf blau darstellen). Es werden auch nicht die ganzen Zeilen markiert, sondern nur das, was zwischen den angegebenen Marken liegt:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
use warnings;
use strict;

use Tk;
my $mw = tkinit;
my $t = $mw->Text->pack;
$mw->Button(-text => 'sel',
-command => sub{$t->tagAdd('sel','1.5','2.5')}
)->pack;
MainLoop;


Christoph\n\n

<!--EDIT|Sucher|1181474019-->
PerlProfi
 2007-06-10 15:30
#46369 #46369
User since
2006-11-29
340 Artikel
BenutzerIn
[default_avatar]
Kann das leider nicht testen, aber vielleicht hast du mich ja auch missverstanden.

Fehlerhaftes Verhalten beim selektieren heisst für mich, das die Zeile ab der angegebenen Position bis zum rechten Rand des Widgets selektiert wird, ( also blauen Hintergrund bekommt ) obwohl der Zeilenumbruch schon vorher kam.

Das Problem mit den Farben hatte ich allerdings auch schon öfter, aber das tauchte nur in größeren Programmen auf, die im Textfeld viele Tags behandeln mussten, dabei hat dann ein tagRaise() geholfen.\n\n

<!--EDIT|PerlProfi|1181475341-->
Sucher
 2007-06-10 16:40
#46370 #46370
User since
2007-03-26
47 Artikel
BenutzerIn
[default_avatar]
Hallo,

das habe ich tatsächlich falsch verstanden. Dass die ganze Zeile bis zum rechten Rand blau wird, das ist bei mir auch so. -Allerdings macht das auch mein emacs, deshalb ist es mir nie als Besonderheit aufgefallen ...

Grüße,
PerlProfi
 2007-06-10 17:11
#46371 #46371
User since
2006-11-29
340 Artikel
BenutzerIn
[default_avatar]
Naja, ich benutze halt schon länger Windows ;)
<< >> 9 Einträge, 1 Seite



View all threads created 2007-05-26 19:52.