LaTeX in TextBox darstellen

Fragen zu Tkinter.
Antworten
Kababär
User
Beiträge: 4
Registriert: Donnerstag 27. Oktober 2016, 13:46

Hi,

ich arbeite gerade an einem Projekt, bei dem ich mir das Erstellen von wissenschaftlichen Dokumenten erleichtern will und will nun gerne zu Python statt zu Java greifen.
Bisher sieht der Editor sehr primitiv aus: Er hat ein Entry, um Formeln einzugeben und ein Textfeld.
Was mir fehlt ist die Implementierung der "Converter"-Funktion von sympy.
Ich gehe davon aus, dass ich mir ein Image aus einem String (Latex String zb: \sum_{i=0}^n i^2 = \frac{(n^2+n)(2n+1)}{6}) erzeugen lassen muss, das ich dann zu dem TextFeld hinzufügen muss.

Das Bild sollte "noch" nirgendwo abgespeichert werden, sondern direkt in das Textfeld hinzugefügt werden, sobald der Benutzer Enter drückt.

Über Hilfe wäre ich sehr dankbar :)

Mein bisheriger Code:

Code: Alles auswählen

from Tkinter import *


def evaluate(event):
    text = entry.get()
    if(text.startswith("\\n")):
        text = text.replace("\\n", "", 1)
        T.insert(END, "\n")
    
    if(text.startswith("\\")):
        #hier muss die Convert-Function hin...
        print ("Is convertable. So pass to a sympy and convert to latex?")
    T.insert(END, text)

root = Tk()
entry = Entry(root)
entry.bind("<Return>", evaluate)
entry.pack()

S = Scrollbar(root)
T = Text(root)
S.pack(side=RIGHT)
T.pack(side=LEFT)
#S.config(command=T.yview)
#T.config(yscrollcommand=S.set)
quote = """HAMLET: To be, or not to be--that is the question:
Whether 'tis nobler in the mind to suffer
The slings and arrows of outrageous fortune
Or to take arms against a sea of troubles
And by opposing end them. To die, to sleep--
No more--and by a sleep to say we end
The heartache, and the thousand natural shocks
That flesh is heir to. 'Tis a consummation
Devoutly to be wished."""
T.insert(END, quote)
mainloop(  )
Zuletzt geändert von Anonymous am Montag 16. Januar 2017, 11:49, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

@Kababär: was Du brauchst ist kein Sympy-Converter, denn Sympy kann nur einen Sympy-Ausdruck ins LaTeX-Format umwandeln, sondern LaTeX in ein Bild. Denn wie es aussieht hast Du ja schon LaTeX-Syntax. matplotlib macht das zum Beispiel. Das heißt, Du brauchst ein LaTeX-Template, wo Du den Text einfügen kannst, einen Aufruf von LaTex um eine DVI-Datei zu erzeugen, dvipng um daraus ein Bild zu machen, dann solltest Du das Bild passend zuschneiden und kannst es schließlich mit TkInter wieder laden und anzeigen.
Zum Code: Sternchenimporte sind schlecht, weil man nicht kontrollieren kann, was da alles in den Namensraum importiert wird. Üblicherweise wird TkInter als "import Tkinter as tk" importiert und die Namen über "tk." referenziert. Alles ab Zeile 15 gehört in eine Funktion, die man üblicherweise "main" nennt um zum Schluß über "if __name__ == '__main__': main()" aufgerufen wird. Dann kann es auch nicht passieren, dass man versehentlich T in einer Funktion benutzt, wo T nicht übergeben wird. T ist übrigens ein schlechter Name, genauso wie S. Namen von Variablen sollten komplett klein geschrieben werden und auch aussagekräftig sein, was einbuchstabige Namen nie sein können. if ist keine Funktion, die Klammern gehören da also nicht hin. Genausowenig ist print in Python 2 eine Funktion.
Kababär
User
Beiträge: 4
Registriert: Donnerstag 27. Oktober 2016, 13:46

Danke für deine Antwort.
was Du brauchst ist kein Sympy-Converter, denn Sympy kann nur einen Sympy-Ausdruck ins LaTeX-Format umwandeln, sondern LaTeX in ein Bild. Denn wie es aussieht hast Du ja schon LaTeX-Syntax. matplotlib macht das zum Beispiel. Das heißt, Du brauchst ein LaTeX-Template, wo Du den Text einfügen kannst, einen Aufruf von LaTex um eine DVI-Datei zu erzeugen, dvipng um daraus ein Bild zu machen, dann solltest Du das Bild passend zuschneiden und kannst es schließlich mit TkInter wieder laden und anzeigen.
Das ist ja bedeutend umständlicher als ich dachte.. Also im Internet habe ich schon diverse Lösungen gesehen wie bspw. die Realisierung mittels matplotlib, wobei man da das Bild nur über die show()-Funktion anzeigen lassen kann.
Ist es denn generell nicht möglich, aus dem Plot das Bild/Image zu speichern und einfach in die TextBox zu laden?
Zum Code: ....
Danke für die Hinweise.
Aus dem Beispiel, aus dem ich den Code habe, wurde das auch so gemacht mit dem "as tk" import. Allerdings hat er dann die Referenzen nicht mehr gefunden in meiner Funktion, weshalb ich das nun so gelöst hatte.
Ok das mit dem diesem main kannte ich bisher noch nicht so, danke für den Tipp, das werde ich dann mal direkt umsetzen.
BlackJack

@Kababär: Natürlich kann man `matplotlib`-Plots auch speichern ohne sie anzuzeigen. Neben der interaktiven Anzeige will man Plots doch in der Regel auch weiterverwenden, zum Beispiel in einem Paper oder auf einer Webseite.
Antworten