Seite 1 von 1
Toolkits: Zeichnungen
Verfasst: Freitag 5. August 2011, 17:54
von hoppelchen
Hi,
ich hätte mal ne generelle Frage in Sachen Toolkits.
Ich bräuchte für ein kleines GUI-Projekt eine Zeichenfläche. Wichtig ist dabei, dass sich dabei im Laufe des Programms dynamisch neue Komponenten (Linien, Kreise) zeichnen lassen und sich der Inhalt exportieren lässt.
Bisher verwende ich der Einfachheit halber Tkinter (ist nicht der Hit, aber nuja). Da geht sowas super. Allerdings sieht's mit Antialising schlecht aus...
Deswegen meine Frage, ob jemand nen Tipp/Erfahrungsbericht für mich hat,
a) welches andere Toolkit sich für mein Vorhaben eignet
oder
b) wie ich meinem Tkinter.Canvas Antialising "beibringen" kann.
Ich danke euch schonmal für eure Tipps und Anregungen...
Re: Toolkits: Zeichnungen
Verfasst: Freitag 5. August 2011, 18:00
von lunar
@hoppelchen: Qt bietet mit QGraphicsView und QGraphicsScene einfach zu nutzende Komponenten für 2D-Zeichnungen, die sich anschließend auch in Pixel- oder Vektorgrafiken exportieren lassen.
Re: Toolkits: Zeichnungen
Verfasst: Samstag 6. August 2011, 10:27
von hoppelchen
Ah ja. Klingt zwar etwas nach "Mit Kanonenkugeln auf Mücken schießen", aber gut.
Allerdings bin ich nicht wirklich fündig geworden, wie ich meine Kreise und Linien aufs Papier bekomme. Hättest du (oder jemand anders) ne Minute Zeit, um meinen Beispielcode an den 2 Kommentarzeilen zu vervollständigen? Sollte hoffentlich nicht allzu viel Aufwand machen...
Code: Alles auswählen
import sys
from PyQt4 import QtGui, QtCore
class Zeichne(QtGui.QWidget):
def __init__(self, parent=None):
QtGui.QWidget.__init__(self, parent)
self.setWindowTitle('Zeichne etwas')
self.grid = QtGui.QGridLayout()
self.grid.setSpacing(10)
self.button = QtGui.QPushButton("Linie")
self.connect(self.button, QtCore.SIGNAL("clicked()"), self.drawLine)
self.grid.addWidget(self.button, 0, 0)
self.button = QtGui.QPushButton("Loesche")
self.connect(self.button, QtCore.SIGNAL("clicked()"), self.deleteAll)
self.grid.addWidget(self.button, 0, 2)
self.scene=QtGui.QGraphicsView()
self.grid.addWidget(self.scene, 1, 0, 3, 3)
self.setLayout(self.grid)
self.resize(400, 400)
def drawLine(self):
print "Linie"
# Zeichne Linie
def deleteAll(self):
print "Loesche"
# Loesche alles auf dem Feld
if __name__ == "__main__":
app = QtGui.QApplication(sys.argv)
zeichne = Zeichne()
zeichne.show()
sys.exit(app.exec_())
Ich danke schonmal und bin auch für sonstige Hinweise immer sehr dankbar

Re: Toolkits: Zeichnungen
Verfasst: Samstag 6. August 2011, 11:50
von lunar
@hoppelchen: Lese doch bitte die
Dokumentation. Du musst ein "QGraphicsScene"-Objekt erzeugen. Dieses Objekt repräsentiert Deine Zeichnung, der Du verschiedene Elemente (aka "Items") hinzufügen kannst, eine Linie beispielsweise mit "QGraphicsLineItem". Das "QGraphicsScene"-Objekt musst Du dem "QGraphicsView" dann per ".setScene()" zuweisen, so dass der View die Zeichnung anzeigen kann.
Re: Toolkits: Zeichnungen
Verfasst: Samstag 6. August 2011, 15:53
von Darii
hoppelchen hat geschrieben:b) wie ich meinem Tkinter.Canvas Antialising "beibringen" kann.
Vermutlich gar nicht, hängt wohl vom der Implementierung für das entsprechende Betriebssystem zusammen unter OSX habe ich Anti-Aliasing unter Win7 nicht.
Re: Toolkits: Zeichnungen
Verfasst: Samstag 6. August 2011, 22:37
von hoppelchen
@ lunar: Danke für den Hinweis und die gute Beschreibung, wie sowas zu tun ist. Als Neuling tu ich mich da immer etwas schwer, genau das richtige zu finden. Nachdem ich meine C++-Kenntnisse reaktiviert habe, komme ich damit (zumindest vorübergehend) klar. Antialising klappt auch wunderbar.
Ist zwar etwas komplexer im Vergleich zu Tkinter, aber dafür bekommt man auch deutlich mehr - fairer Tausch
Ich hau mal Tkinter in die Tonne und nerve weiter, falls ich mit Qt mal irgendwo hänge.
Vielen lieben Dank nochmals für die Hilfe.
@ Darii: Danke für den Hinweis. Hab ich fast befürchtet
Ich füge dem hinzu, dass unter Ubuntu 10.04 auch kein Antialising erfolgt.
Falls es andere Neulinge gibt, die vor einem ähnlichen Problem stehen und ein kleines lauffähiges Beispiel zur Inspiration nützlich finden: hier der abgeänderte Code:
Code: Alles auswählen
import sys
from PyQt4 import QtGui, QtCore
class Zeichne(QtGui.QWidget):
def __init__(self, parent=None):
QtGui.QWidget.__init__(self, parent)
self.setWindowTitle('Zeichne etwas')
self.grid = QtGui.QGridLayout()
self.grid.setSpacing(10)
self.button = QtGui.QPushButton("Oval")
self.connect(self.button, QtCore.SIGNAL("clicked()"), self.drawOval)
self.grid.addWidget(self.button, 0, 0)
self.button2 = QtGui.QPushButton("Loesche")
self.connect(self.button2, QtCore.SIGNAL("clicked()"), self.deleteAll)
self.grid.addWidget(self.button2, 0, 2)
self.view = QtGui.QGraphicsView()
self.grid.addWidget(self.view, 1, 0, 3, 3)
self.scene = QtGui.QGraphicsScene(self)
self.setLayout(self.grid)
self.resize(400, 400)
def drawOval(self):
self.view.setRenderHint(QtGui.QPainter.Antialiasing)
self.item = QtGui.QGraphicsEllipseItem(-20,-20, 60,40)
self.item.setBrush(QtGui.QColor(255, 255, 0, 127));
self.scene.addItem(self.item)
self.view.setScene(self.scene)
def deleteAll(self):
try:
self.scene.removeItem(self.item)
except:
pass
if __name__ == "__main__":
app = QtGui.QApplication(sys.argv)
zeichne = Zeichne()
zeichne.show()
sys.exit(app.exec_())
Spannend wird jetzt die Frage, wie man geschickt die Löschung implementiert, wenn man mehrere Items zeichnet.

In typischer Python-Manier sollten sich Listen auch für sowas missbrauchen lassen...
Bin natürlich auch weiterhin für Tipps und Verbesserungsvorschläge (am Code) offen

Re: Toolkits: Zeichnungen
Verfasst: Sonntag 7. August 2011, 08:38
von BlackJack
@hoppelchen: Du könntest noch die modernere Variante zum Verbinden von Signalen verwenden:
Code: Alles auswählen
# self.connect(self.button, QtCore.SIGNAL("clicked()"), self.drawOval)
# ->
self.button.clicked.connect(self.drawOval)
Re: Toolkits: Zeichnungen
Verfasst: Sonntag 7. August 2011, 23:50
von hoppelchen
@ BlackJack: Wunderbar. Genau solchen Feinheiten bin ich auf der Spur. Vielen Dank für den Hinweis. Spart immerhin ein paar Zeichen Code
Gibt's da außerdem nen (für Laien verstehbaren) wesentlichen Unterschied zwischen der alten und neuen "Version"?
Lg
Re: Toolkits: Zeichnungen
Verfasst: Montag 8. August 2011, 05:57
von snafu
Es spart nicht nur ein paar Zeichen, sondern es ist doch wohl wesentlich pythonischer und unkomplizierter als die alte Variante. Nachteile in der Funktionalität gibt es meines Wissens keine.
Re: Toolkits: Zeichnungen
Verfasst: Montag 8. August 2011, 09:25
von lunar
@hoppelchen: Die neue Variante wirft eine Ausnahme, wenn Du versuchst, zu nicht-existierenden Signalen zu verbinden. Die alte Variante gibt in diesem Fall nur eine Warnung aus.