页次: 1
你自己注册的函数是不是不基于 pyi 的方式,应该要一律用 pyi 注册的方式来弄,这样才不会冲突
参考模块注册文档:https://pikapython.com/doc/index_cmodule.html
不是用的pyi,我是在pikaMain创建了之后,直接
obj_setObj(main, "SystemInfo", sysInfo);
这样注册的,这种方式在方案1上没问题,为何方案2就不行呢?其原因是啥?
我这个工程不太方便统一用pyi的方式,因为脚本部分被包装成了库,而这个注册是在应用程序模块中进行的。脚本库没法访问到仅在app模块里才有的量。所以我更希望知道背后的原因以及怎么解决这个问题
我的使用方法是:
1、先调用pikascript_entry得到pikaMain对象,将其做为全局对象
2、将代码从文件load上来后使用obj_run运行,这样一切正常
现在,我弄了两个py文件,用rust那个程序打包成了一个pikaModules.py.a文件,然后:
1、第1步上和面的一样不变
2、obj_linkLibraryFile加载pikaModules.py.a
3、obj_runModule(pikaMain, "main")这样来运行main.py
由于我自己注册了一些函数,是基于pikaMain这个对象来注册的。第一种方案,我自己注册的函数可以正常调用。第二种方案,我自己注册的函数会在obj_runModule(pikaMain, "main")的时候报找不到。为何呢?
import pika_lvgl as lv
scr = lv.scr_act()
inputH = SystemInfo.fontHeight * 3.5
def createUIToWifiServer(evt):
wm = WifiManager()
r = wm.scan()
if (r < 0):
print('WifiScan error:', r)
else:
for i in range(r):
wm.get(i)
def createUIToKeyboard(evt):
kbInput = lv.textarea(scr)
kbInput.set_pos(0, 0)
kbInput.set_size(scr.get_width(), inputH)
kb = lv.keyboard(scr)
kb.set_textarea(kbInput)
print('-------1')
span = lv.label(scr)
print('-------1')
span.set_pos(0, inputH + 8)
span.set_size(scr.get_width(), inputH)
span.set_flex_align(lv.FLEX_FLOW.ROW_WRAP, lv.FLEX_ALIGN.CENTER, lv.FLEX_ALIGN.CENTER)
print('-------1')
span.set_text('')
print('-------2')
tip = lv.label(span)
tip.set_text('如键盘无法设置密码,可尝试更换方式连接')
chgMode = lv.btn(span)
chgMode.set_pos(SystemInfo.fontHeight * 20, inputH + 8)
chgMode.add_event_cb(createUIToWifiServer, lv.EVENT.CLICKED, 0)
lv.label(chgMode).set_text('使用手机设置 >')
createUIToKeyboard(None)
上面这段代码,如果我将createUIToKeyboard函数去掉,将代码向左缩进一格直接执行,就没有任何问题。而这样放在函数里,则只能执行到kb.set_textarea(kbInput)这一行之前,这个函数就不再返回了,后面的print不会执行。这是为何?
页次: 1