V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
Hualin
V2EX  ›  Python

Numpy, PySide (python)+ OpenGL(C)

  •  
  •   Hualin · 2012-04-17 05:29:54 +08:00 via iPod · 4387 次点击
    这是一个创建于 4632 天前的主题,其中的信息可能已经有所发展或是发生改变。
    大家好,这个论坛真酷。
    最近我在编一个程序,思路如下:

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

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

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

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

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

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

    现在的问题是如何让python调用c的opengl,我只想用标准库。下午走之前看到一片wiki,看看明天能捣鼓成不。
    thedevil7
        8
    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
        9
    Hualin  
    OP
       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
        10
    thedevil7  
       2012-04-23 23:46:20 +08:00
    @Hualin 因为我也只是用到了 Python 和 PyQt, 所以... 我帮不了你了..不如再开个帖子问问?
    reus
        11
    reus  
       2012-04-25 12:38:32 +08:00
    @Hualin 可视化可以直接用Qt的QGraphicsView类,比如下面一段代码

    https://gist.github.com/2486397

    就能显示



    还能加各种控件进去,还能用opengl渲染,性能不是问题
    reus
        12
    reus  
       2012-04-25 12:40:54 +08:00
    这代码究竟要怎么贴 = =
    http://gist.github.com/2486397
    reus
        13
    reus  
       2012-04-25 12:59:57 +08:00
    再比如,画了一条曲线,这条曲线就是用一个QGraphicsItem类的对象来表示的,你可以直接且独立地对这条曲线进行移动和缩放等操作,底层的重绘等都可以不关心。又或者,你想直接用鼠标来移动一些点,可以直接将对象的ItemIsMovable设成True,就可以实现了。这种层次的抽象,如果要从c扩展封装opengl做起,是需要很大功夫的,也没有必要。直接用这个Qt自带的库来实现可视化吧
    Hualin
        14
    Hualin  
    OP
       2012-04-26 18:03:27 +08:00
    @reus 多谢咯,qt有本地的,这我开始就知道了,就像MFC也可以在窗口里面画画一样,能比硬件API高级一点,至少它做到了设备无关性。我已经快完成咯,不要老颠覆我 T_T
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   888 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 19:54 · PVG 03:54 · LAX 11:54 · JFK 14:54
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.