您尚未登录。

#1 Re: PikaPython(嵌入式Python引擎) » obj_run直接运行一段代码可以,但obj_linkLibrary之后再运行代码就不行 » 2025-02-21 20:02:21

lyon1998 说:

你自己注册的函数是不是不基于 pyi 的方式,应该要一律用 pyi 注册的方式来弄,这样才不会冲突

参考模块注册文档:https://pikapython.com/doc/index_cmodule.html

不是用的pyi,我是在pikaMain创建了之后,直接

obj_setObj(main, "SystemInfo", sysInfo);

这样注册的,这种方式在方案1上没问题,为何方案2就不行呢?其原因是啥?

我这个工程不太方便统一用pyi的方式,因为脚本部分被包装成了库,而这个注册是在应用程序模块中进行的。脚本库没法访问到仅在app模块里才有的量。所以我更希望知道背后的原因以及怎么解决这个问题

#2 PikaPython(嵌入式Python引擎) » obj_run直接运行一段代码可以,但obj_linkLibrary之后再运行代码就不行 » 2025-02-20 20:08:32

coollofty
回复: 3

我的使用方法是:
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")的时候报找不到。为何呢?

#3 Re: PikaPython(嵌入式Python引擎) » 在PC上用哪个函数可以把加载的代码转成字节码? » 2025-02-13 14:41:24

@lyon1998
意思是在当前目录下运行那个rust程序,他会把所有目录下的py文件都编译出来,对吧

#4 PikaPython(嵌入式Python引擎) » 在PC上用哪个函数可以把加载的代码转成字节码? » 2025-02-09 17:43:57

coollofty
回复: 4

我这边需要在PC上手动完成字节码的编译,找了一下文档中只提到了那个rust程序可以自动打包,但我这边的场景是在运行的时候还需要下载几个代码文件,我想在PC上转好了再给IOT设备去跑

#5 Re: PikaPython(嵌入式Python引擎) » 代码放在函数里和不放在函数里,执行结果居然完全不同 » 2025-02-09 15:44:11

嗯,确定是空行问题,只要将空行加入和上一行结构相同的空格,问题就解决了。
另外,这个REPL模式我并没有在哪里看到有解释说明,能否提供一些资料我了解一下什么是REPL,谢谢

#6 PikaPython(嵌入式Python引擎) » 代码放在函数里和不放在函数里,执行结果居然完全不同 » 2025-02-07 21:13:43

coollofty
回复: 3
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不会执行。这是为何?

页脚

工信部备案:粤ICP备20025096号 Powered by FluxBB

感谢为中文互联网持续输出优质内容的各位老铁们。 QQ: 516333132, 微信(wechat): whycan_cn (哇酷网/挖坑网/填坑网) service@whycan.cn