Numpy, PySide (python)+ OpenGL(C)

2012-04-17 05:29:54 +08:00
 Hualin
大家好,这个论坛真酷。
最近我在编一个程序,思路如下:

PySide, python的Qt 在win上实现一个GUI;
Numpy实现一个矩阵处理的算法;
opengl 纯C 实现算法的可视化,就是画一个散点图,还有之间的连接,给个接口,让gui来调用和调节图形的细节样式。

为啥要这么纠结?还是出于速度的考虑。我已经完成了算法部分,用python,很哈皮。

请教大家个问题:
pyside不能用qt create啊,坑爹啊!!那么大家设计控件布局的时候不能可视化吗?全在代码里死弄?不会吧?应该有可视ide的吧?

opengl我想用c写,虽然我从来没写过,还是很2的选择了这个,原因就是速度,听说python的opengl很不理想,而各个平台的opengl的代码风格都差不多,请问,这部分c代码能被python代码调用吗?或者它们一起工作?我看到python上可以加c的扩展模块,但还是不知道如何入手。
4266 次点击
所在节点    Python
14 条回复
cooka
2012-04-17 09:25:59 +08:00
qt designer , 可以用来画界面
thedevil7
2012-04-17 19:01:49 +08:00
designer +1, 画好了界面再在代码里面引用. 可以看一下我的 mainwindow.py 以及 ui_mainwindow.py (ui_mainwindow.ui 就是用 designer 画好并生成的.)
https://github.com/thedevil7/staffManagement 希望对你有帮助
reus
2012-04-17 23:28:49 +08:00
没必要用c写opengl,qt就有个QGraphicsView框架用于绘图,支持opengl渲染,而且框架本身抽象层次比较高,相当方便
http://qt-project.org/doc/qt-5.0/graphicsview.html
reus
2012-04-17 23:30:29 +08:00
whtsky
2012-04-17 23:44:59 +08:00
DESIGNER也可以用的...
可以通过工具生成py,pyqt也支持直接导入ui文件...
reus
2012-04-18 22:46:50 +08:00
http://pyqwt.sourceforge.net/ 发现这个跟楼主要做的差不多
Hualin
2012-04-20 07:24:18 +08:00
多谢大家,真的很有用。

看来这种跨平台的想法早就有人实现了,至少证明,我的想法没错。

这是一个数据可视化算法,用来检测其他机器学习算法最后是否能保存临点之间的关系。matlab已经跑过了,就是太慢,其他高级语言平台又没法画出来,所以就做个这样的尝试。今后我可能要经常写这样的代码,第一次折腾折腾也有好处。

现在的问题是如何让python调用c的opengl,我只想用标准库。下午走之前看到一片wiki,看看明天能捣鼓成不。
thedevil7
2012-04-23 22:30:59 +08:00
之前的窗口一直都是用 designer 画的, 因为不熟悉手写(handcode)图形界面的代码.
这次做的窗口由于需要重新定义(reimplement) 几个类, 所以直接采用了手写代码的形式.

这次做完了的经验: 其实仿照 pyuic 由 .ui 文件生成的 .py 文件来写, 再参照 Rapid Gui Programming With Python and PyQt 的几个例子很容易能写出来.

如果你需要参考, 可以在我的 staffManagement 的 feature/list-data-no-wait 分支里面看看 ui_groupstaff.py(由 .ui 文件生成), 以及 groupstaff.py (直接手写, 没有利用前一个文件).

手写代码的好处是:
....1. 可以自定义某些 widget 的函数.
....2. 需要的文件少.
可能的缺点:
....1. 可能不好重新修改界面.
Hualin
2012-04-23 23:40:08 +08:00
@thedevil7 恩,我看到你给我的代码咯,写得好啊,觉得Qt的逻辑分明好懂比MFC强点。

目前我已经将新写的python算法包和过去编的python算法链接起来了。opengl的可视化也有了眉目。

我也许大概似乎看懂了如何写C扩展。但有一个疑问,也可能是我C好长时间不用了,

我看写C wrapper部分的代码,会将参数传到 自己的C函数里面。我想将python算法中的numpy.matrix对象用opengl画出来,我觉得这个不容易

1. 如何共享内存对象?我是说,给wrapper函数传形参我会,但能不能传一个指针,指向这个matrix的数据结构?

2. 当然,我又想了一下,C 里面也没法直接识别numpy.matrix的对象,所以必须在传入C代码之前将它转换成可以被C识别的数据结构,是python内部实现的list吗?

因为我觉得从python输出一个一个矩阵文件,再让C读,那就不是hybrid编程了,好傻啊。。。

Qt的部分我先暂时放下了,我的赶紧先把最重要的可视化搞好,一次折腾这么多东东有点hold不住呢。谢谢咯。
thedevil7
2012-04-23 23:46:20 +08:00
@Hualin 因为我也只是用到了 Python 和 PyQt, 所以... 我帮不了你了..不如再开个帖子问问?
reus
2012-04-25 12:38:32 +08:00
@Hualin 可视化可以直接用Qt的QGraphicsView类,比如下面一段代码

https://gist.github.com/2486397

就能显示



还能加各种控件进去,还能用opengl渲染,性能不是问题
reus
2012-04-25 12:40:54 +08:00
这代码究竟要怎么贴 = =
http://gist.github.com/2486397
reus
2012-04-25 12:59:57 +08:00
再比如,画了一条曲线,这条曲线就是用一个QGraphicsItem类的对象来表示的,你可以直接且独立地对这条曲线进行移动和缩放等操作,底层的重绘等都可以不关心。又或者,你想直接用鼠标来移动一些点,可以直接将对象的ItemIsMovable设成True,就可以实现了。这种层次的抽象,如果要从c扩展封装opengl做起,是需要很大功夫的,也没有必要。直接用这个Qt自带的库来实现可视化吧
Hualin
2012-04-26 18:03:27 +08:00
@reus 多谢咯,qt有本地的,这我开始就知道了,就像MFC也可以在窗口里面画画一样,能比硬件API高级一点,至少它做到了设备无关性。我已经快完成咯,不要老颠覆我 T_T

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/32432

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX