我找不到解决以下问题的方法。这是主文件:
main_window.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)
我创建了一个对象self.MBDsystem
,其中包含多个对象列表,即:实体列表(及其属性),力列表......
计划是将创建的对象(及其数据)执行计算并在self.OpenGLWidget
中显示每个(例如)第10步。
opengl_widget.py
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
显示解决方案。
答案 0 :(得分:1)
如果solve()
位于不同的文件中,请导入该模块,然后根据需要进行初始化
通过计时器调用solve()
和paingGL()
。有关实现此目的的几种方法,请参阅QTimer docs,但最简单的方法是使用QObject::startTimer()
运行OpenGLWidget::timerEVent()
,同时调用solve()
和paingGL()
,但是间隔时间不同。例如,您可以在每次调用solve()
时拨打timerEvent()
,但只在每次拨打第10次电话时调用paintGL()
:
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中的空闲回调)。
正如该文档页面所述,您还可以在solve()
中运行QThread
。您必须将调用同步到paintGL()
,以便solve()
在paintGL
正在读取数据的同时不写入数据。这种复杂性仅在solve()
对时间步骤非常敏感时才有用,即便如此,还有其他方法可以做到这一点。例如,当用户调整窗口大小时,GUI会不停地忙碌:如果用户在调整大小时保持窗口边框5秒钟,则很可能在5秒钟内不会调用timerEvent()
。然后你的解决方案必须将自上次调用(5秒)后的时间步长细分为N个较小的步骤(每步10毫秒的500步)。