Tkinter: Vertikaler Text

Code-Stücke können hier veröffentlicht werden.
Antworten
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hallo Forumfreunde.

Der Auslöser für diesen Beitrag war ein Post von 'Konrad Wenzel' im Subforum 'Tkinter' unter:

http://www.python-forum.de/topic-16749.html

Es geht um eine Variante vertikalen Text in Tkinter-Widgets und Canvas-Image-Objekt mittels direkte Manipulation des Tkinter PhotoImage Objektes darzustellen:

Bild

Hier mein Prototyp:
[Code ausgelagert]

Zeichensatz erweitert:
[Code ausgelagert]

Kritik wird nicht juristisch verfolgt. Optimierungs-Vorschläge sind willkommen.

Gruss wuf :wink:
Zuletzt geändert von wuf am Freitag 28. November 2008, 08:39, insgesamt 1-mal geändert.
Take it easy Mates!
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Hallo wuf,

ein interessanter Ansatz, um vertikalen Text für Tkinter verfügbar zu machen und vermutlich so ziemlich der einzige gangbare Weg, wenn man nicht auf zusätzliche Module zurückgreifen will. Der letzte Punkt ist sicherlich die Stärke dieses Ansatzes.

Die Schwachpunkte liegen natürlich auch auf der Hand: Wenig Flexibilität bei der Schriftart und der Schriftgröße. Letztes ließe sich wohl durch den Einsatz entsprechender Mathematik theoretisch beheben - wie gut das dann praktisch noch aussieht, ist eine andere Frage.

Ich habe mal einen anderen Weg eingeschlagen, dessen Vorteile die Nachteile deines Ansatzes sind und umgekehrt ebenso: Man braucht die PIL und muss sich außerdem - sofern man es nicht nur auf dem eigenen Rechner einsetzen will - Gedanken machen, wie man mit dem Problem "Schriftartdateien" umgeht.

Zum Einstieg und zum Weiterarbeiten habe ich mal eine Klasse XButton entworfen. Der folgende Code liefert dann die abgebildete GUI:

Code: Alles auswählen

root = tk.Tk()
center = tk.Frame(root)
XButton(root,text="Mich auch",fontfile="verdana.ttf",fontsize=16,
        orient="up").pack(side="left")
center.pack(side="left")
XButton(center,text="Klick mich",fontfile="linear.ttf",fontsize=18,
        orient="normal",fg="blue",bg="snow").pack()
XButton(center,text="Klick dich",fontfile="arial.ttf",
        orient="headlong",fg="darkgreen",bg="ivory").pack()
XButton(root,text="Dich auch",fontfile="trebuc.ttf",fontsize=18,
        orient="down",fg="white",bg="#990000").pack(side="left")
root.mainloop()
Bild

Das für XButton verwendete Konzept lässt sich leicht auf Labels oder Canvas-Text übertragen. Das überlasse ich dann dir ... :wink:
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hallo numerix

Es freut mich natürlich, dass auch du das PIL-Packet beim Design von Tkinter-GUI' s mit einbeziehst. Auch ich beschäftige mich näher mit PIL seit meinem letzten Code-Snippet, welches ich hier in diesem Thread platzierte. Noch herzlichen Dank für die Mühe die du dir genommen hast um ein Grundgerüst hierfür zu erstellen. Ich werden es noch gründlicher anschauen und die eventuell daraus entstehenden Ideen bzw. Snippets hier veröffentlichen. Das schöne an PIL ist natürlich das bestehende 'TrueTypeFont-Zeichesatze' für die Texte verwendet werden können. Davon gibs ja eine Unmenge.

OK numerix nochmals Danke für deinen Beitrag.

Gruss wuf :wink:
Take it easy Mates!
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hallo numerix

Ich habe noch einige Versuche durchgeführt mit transparentem PIL-Text auf einer Tk-Canvas.

Hier das Testskript. Näheres für die Tests beschreibt der Kommentar im Skript. Es sind insgesamt drei Tests aufgeführt. Um einen Test durchzuführen müssen die restlichen zwei auskommentiert werden:

Testbild:
Bild

Testskript:
[Code ausgelagert]

Die durch diesen Test offenbarten Probleme sind unter anderem auf folgender URL erwähnt:
http://nedbatchelder.com/blog/200801/tr ... h_pil.html

Ich habe mit den Tipps auf dieser URL versucht das Problem zu beheben. Es es funktioniert auch, wenn das Text-Image als PNG-Datei ausgelgert wird. Das heisst, wenn du mit der Maus auf den Dateinamen der ausgelagerten Datei 'transtext.png' (im Konqueror SuSE10.0) fährst erscheint nach kurzer Zeit das Textbild mit sauberem Textzug. Wenn du aber das PNG-Bild mit 'ImageTk.Photoimage' in das Tk-Format konvertierst und dieses in einem Tk-Widget darstellen möchtest wird die Schrift unschön dargestellt.

Conclusion: Auf das verwenden von 'transparenten PIL-Schriften' sollte man bei Anwendungen in Tkinter-GUI's verzichten werden und nur 'nicht transparente' PIL-Schriften engesetzt werden. Das ist meine erste Einschätzung. Vielleicht ist sie auch falsch.

Gruss wuf :wink:
Take it easy Mates!
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

wuf hat geschrieben:Conclusion: Auf das verwenden von 'transparenten PIL-Schriften' sollte man bei Anwendungen in Tkinter-GUI's verzichten werden und nur 'nicht transparente' PIL-Schriften engesetzt werden. Das ist meine erste Einschätzung. Vielleicht ist sie auch falsch.
Ich hatte auch schon für meine XButton-Klasse mit transparentem Hintergrund experimentiert und dabei den gleichen Effekt beobachtet, wie du auch. Darum habe ich die scheinbare Transparenz (bei einfarbigem Hintergrund :D ) auch durch Farbgleichheit und nicht durch echte Transparenz hergestellt.

Schwierig wird das erst, wenn der Hintergrund nicht einfarbig ist, wie in deinem Fall.

Es sieht ganz so aus, als würde Tkinter bei der Umwandlung des PIL-Image-Objekts in das Tkinter-PhotoImage das png-Format intern in das gif-Format oder ein dazu ähnliches Format umwandeln, denn der unsaubere Rand der Schrift "Hallo" ist exakt(!) der gleiche, den du erhältst, wenn du die exportierte png-Datei (mit sauberem Rand) mit einem Konverter nach gif umwandelst.

Solange Tkinter selbst also nicht mit dem png-Format zurecht kommt, wird man dieses optische Manko bei transparentem Hintergrund wohl hinnehmen müssen.
BlackJack

Das Problem ist wohl, dass Tkinter keinen 8-Bit-Alphakanal unterstützt, sondern für jedes Pixel nur entscheiden kann "komplett sichtbar" oder "komplett unsichtbar". Wie bei GIF halt.
Antworten