PyQt Anfänger benötigt Hilfe bei Anfängerbeispiel

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
PythonFish
User
Beiträge: 26
Registriert: Mittwoch 17. August 2011, 07:37

Hallo zusammen, bin recht neu in Python und würde mir gerne mit Hilfe von PyQt eine einfache Grafische Anzeige erstellen, die mir anzeigt in welchem Quadranten ich mich befinde.
D.h. im Hintergrund läuft eine Berechnung von der ich x/y Koordinaten erhalte. Nun möchte ich dieses Ergebnis auf ein Fenster mappen, dass nur ein unbeschriftetes Koordinatensystem + Ball enthält.

Bisher sieht mein Code wie folgt aus:

Code: Alles auswählen

from PyQt4 import QtGui, QtCore 
import sys

class TestWidget(QtGui.QWidget): 
    def __init__(self, parent=None): 
        QtGui.QWidget.__init__(self, parent) 
        self.pen = QtGui.QPen(QtGui.QColor(0,0,0)) 
        self.pen.setWidth(3) 
        self.brush = QtGui.QBrush(QtGui.QColor(255,255,255))        

    def paintEvent(self, event): 
        painter = QtGui.QPainter(self) 
        painter.setPen(self.pen) 
        painter.setBrush(self.brush) 
        painter.drawLine(0, 200, 400, 200)
        painter.drawLine(200, 0, 200, 400)
        
        br = QtGui.QBrush(QtCore.Qt.red)
        painter.setBrush(br)                
        painter.drawEllipse( 150, 150, 15, 15 )

app = QtGui.QApplication(sys.argv) 
wg = TestWidget() 
wg.resize(400, 400) 
wg.show()
sys.exit(app.exec_())
Mir ist jetzt noch nicht ganz klar wie ich die Position der Ellipse zur Laufzeit ändern kann.
Wäre klasse wenn mir jemand auf die Sprünge helfen könnte
Danke
deets

Du musst die Koordinate als Attribut des Widgets halten, bzw eine Referenz auf ein Ball-Objekt, welches die Koordinate kennt. Das ist ein bisschen abstrakter, aber auch zukunftssicherer, falls du mal mehrere Baelle und andere Dinge malen magst.

Und die muessen sich halt im Hintergrund irgendwie updaten. Uebleicherweise startest du dazu einen Timer in Qt der mit einer Framerate immer wieder anstoesst, die aktuelle Koordinate zu bestimmen, und dann ein neuzeichnen erzwingt.
PythonFish
User
Beiträge: 26
Registriert: Mittwoch 17. August 2011, 07:37

Super danke. Habs hinbekommen. Die relativ einfach Lösung ist vollkommen ausreichend, da dies nur Quasi als Grafischer Output meiner Daten fungieren soll und nicht erweitert wird.

Gelöst habe ich es nun so:

Code: Alles auswählen

from PyQt4 import QtGui, QtCore 
import sys
import time

class TestWidget(QtGui.QWidget): 
    def __init__(self, parent=None): 
        QtGui.QWidget.__init__(self, parent) 
        self.pen = QtGui.QPen(QtGui.QColor(0,0,0)) 
        self.pen.setWidth(3) 
        self.brush = QtGui.QBrush(QtGui.QColor(255,255,255))        
        self.x = 195
        self.y = 195

    def paintEvent(self, event): 
        painter = QtGui.QPainter(self) 
        painter.setPen(self.pen) 
        painter.setBrush(self.brush) 
        painter.drawLine(0, 200, 400, 200)
        painter.drawLine(200, 0, 200, 400)
        
        br = QtGui.QBrush(QtCore.Qt.red)
        painter.setBrush(br)                
        painter.drawEllipse( self.x, self.y, 15, 15 )
        
    def newPos(self, x, y): 
        print("new position x='",x,"' y='",y,"'")
        self.x = x
        self.y = y
       
    

app = QtGui.QApplication(sys.argv) 
wg = TestWidget() 
wg.resize(400, 400) 
wg.show()
for i in range(1,400):
    wg.newPos(i, i)
    time.sleep(0.1)
    wg.repaint()    	

sys.exit(app.exec_())
deets

So ist das nicht ganz richtig - du darfst in einer GUI niemals time.sleep verwenden! Denn dann friert sie ein. Du kannst sie dann auch nicht beenden und so weiter.

Bitte verwende dafuer einen der QtTimer, dann klappt das auch mit kontinuierlichen updates, und nicht nur so wie bei dir zu Programmstart, und dannach nie wieder.
PythonFish
User
Beiträge: 26
Registriert: Mittwoch 17. August 2011, 07:37

Danke! War zwar hier nur als Test, aber über dieses Problem wäre ich sicher bald gestolpert :P
degon
User
Beiträge: 28
Registriert: Montag 14. Juni 2010, 12:03

Wie kann ich denn dem Painter sagen das er in einem Fenster (graphicsview) painten soll?
degon
User
Beiträge: 28
Registriert: Montag 14. Juni 2010, 12:03

Ich habe generell Problem mit der PaintStruktur hier

pixmap.load(os.path.realpath(os.path.dirname(sys.argv[0])) + "/Logo.jpg") ## verstehe ich
windowsize = self.ui.graphicsView.size() # auch ;)
pixmap = pixmap.scaled(windowsize, QtCore.Qt.KeepAspectRatio, QtCore.Qt.SmoothTransformation) #jo auch
item = QtGui.QGraphicsPixmapItem(pixmap) ## aber diese schritte erschliessen sich mir nicht
scene = QtGui.QGraphicsScene(self)
scene.setSceneRect(0, 0, pixmap.width()-5, pixmap.height()-5)
scene.addItem(item)

self.ui.graphicsView.setScene(scene)

bitte um hilfe, in sowas würde ich gerne reinpainten
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

@degon:
1. Mach für sowas einen neuen Thread auf.
2. Bitte bemühe Dich um eine klare Problemstellung, sowas wie "gugge ma - diesen Code versteh ich nicht..." gehört nicht dazu. Ohne ein basales Verständnis von Qt kommst Du hier nicht weiter und Dein Post klingt nach etwas Nachholebedarf diesbezüglich. Daher verweise ich Dich erstmal auf die Qt Dokumentation.
Antworten