首先我们要知道pb是如何打开一个窗口,大概就open,opensheet,openwitparam,opensheetwithparm,这四个函数
open ( ref window o ) returns integer
open ( ref window o, string n ) returns integer
open ( ref window o, string n, window p ) returns integer
open ( ref window o, window p ) returns integer
opensheet ( ref window o, string n, window p ) returns integer
opensheet ( ref window o, string n, window p, integer w ) returns integer
opensheet ( ref window o, string n, window p, integer w, arrangeopen t ) returns integer
opensheet ( ref window o, window p ) returns integer
opensheet ( ref window o, window p, integer w ) returns integer
opensheet ( ref window o, window p, integer w, arrangeopen t ) returns integer
opensheetwithparm ( ref window o, readonly double a, string n, window p ) returns integer
opensheetwithparm ( ref window o, readonly double a, string n, window p, integer w ) returns integer
opensheetwithparm ( ref window o, readonly double a, string n, window p, integer w, arrangeopen t ) returns integer
opensheetwithparm ( ref window o, readonly double a, window p ) returns integer
opensheetwithparm ( ref window o, readonly double a, window p, integer w ) returns integer
opensheetwithparm ( ref window o, readonly double a, window p, integer w, arrangeopen t ) returns integer
opensheetwithparm ( ref window o, readonly powerobject a, string n, window p ) returns integer
opensheetwithparm ( ref window o, readonly powerobject a, string n, window p, integer w ) returns integer
opensheetwithparm ( ref window o, readonly powerobject a, string n, window p, integer w, arrangeopen t ) returns integer
opensheetwithparm ( ref window o, readonly powerobject a, window p ) returns integer
opensheetwithparm ( ref window o, readonly powerobject a, window p, integer w ) returns integer
opensheetwithparm ( ref window o, readonly powerobject a, window p, integer w, arrangeopen t ) returns integer
opensheetwithparm ( ref window o, readonly string a, string n, window p ) returns integer
opensheetwithparm ( ref window o, readonly string a, string n, window p, integer w ) returns integer
opensheetwithparm ( ref window o, readonly string a, string n, window p, integer w, arrangeopen t ) returns integer
opensheetwithparm ( ref window o, readonly string a, window p ) returns integer
opensheetwithparm ( ref window o, readonly string a, window p, integer w ) returns integer
opensheetwithparm ( ref window o, readonly string a, window p, integer w, arrangeopen t ) returns integer
openwithparm ( ref window o, readonly double a ) returns integer
openwithparm ( ref window o, readonly double a, string n ) returns integer
openwithparm ( ref window o, readonly double a, string n, window p ) returns integer
openwithparm ( ref window o, readonly double a, window p ) returns integer
openwithparm ( ref window o, readonly powerobject a ) returns integer
openwithparm ( ref window o, readonly powerobject a, string n ) returns integer
openwithparm ( ref window o, readonly powerobject a, string n, window p ) returns integer
openwithparm ( ref window o, readonly powerobject a, window p ) returns integer
openwithparm ( ref window o, readonly string a ) returns integer
openwithparm ( ref window o, readonly string a, string n ) returns integer
openwithparm ( ref window o, readonly string a, string n, window p ) returns integer
openwithparm ( ref window o, readonly string a, window p ) returns integer
那我们要使用systemlibrary来调用上面的,下面以实现opensheet为例详细讲解
opensheet ( ref window o, readonly string a, window p, integer w, arrangeopen t ) returns integer
先看PyPB中如何调用这个函数的
def opensheet(self,parentwindow,w,arrangeopen:str="layered",mutil=False):
# 创建临时变量OB_DATA
rt2 = ctypes.cast( (OB_DATA*2)() , POBDATA)
local_var(rt2[0],"window")
d = ref_obdata(rt2[1],rt2[0])
# 创建一个枚举类型 arrangeopen 默认为layered
ly = Obj("arrangeopen")[arrangeopen]
# 父窗口对象
self.parent = parentwindow
# 调用opensheet方法
return Obj().opensheet(d,self.name,self.parent.obj,w,ly)
演示视频
打开窗口演示
实现的流程如下:
1 Obj().opensheet(d,self.name,self.parent.obj,w,ly)这个调用的语句原理和systemlibrary中调用messagebox一样,我们这里不再将了,详见https://blog.csdn.net/u010238274/article/details/127079980?spm=1001.2014.3001.5501
这里OB_DATA() 等同于c中定义一个结构体OB_DATA ob
2 第一个参数ref window o的实现
先定义一个局部变量,window,具体api如下
def local_var(obdata:OB_DATA, vartype):
ob_set_data_flags(obdata, 0xD00 )
och,_=ob_global_reference(vartype)
ob_set_data_type(obdata,och.class_id )#32781
ob_set_data_ptr_val(obdata,ctypes.c_void_p(0))
ob_init_var_data(obdata)
然后将变量添加ref引用,具体api如下
def ref_obdata(obdata:OB_DATA, fromob:OB_DATA )->OB_DATA:
refpak=ot_build_simple_refpak(ctypes.pointer(fromob),0)
ot_set_reference_argument(obdata, refpak )
obdata.type = fromob.type
return obdata
这里需要注意的一个地方,loval_var的vartype这里只能传window,如果传具体的窗口名称,api则会调用不成功,我猜测这个就是跟pb中定义的函数类型为 ref window有关
3 第二个参数,具体窗口的类名,字符串类型,这个很简单,api如下
def ob_set_data_string(obdata, instr):
ob_set_data_ptr(obdata,ob_dup_string(instr),STRING_TYPE,1 )
4 第三个参数,父窗口,这里好像超纲了,后文在讲窗口事件和python如何交互的时候,再介绍这一部分的内容,这里假设有个已经打开了的全局窗口,窗口名为w_main,也就是在pb中open(w_main)已经打开了的窗口,我们通过获取全局变量的方式来获取到这个窗口的OB_DATA
def gloab_var(varname:str):
return return_point(
pbvm.ob_get_global_var_data,POBDATA,
__obThis,ctypes.c_char_p(varname.encode("GBK")) )
调用方式 gloab_var("w_main"),我们把返回值作为第三个参数传入
5 第四个参数,是一个Enumerated类型的变量,arrangeopen,pb中是这样定义的这个枚举类型
och获取方式,通过ob_global_reference("arrangeopen"),通过遍历arrangeopen所有的内容,与layered匹配,找到对应的value,这个value值其实就是一个int,具体调用的api如下
def ob_get_enum_info( och):
num=ctypes.pointer(ctypes.c_ushort())
return return_point(
pbvm.ob_get_enum_info,POB_ENUM_INFO,__obThis,och,num),num.contents.value
def new_enum(intval,class_id):
node = OB_DATA()
ob_set_data_enum(node, intval,class_id)
return node
if self.isEnum==True :
pinfo,num = ob_get_enum_info(self.och)
if pinfo and num>0:
for i in range(num):
name = pinfo[i].name.decode("GBK")
if name==index:
return new_enum(pinfo[i].value, self.och.class_id)
以上都是个人的理解,分享以及记录一下,怕过段时间就不记得了...