2010-12-07 10 views
0

Ich hatte in meiner vorherigen Frage für ein Paket gefragt, dass ich Kreise und Pfeile mit Python zeichnen kann und es wurde vorgeschlagen, dass ich PyQt4 ausprobieren sollte.Zeichnen von mathematischen Zeug mit Python

Mein Problem ist, dass ich versucht habe, Funktionen zu finden, mit denen ich solche Widgets zeichnen konnte, aber nicht dazu in der Lage war.

Also meine Frage ist, dass wenn jemand weiß, wie man Kreise, Pfeile und andere mathematische Symbole in PyQt4 zeichnet, bitte führe mich in die richtige Richtung.

BTW wenn jemand von Ihnen weiß, irgendein Paket in Python, dass mich das tun würde bitte helfen.

Ich brauche NFAs in meinem Programm zu zeichnen und würde dies also benötigen.

http://en.wikipedia.org/wiki/File:NFAexample.svg

Vielen Dank


als Update würde ich, dass ich nicht nur in PyQt4 interessiert bin zu erwähnen. Wenn Sie Kenntnis von einem solchen Paket sind kann man erkennen, lassen Sie mich mit Python mathematischen GUI ziehen bitte helfen :)

+0

Wenn Sie das Lernprogramm http://zetcode.com/tutorials/pyqt4/ noch nicht gesehen haben, kann es hilfreich sein. –

Antwort

0

Werfen Sie einen Blick auf diesen Teil der API: http://www.riverbankcomputing.co.uk/static/Docs/PyQt4/html/qgraphicsitem.html

ich diese Klasse und ihre Unterklassen glauben wird tun, was Sie wollen. Für einige Dinge, wie Pfeile, müssen Sie sie möglicherweise aus vorhandenen Elementen wie Linien konstruieren oder Ihre eigene Unterklasse von qgraphicsitem definieren, die das tut, was Sie wollen.

1

Vielleicht möchten Sie einen Blick auf NetworkX werfen. Könnte genau Ihren Bedürfnissen entsprechen! Da Sie schauen, um NFAs zu zeichnen. Die gallery zeigt einige der Dinge, die getan werden können.

4

Mit graphviz Sie können Diagramme machen wie diese

alt text

mit Code wie folgt aus:

#!/usr/bin/env python 
# coding: utf-8 

import os 
import subprocess 
import shlex 

# dot code based on http://www.graphviz.org/Gallery/directed/fsm.html 
dot='''  
digraph finite_state_machine { 
     bgcolor="#ffffff" 
     rankdir=LR; 
     size="8,5" 
     node [shape = doublecircle]; S₁ S₃; 
     node [shape = circle]; S₀ S₂ S₄; 
     node [shape = circle]; S₄; 
     S₀ -> S₁ [ label = ε, weight=-1 ]; 
     S₀ -> S₃ [ label = ε, weight=-1 ]; 
     S₁ -> S₂:nw [ label = 0 ]; 
     S₂ -> S₁:se [ label = 0 ]; 
     S₁ -> S₁ [ label = 1 ]; 
     S₂ -> S₂ [ label = 1 ]; 
     S₃ -> S₄:nw [ label = 1 ]; 
     S₄ -> S₃:se [ label = 1 ]; 
     S₃ -> S₃ [ label = 0 ]; 
     S₄ -> S₄ [ label = 0 ]; 
} 
''' 
os.chdir('/tmp') 
with open('output_dot.svg','w') as outfile: 
    subprocess.Popen(shlex.split('dot -Tsvg'), 
        stdin=subprocess.PIPE,stdout=outfile).communicate(dot) 

Üblicherweise bezeichnet man die graphviz dot Programm von der Befehlszeile. Es hat nichts mit Python an sich zu tun.

Diagramme programmatisch zu machen, aber Sie Python verwenden könnte den dot Code als eine riesige String zu erstellen, und verwenden Sie subprocess.Popen die Schnur durch dot zu verarbeiten. dot kann in vielen Formaten ausgeben, einschließlich SVG oder PNG. Oder Sie möchten pygraphviz für eine mehr "Pythonic" -Schnittstelle zu der Graphviz-Bibliothek recherchieren.

Beachten Sie außerdem, dass graphviz UTF-8-codierte Zeichen unterstützt. Sie können also Indizes und andere mathematische Symbole in Ihr Diagramm einfügen, indem Sie die entsprechenden Symbole im UTF-8-Zeichensatz finden.

Eine der Stärken von graphviz ist, dass Sie das Layout des Diagramms nicht mühsam spezifizieren müssen - Sie sagen nur, welche Knoten mit welchen anderen Knoten verbunden sind. Die Position der Knoten wird von graphviz (meistens) automatisch bestimmt.

Diese Stärke ist auch etwas schwächend - es ist schwierig, Elemente in das Diagramm genau so zu platzieren, wie Sie es wünschen.Beachten Sie zum Beispiel, dass S1 und S2 nicht horizontal ausgerichtet sind. Ich weiß auch nicht, wie man den Pfeil von S0 -> S1 hübscher gekrümmt macht, die Pfeile zwischen S1 und S2 perfekt symmetrisch, oder wie man die Kantenbeschriftung von S2 -> S1 unterhalb des Pfeils usw. erscheinen lässt. Es könnte einen Weg geben, all diese Dinge zu tun, aber ich weiß nicht wie.

Weitere Beispiele, was graphviz tun kann, finden Sie unter graphviz gallery.

+0

@ user506710: Oh, in diesem Fall sind Sie wahrscheinlich besser dran mit PyQt4. – unutbu

+0

Aber wie ich schon sagte, habe ich echte Probleme aufgrund fehlender Beispiele und Dokumentation mit PyQt4. Könntest du mir helfen, wenn du weißt, wie es weiter geht? –

+0

nice hack (Unicode-Indizes). Leider werden die Zeichen nicht von Acrobat in der Standardschrift gefunden, wenn ich nach PDF rende ... – Nicolas78