添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

没有paintEvent的绘画

0 人关注

我有一个带有画布小部件的GUI。所以我需要用点来感受这个画布。问题是,我需要创建一个独立的进程来运行GUI,因为点的 (x,y) 是由其他类生成的。所以我不知道如何从 paintEvent 的外部绘制这些点,或者如何(如果需要)再次触发 paintEvent

edit :

我需要运行一个遗传算法,得到每一代的适配度结果,并在画布区以折线图的形式表示出来!但我需要即时绘制/画出结果。但我需要在飞行中绘制/画出结果。

因此,每当GA完成一个健身周期时,我需要将这个结果发送到画布区。

我得到了这个例子的代码,来自 http://zetcode.com/tutorials/pyqt4/drawing/ 并稍加修改!

#!/usr/bin/python
# -*- coding: utf-8 -*-
ZetCode PyQt4 tutorial 
In the example, we draw randomly 1000 red points 
on the window.
author: Jan Bodnar
website: zetcode.com 
last edited: September 2011
import sys, random , time
from multiprocessing import Process
from PyQt4 import QtGui, QtCore
class Example(QtGui.QWidget):
    def status( self , text ):
        print '[GUI] ', text
    def __init__(self):
        super(Example, self).__init__()
        self.initUI()
    def initUI(self):      
        self.status('init ui')
        self.setGeometry(300, 300, 280, 170)
        self.setWindowTitle('Points')
        self.status('showing widgets')
        self.show()
    def paintEvent(self, e):
        self.status( 'playing with types : '+str(e) )
        self.status('paint event was called')
        qp = QtGui.QPainter()
        qp.begin(self)
        #self.drawPoints(qp)
        #self.drawRectangles(qp)
        self.draw_all_axis(qp, 300)
        self.draw_dot( 20, 20 )
        qp.end()
    def draw_all_axis( self , qp , length ):
        self.draw_x_axis( qp , length )
        self.draw_y_axis( qp , length )
    def draw_x_axis( self , qp , length ):
        color = QtGui.QColor(0, 0, 0)
        color.setNamedColor('#d49EBD8')
        qp.setPen(color)
        qp.setBrush(QtGui.QColor(73, 235, 216))
        qp.drawLine( 10 , length , length , length )
    def draw_y_axis( self , qp , length):
        color = QtGui.QColor(0, 0, 0)
        color.setNamedColor('#d49EBD8')
        qp.setPen(color)
        qp.setBrush(QtGui.QColor(73, 235, 216))
        qp.drawLine( 10, 10, 10, length )
    def draw_dot( self , x , y ):
        qp = QtGui.QPainter()
        qp.begin(self)
        color = QtGui.QColor(0, 0, 0)
        color.setNamedColor('#d4d4d4')
        qp.setPen(color)
        qp.setBrush(QtGui.QColor(200, 0, 0))
        qp.drawRect( x , y , x + 0.25, y + 0.25 )
    def drawPoints(self, qp):
        qp.setPen(QtCore.Qt.red)
        size = self.size()
        for i in range(1000):
            x = random.randint(1, size.width()-1)
            y = random.randint(1, size.height()-1)
            qp.drawPoint(x, y)     
    def drawRectangles(self, qp):
        color = QtGui.QColor(0, 0, 0)
        color.setNamedColor('#d4d4d4')
        qp.setPen(color)
        qp.setBrush(QtGui.QColor(200, 0, 0))
        qp.drawRect(10, 15, 90, 60)
        qp.setBrush(QtGui.QColor(255, 80, 0, 160))
        qp.drawRect(130, 15, 90, 60)
        qp.setBrush(QtGui.QColor(25, 0, 90, 200))
        qp.drawRect(250, 15, 90, 60)      
def external_dot_drawer( main_window ):
    for i in range(20, 100):
        main_window.draw_dot( i , i )
def main( ):
    print 'launching main window obj as app'
    sys.exit(app.exec_())
    print 'done!'
if __name__ == '__main__':
    print 'loading application abstraction'
    app = QtGui.QApplication(sys.argv)
    print 'building main window obj'
    gui = Example()
    print 'preparing to launch window as a separated process'
    p_main = Process( name='window' , target=main , args=( )  )
    print 'running new process'
    p_main.start()
    time.sleep(3)
    print 'trying to triggering paintEvent'
    p_external_dot_drawer = Process( name='extern_dot_drawer' , target=external_dot_drawer , args=( gui ) )
    
1 个评论
Why 你想使用多处理吗?你提供的代码完全没有理由使用它。总之,你 不能 从多个进程调用图形用户界面,你必须避免这种情况。如果你给我们一些背景,我们可能会给你一些替代方案。
python
events
canvas
pyqt
multiprocessing
Ramon Moraes
Ramon Moraes
发布于 2013-03-29
1 个回答
Luke
Luke
发布于 2013-04-03
已采纳
0 人赞同

安排调用paintEvent的正确方法是使用QWidget.update()。

我还建议使用任何现有的Python绘图库,而不是自己编写。PyQtGraph有一些不错的多进程功能。

import pyqtgraph as pg
app = pg.QtGui.QApplication([])
import pyqtgraph.multiprocess as mp
## start child process
proc = mp.QtProcess()
## import pyqtgraph in the child process, create a plot window there
remotepg = proc._import('pyqtgraph')
win = remotepg.plot()
## create a scatter plot