发布网友
共2个回答
热心网友
最近写一个小软件,GUI是用wxPython做的,有一个功能需要捕获鼠标在Grid控件上的移动事件。我先在Boa Constructor中
拖出一个Grid原型来做测试,发现很容易,只要grid.Bind(wx.EVT_MOTION, self.OnGridMotion) 就可以了,但是
移植到软件中去之后,死活无法响应,百思不得其解。
不断的尝试之下,总算发现了当Grid还没有创建网格的时候(也就是还没有CreateGrid或者SetTable的时候),是可以直接响应wx.EVT_MOTION的,但是一旦创建了网格之后就不行了。我猜测(没有Python的源码,只有C++的,懒得看了)应该是由于wxPython那不同寻常的设计方法,网格的窗口也能单独管理,由于网格挡住了Grid,所以抢先于Grid接受到wx.EVT_MOTION,而wx.EVT_MOTION不属于CommandEvent,因此不能传递给Grid。
问题找到了,我相信一定可以解决,只是苦于wxPython的资料太少。在网上寻觅2个小时后突然发现了一篇文章之中用到GetGridColLabelWindow 这个函数。眼前一亮,能得到Window不就可以操作了嘛。赶紧查wxPython API,果然有以下4个函数:
GetGridColLabelWindow(self)
GetGridCornerLabelWindow(self)
GetGridRowLabelWindow(self)
GetGridWindow(self)
其中我只要用最后一个,于是我重新绑定一下:
gridWin = self.grid1.GetGridWindow()
gridWin.Bind(wx.EVT_MOTION, self.OnGrid1Motion)
测试,OK!
wxPython + python的开发真是很爽,但没有文档也真的很头痛。希望这篇文章能为遇到相同情况的人一点帮助。
热心网友
<html>
<head>
<title>Debug Console</title>
<link rel="stylesheet" type="text/css" href="../../resources/css/ext-all.css" />
<link rel="stylesheet" type="text/css" href="debug.css" />
<!-- GC -->
<!-- LIBS -->
<script type="text/javascript" src="../../adapter/ext/ext-base.js"></script>
<!-- ENDLIBS -->
<script type="text/javascript" src="../../ext-all.js"></script>
<script type="text/javascript">
Ext.onReady(function(){
var cm = new Ext.grid.ColumnModel([
{header:'编号',dataIndex:'id',width:35},
{header:'名称',dataIndex:'name',width:80},
{header:'描述',dataIndex:'descn',width:120}
]);
var data = [
['1','name1','descn1'],
['2','name2','descn2'],
['3','name3','descn3'],
['4','name4','descn4'],
['5','name5','descn5']
];
var store = new Ext.data.Store({
proxy: new Ext.data.MemoryProxy(data),
reader: new Ext.data.ArrayReader({}, [
{name: 'id'},
{name: 'name'},
{name: 'descn'}
])
});
store.load();
var grid = new Ext.grid.GridPanel({
autoHeight: true,
renderTo: 'grid',
store: store,
cm: cm,
viewConfig: {
forceFit: true
}
});
grid.on('mouseover',function(e){//添加mouseover事件
var index = grid.getView().findRowIndex(e.getTarget());//根据mouse所在的target可以取到列的位置
if(index!==false){//当取到了正确的列时,(因为如果传入的target列没有取到的时候会返回false)
var record = store.getAt(index);//把这列的record取出来
var str = Ext.encode(record.data);//组装一个字符串,这个需要你自己来完成,这儿我把他序列化
var rowEl = Ext.get(e.getTarget());//把target转换成Ext.Element对象
rowEl.set({
'ext:qtip':str //设置它的tip属性
},false);
}
});
var win = new Ext.Window({
id:'window',
el:'window-win',
layout:'fit',
width:500,
height:270,
closeAction:'hide',
items: [grid]
});
win.show();
Ext.QuickTips.init();//注意,提示初始化必须要有
});
</script>
</head>
<body>
<div id="window-win">
<div id="grid"></div>
</body>
</html>
--------------------------------------------------------------