Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python中的对象(小部件)内交换数据(使用pyqt)_Python_Oop_Pyqt_Pyqt4 - Fatal编程技术网

在python中的对象(小部件)内交换数据(使用pyqt)

在python中的对象(小部件)内交换数据(使用pyqt),python,oop,pyqt,pyqt4,Python,Oop,Pyqt,Pyqt4,我很难找到以下问题的解决方案。以下是主文件: 主窗口.py class MainWindow(QtGui.QMainWindow): def __init__(self): super(MainWindow, self).__init__() # MBD system self.MBDsystem = MBDsystem(folder_name = "dynamic_system_1") # sets ope

我很难找到以下问题的解决方案。以下是主文件:

主窗口.py

class MainWindow(QtGui.QMainWindow):

    def __init__(self):
        super(MainWindow, self).__init__()
        #    MBD system
        self.MBDsystem = MBDsystem(folder_name = "dynamic_system_1")

        #    sets opengl widget in central widget position
        self.OpenGLWidget = OpenGLWidget(folder_name = MBS_folder_name, MBD_system = self.MBDsystem)
        self.setCentralWidget(self.OpenGLWidget)
class OpenGLWidget(QtOpenGL.QGLWidget):
    def __init__(self, parent=None, folder_name = None, MBD_system = None):

    QtOpenGL.QGLWidget.__init__(self, parent)
    #    init GL
    def initializeGL(self):
        #    background color - default color
        glClearColor(0, 0, 0, 1)
        ....

    #   display geometry
    def paintGL(self):
        #   drawing is done here
        ....
我创建了一个对象
self.MBDsystem
,其中包含多个对象列表,即:实体列表(及其属性)、力列表

计划是使用创建的对象(及其数据)执行计算,并显示
self.OpenGLWidget
中的每一步,比如第10步

opengl_widget.py

class MainWindow(QtGui.QMainWindow):

    def __init__(self):
        super(MainWindow, self).__init__()
        #    MBD system
        self.MBDsystem = MBDsystem(folder_name = "dynamic_system_1")

        #    sets opengl widget in central widget position
        self.OpenGLWidget = OpenGLWidget(folder_name = MBS_folder_name, MBD_system = self.MBDsystem)
        self.setCentralWidget(self.OpenGLWidget)
class OpenGLWidget(QtOpenGL.QGLWidget):
    def __init__(self, parent=None, folder_name = None, MBD_system = None):

    QtOpenGL.QGLWidget.__init__(self, parent)
    #    init GL
    def initializeGL(self):
        #    background color - default color
        glClearColor(0, 0, 0, 1)
        ....

    #   display geometry
    def paintGL(self):
        #   drawing is done here
        ....
我想知道如何解决这个问题,因为main_window.py是GUI,它连续运行,
OpenGLWidget
。 为了清晰起见,我希望以不同的方法(和文件,即solver.py中的
solve()
)进行计算,并且当计算每10步解算一次时,
OpenGLWidget
显示解算。

如果
solve()
在不同的文件中,导入该模块,根据需要初始化,然后 通过定时器调用
solve()
paingll()
。请参阅,以了解执行此操作的几种方法,但最简单的方法可能是使用
QObject::startTimer()
运行
OpenGLWidget::timerEVent()
,在其中调用
solve()
paingl()
,但间隔不同。例如,您可以在每次调用
timerEvent()
时调用
solve()
,但
paintGL()
仅每10次调用一次:

    import solver

    class OpenGLWidget(QtOpenGL.QGLWidget):
        def __init__(self, parent=None, folder_name = None, MBD_system = None):
            QtOpenGL.QGLWidget.__init__(self, parent)
            self.solveCount = 0
            solver.init()
            interval = 10 # milliseconds
            self.startTimer(10)

        def timerEvent(self, event):
            solver.solve()
            self.solveCount += 1
            if self.solveCount > 10:
                 self.paintGL()
                 self.solveCount = 0
如果间隔为0,则仅当GUI不忙时才会调用
timerEvent()
(这相当于wxPython和其他GUI API中的空闲回调)


正如文档页面上所解释的,您还可以在
QThread
中运行
solve()
。您必须同步对
paintGL()
的调用,以便
solve()
不会在
paintGL
读取数据的同时写入数据。只有当
solve()
对时间步长非常敏感时,这种复杂性才有用,即使如此,还有其他方法可以做到这一点。例如,当用户调整窗口大小时,GUI会不停地忙碌:如果用户在调整窗口大小时按住窗口边框5秒钟,则可能在5秒钟内不会调用
timerEvent()
。然后,您的解算必须将自上次调用以来的时间步长(5秒)细分为N个较小的步长(500个步长,每个10毫秒)

谢谢你的帮助@scholli。我不得不将行:
self.startTimer(10)
更改为:
#timer settings timer=QtCore.QTimer(self)timer.setInterval(10)#msec QtCore.QObject.connect(timer,QtCore.SIGNAL('timeout()),self.timerEvent)timer.start()
。我希望
timerEvent(self,event)
在用户按下启动按钮触发后启动。有什么建议吗?您可以将
self.startTimer(10)
移动到构造函数连接到按钮的函数。