Du bist hier:
KomplexeLabelsMitTkText.
Wie kann ich in einem Label mehrere Objekte verwenden?
Name
Froschpopo
Das Problem
Ich denke es haben sich schon sehr viele gefragt, wie man mit "nur einem Label" mehrere Objekte (z.B. unterschiedliche schriftarten, Schriftfarben, Bilder etc.) in einem Label unterbringen kann.
Da mich das Thema selber zur Zeit beschäftigt, will ich euch meine Lösung nicht vorenthalten.
Die Lösung in Worten
Wir werden ein Tk::ROText-Widget so manipulieren, dass es optisch nichtmehr von einem Label zu unterscheiden ist.
Ein kleiner Code-Schnippsel
use strict;
use Tk;
my $mw = MainWindow -> new();
my $text = $mw -> ROText(,
-bg => $bgcolor,
-selectbackground => $bgcolor,
-font => '{arial} 10 {normal}',
-relief => 'flat',
-cursor => 'arrow'
)
->pack(
-fill => 'both',
-expand => 1
);
$text->menu( undef )
$text->bindtags([]);
Die Erklärung
Zunächst erstellen wir ein ROText (read-only-Text). Das ist im Grunde nichts weiter als ein normales Tk::Text, mit dem Unterschied, dass man nicht hineinschreiben kann. Diese beiden Widgets werden normalerweise für die Erstellung von Editoren verwendet.
Anschließend passen wir mit -bg die Hintergrundfarbe den übrigen benachbarten Widgets an und entfernen mit -relief den Rahmen um den ROText. Damit sich der Cursor nicht verändert, wenn wir mit der Maus über das Text-Widget gleiten, erzwingen wir einen üblichen "Mauszeiger" wie man ihn sonst auch immer sieht. Dazu verwenden wir die Option -cursor.
-font definiert die Standardschrift für das Text-Widget, welches ja jetzt schon fast aussieht wie ein normales Label.
Ein Rechtsklick auf das Widget erzeugt ein kleines Menü, anhand dessen man einen markierten Text kopieren, ausschneiden usw. kann.
Da normale Label's nicht über ein solches Menü verfügen, schalten wir es mit $mw->menu( undef ) ab.
Die Hintergrundfarbe (üblicherweise blau) wie man sie beim markieren zu sehen bekommt schalten wir mit -selectbackground auf die des gesamten Widgets. Eine Markierung ist somit optisch nichtmehr erkennbar. Wie man sie auch technisch unterbinden kann, werde ich in Kürze noch hier ergänzen.
Die einzelnen Bausteine fügen wir mit Tk::Text,-üblichen Mitteln in das ROText ein:
$text->tagConfigure('red_char', -foreground => 'red');
$text->insert('end', 'ich bin rot', 'red_char');
$text->tagConfigure('bold_char', -font => '{arial} 10 {bold}');
$text->insert('end', 'ich bin fett', 'bold_char')
Wie man unschwer erkennen kann, verbinden die Funktionen jeweils zwei Namen die am Ende des Funktionsaufrufs als Argument übergeben werden. Indem wir letzterem insert() den Name 'bold_char' erteilen, weiß das gleichnamige tagConfigure() welches der beiden insert's es manipulieren muss.
Üblicherweise blinkt ja auch immer ein Cursor in einem Eingabefeld wie Tk::Text eines ist. Dieses rumgeblinke unterbinden wir mit bindtags().
Da ich hier nur kurz zeigen wollte, wie man einen Text etwas aufpeppeln kann, möchte ich an dieser Stelle auch nicht weiter auf die Tk::Text-Funktionen eingehen. Man kann jedoch viel machen! Es gibt sehr viele Möglichkeiten mit unterschiedlichsten Tags zu arbeiten (siehe perldoc Tk::Text)
Ergänzungen, Kommentare
Kommentare werden am besten in folgender Form vorgenommen, damit
sie im Inhaltsverzeichnis angezeigt werden (natürlich ohne das <verbatim>):
---### Main.??? - 14 Jul 2003 - Betreff