在python中的对象(小部件)内交换数据(使用pyqt)
我很难找到以下问题的解决方案。以下是主文件: 主窗口.py在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
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)
移动到构造函数连接到按钮的函数。