python directx_directX嵌入pyside
现在能用python来写GUI了,做为一个游戏程序员马上联想到的就是能不能用python来写游戏编辑器。
于是就尝试着把directx嵌入到pyside里面。
在一翻折腾下,directX和pyside,两个初看起来没什么关系的库,居然很好的结合起来。以后写编辑器又多了一个强力工具:)
下面说下整合directx+pyside比较关键的地方。
1.如何获取窗口句柄。
关键之中的关键就是如何那到用于初始化d3d的那一个窗口handl。这个在pyside里边几乎跟Qt下一样,调用窗口类的winId()函数,如果你用的PyQt那么直接将winId返回的值传给C的函数就好。而pyside要蛋疼一点,winId这函数居然返回的是一个PyCObject(注意不是PyObject),我们需要手动的转换一下。以下是转换的python代码:
from ctypes import pythonapi, c_void_p, py_object
pythonapi.PyCObject_AsVoidPtr.restype = c_void_p
pythonapi.PyCObject_AsVoidPtr.argtypes = [ py_object ]
handl = pythonapi.PyCObject_AsVoidPtr(pycobj)
最后得到的handl就可以传个c模块去初始化d3d了。
2.如何刷新。
Qt没有类似wxWidget的OnIdle()事件,也不能像MFC里那样暴力的直接把渲染往消息循环里塞。
我们只好定义一个QTimer对象,每隔20,30毫秒就调用一次渲染函数。
搞定了以上两点,你的directX和pyside就能顺畅地合作了。下面贴一个没头没尾的关键片段。
# Self defined c++ modudle
import CallBacks
def render():
CallBacks.render(0.02)
# Module for convert PyCObject ot PyObject
def PycobjToVoidPoint(pycobj):
from ctypes import pythonapi, c_void_p, py_object
pythonapi.PyCObject_AsVoidPtr.restype = c_void_p
pythonapi.PyCObject_AsVoidPtr.argtypes = [ py_object ]
return pythonapi.PyCObject_AsVoidPtr(pycobj)
def RunApp():
app = QApplication((''))
mainWin = MainWindow()
timer = QTimer()
timer.timeout.connect(render)
timer.start(20)
if(not CallBacks.initD3D( PycobjToVoidPoint(mainWin.renderWin.winId()) ) ):
print 'initD3D false'
return;
mainWin.show()
sys.exit(app.exec_())
if __name__ == '__main__':
RunApp()
代码中的CallBacks是自己用c++定义的模块,给GUI调用用的。上面的代码里用到了CallBacks.initD3D()和CallBacks.render()。什么,你不知道怎么写C++模块?去看开头说的那篇文章先。。。
MainWindow这个类是自己定义的GUI框架类,里边有一个窗口唤作renderWin,我们把它的handl传给了CallBacks.initD3D()。
-----------------------------------------------------------------------
另:之前研究怎么做directx嵌入qt的时候翻到这篇文章。里面提到了DX嵌入Qt必须要做以下两点:
1) OverrideQWidget::paintEngineto return NULL
2) CallQWidget::setAttribute(Qt::WA_PaintOnScreen, true)
我尝试之后发现这两点做不做都没啥区别,我没这些代码dx依然在我的pyside里面跑的好好的。感觉既然我们都用dx把渲染窗口全部重画了,那qt原本的绘制机制就不用再去管它了。不知道我的做法会不会有什么问题,忘大家指点。
另2:这里只讲了qt方面的嵌入,实际上按我的经验(我没有实际尝试),dx嵌入wxpython也是可以的。wx的窗体里有一个GetHandle()函数可以获得handl。渲染调用只要放到OnIdle()事件中就行,记得调用下Idle event的requestMore()。
python directx_directX嵌入pyside相关推荐
- 在python中嵌入c/c++
在python中嵌入c/c++ 分类: c python 2008-12-16 12:31 2897人阅读 评论(0) 收藏 举报 pythoncompilergccnullc语言 学习python是 ...
- python嵌入c代码_怎样把Python代码嵌入到C程序
匿名用户 1级 2017-11-03 回答 这篇文章主要介绍了将Python代码嵌入C++程序进行编写的实例,尽管通常还是Python代码中调用C++程序的情况较多...需要的朋友可以参考下 把pyt ...
- Python如何嵌入C/C++进行开发
如果你想把Python嵌入C/C++中是比较简单的事情,你需要的是在VC中添加Python的include文件目录和lib文件目录.下面我们来看下如何把Python嵌入C/C++中. VC6.0下,打 ...
- python neo4j嵌入_Neo4j推出基于Python的嵌入式图数据存储
Neo4j很早就在说,会推出一个嵌入在图数据库模块,让Python可以通过图数据库的API操作本地文件以存储图结构的数据(类似于很多支持SQLite的类库).而今天Neo4j终于在官方博客上兑现了其承 ...
- python词嵌入_【自然语言处理】收藏!使用Python的4种句嵌入技术
人类理解语言细微差别的能力是非常强大的--我们敏锐的大脑可以在一句话里轻易地感受到幽默.讽刺.负面情绪等,但发挥这个"超能力"的前提是,我们必须知道话语所使用的语言. 例如,如果有 ...
- python数字水印嵌入与提取_基于LSB的图像数字水印实验
1. 实验类别 设计型实验:MATLAB设计并实现基于LSB的图像数字水印算法. 2. 实验目的 了解信息隐藏中最常用的LSB算法的特点,掌握LSB算法原理,设计并实现一种基于图像的LSB隐藏算法. ...
- python 系统托盘_使用 PySide 实现 Python 系统托盘图示
系统托盘图示 (system tray icon) 通常用来在桌面应用程序最小化后,不希望在任务列(task bar)出现时,提供一个简单跟使用者交互的接口. 透过这样的用户接口,应用程序可以在有重要 ...
- python嵌入到程序_在应用中嵌入Python:转
前面的章节讨论如何扩展Python,如何生成适合的C库等.不过还有另一种情况:通过将Python嵌入C/C++应用以扩展程序的功能.Python嵌入实现了一些使用Python更合适的功能.这可以有很多 ...
- 扩展和嵌入Python解释器 Extending and Embedding the Python Interpreter
2007年开始使用Python与C的交互编程,那时分享了一篇<使用C/C++扩展Python> http://gashero.yeax.com/?p=38 .8年过去了,很多技术时过境迁, ...
- 在应用中嵌入Python
翻译: gashero 前面的章节讨论如何扩展Python,如何生成适合的C库等.不过还有另一种情况:通过将Python嵌入C/C++应用以扩展程序的功能.Python嵌入实现了一些使用Python更 ...
最新文章
- 怎么用leangoo做需求管理及规划?(产品Backlog、用户故事)
- 为什么你应该深入Github
- 组合搜索(combinatorial search)在算法求解中的应用
- Python基础day07【文件读写、文件夹操作、面向对象(类、对象)】
- ADF:动态视图对象
- 《objective-c基础教程》学习笔记(四)—— OC面向对象编程初探
- 声纹识别中的召回和精度概念
- extjs FormPanel更改为普通表单提交,提交到iframe显示
- 汉字笔顺口诀_一帮40后理工男编出新型字典,《笔顺码字典》在汉首发
- Ajax+PHP快速上手及简单应用
- win10计算机文件坏了,win10电脑电脑注册表文件丢失或损坏0xc0000e9怎么办
- python 过采样算法_浅谈SMOTE算法 如何利用Python解决非平衡数据问题
- 空压机物联网解决方案
- AD7705模块设计(附源码)
- 一行代码,小龟机器人播放“生日快乐”
- **将古典融汇到现代(二)一座连接蕴涵式和三段论的桥--皮尔斯逻辑之五**
- 学习C++的五十个观点
- 【C】 取一个整数 a 从右端开始的 4~7 位
- Ng深度学习笔记-卷积神经网络-目标检测
- 解析木马攻击与防御发展简史