现在能用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相关推荐

  1. 在python中嵌入c/c++

    在python中嵌入c/c++ 分类: c python 2008-12-16 12:31 2897人阅读 评论(0) 收藏 举报 pythoncompilergccnullc语言 学习python是 ...

  2. python嵌入c代码_怎样把Python代码嵌入到C程序

    匿名用户 1级 2017-11-03 回答 这篇文章主要介绍了将Python代码嵌入C++程序进行编写的实例,尽管通常还是Python代码中调用C++程序的情况较多...需要的朋友可以参考下 把pyt ...

  3. Python如何嵌入C/C++进行开发

    如果你想把Python嵌入C/C++中是比较简单的事情,你需要的是在VC中添加Python的include文件目录和lib文件目录.下面我们来看下如何把Python嵌入C/C++中. VC6.0下,打 ...

  4. python neo4j嵌入_Neo4j推出基于Python的嵌入式图数据存储

    Neo4j很早就在说,会推出一个嵌入在图数据库模块,让Python可以通过图数据库的API操作本地文件以存储图结构的数据(类似于很多支持SQLite的类库).而今天Neo4j终于在官方博客上兑现了其承 ...

  5. python词嵌入_【自然语言处理】收藏!使用Python的4种句嵌入技术

    人类理解语言细微差别的能力是非常强大的--我们敏锐的大脑可以在一句话里轻易地感受到幽默.讽刺.负面情绪等,但发挥这个"超能力"的前提是,我们必须知道话语所使用的语言. 例如,如果有 ...

  6. python数字水印嵌入与提取_基于LSB的图像数字水印实验

    1. 实验类别 设计型实验:MATLAB设计并实现基于LSB的图像数字水印算法. 2. 实验目的 了解信息隐藏中最常用的LSB算法的特点,掌握LSB算法原理,设计并实现一种基于图像的LSB隐藏算法. ...

  7. python 系统托盘_使用 PySide 实现 Python 系统托盘图示

    系统托盘图示 (system tray icon) 通常用来在桌面应用程序最小化后,不希望在任务列(task bar)出现时,提供一个简单跟使用者交互的接口. 透过这样的用户接口,应用程序可以在有重要 ...

  8. python嵌入到程序_在应用中嵌入Python:转

    前面的章节讨论如何扩展Python,如何生成适合的C库等.不过还有另一种情况:通过将Python嵌入C/C++应用以扩展程序的功能.Python嵌入实现了一些使用Python更合适的功能.这可以有很多 ...

  9. 扩展和嵌入Python解释器 Extending and Embedding the Python Interpreter

    2007年开始使用Python与C的交互编程,那时分享了一篇<使用C/C++扩展Python> http://gashero.yeax.com/?p=38 .8年过去了,很多技术时过境迁, ...

  10. 在应用中嵌入Python

    翻译: gashero 前面的章节讨论如何扩展Python,如何生成适合的C库等.不过还有另一种情况:通过将Python嵌入C/C++应用以扩展程序的功能.Python嵌入实现了一些使用Python更 ...

最新文章

  1. 怎么用leangoo做需求管理及规划?(产品Backlog、用户故事)
  2. 为什么你应该深入Github
  3. 组合搜索(combinatorial search)在算法求解中的应用
  4. Python基础day07【文件读写、文件夹操作、面向对象(类、对象)】
  5. ADF:动态视图对象
  6. 《objective-c基础教程》学习笔记(四)—— OC面向对象编程初探
  7. 声纹识别中的召回和精度概念
  8. extjs FormPanel更改为普通表单提交,提交到iframe显示
  9. 汉字笔顺口诀_一帮40后理工男编出新型字典,《笔顺码字典》在汉首发
  10. Ajax+PHP快速上手及简单应用
  11. win10计算机文件坏了,win10电脑电脑注册表文件丢失或损坏0xc0000e9怎么办
  12. python 过采样算法_浅谈SMOTE算法 如何利用Python解决非平衡数据问题
  13. 空压机物联网解决方案
  14. AD7705模块设计(附源码)
  15. 一行代码,小龟机器人播放“生日快乐”
  16. **将古典融汇到现代(二)一座连接蕴涵式和三段论的桥--皮尔斯逻辑之五**
  17. 学习C++的五十个观点
  18. 【C】 取一个整数 a 从右端开始的 4~7 位
  19. Ng深度学习笔记-卷积神经网络-目标检测
  20. 解析木马攻击与防御发展简史

热门文章

  1. 云桌面计算机被锁定如何解决,桌面布局已锁定怎么解除?电脑桌面便签布局锁定后怎么解除?...
  2. python网络爬虫项目——翻译英文单词
  3. 【数模】模糊综合评价模型
  4. 好看的php表格样式,HTML5制作表格样式
  5. 云智推任务提交版拉新系统源码-任务分销系统
  6. Louvain 算法的核心思路以及数据结构(最完善版)
  7. Matlab中的画图函数
  8. python代理IP的使用
  9. word计算机课实验报告,Word 文字处理实验报告
  10. NV12转BGR24算法总结