我正在将Lua脚本添加到我们的应用程序中,我需要为GUI工具包实现绑定.我们使用的工具包是wxWidgets.
我正在使用Lua 5.1和luabind 0.9.1,到目前为止它运行良好.但是,我不确定如何最好地处理事件.例如,如果要在单击时创建按钮并打印字符串,则可以在C++中编写类似的内容
class MyClass : public wxFrame
{
MyClass (...)
{
b = new wxButton (this, -1, "Click me");
b->Bind (wxEVT_COMMAND_BUTTON_CLICKED, &MyClass::HandleButtonClick, this);
}
void HandleButtonClick (wxCommandEvent& ev)
{
wxMessageBox ("You clicked me");
}
}
Run Code Online (Sandbox Code Playgroud)
我在Lua做同样事情的梦想API看起来像这样:
b = wx.Button (frm, -1, "Click me")
b.on_click = function (ev)
print ("Button clicked")
end
Run Code Online (Sandbox Code Playgroud)
或者,允许多个事件处理程序:
b.on_click:add (function (ev)
print ("Button clicked again ...")
end)
Run Code Online (Sandbox Code Playgroud)
如果不可能,这样的东西更类似于C++ API:
b.bind (wx.EVT_COMMAND_BUTTON_CLICKED, function (ev)
print ("Yet again")
end)
Run Code Online (Sandbox Code Playgroud)
但是,我不知道如何使用Luabind实现这一点,而不为我想要使用的wxWidgets-library中的每个类编写包装类.
有什么建议?
或许Luabind可以通过某种方式自动创建辅助类(比如说"wxLuaEventPropagator")吗?因此,wxButton类为每个事件都有一个嵌套的wxLuaEventPropagator类("on_click",依此类推).再一次,我不想为我使用的wxWidgets中的每个类创建包装类,因为有一吨.
(是的,我知道wxLua)
因此,每次修改设备树时,我通常会更改自定义配方中的dts并重建图像.重建需要很长时间才能重建整个内核,然后需要构建映像并最终部署到目标设备.
是否有任何我只缺少重建设备树的技巧?
更新:
我已经将g0hl1n的答案标记为正确答案,因为这是我的问题的答案.但是,我发现使用Yocto中的内核非常麻烦:奇怪的,长路径和每次重建时文件被覆盖的风险,tmp/work-shared中内核的源代码,而内核是在tmp/work中构建的.
相反,我已经将内核开发从Yocto中移除了.Yocto有很好的工具来创建SDK(请参阅populate_sdk任务),通过快速重建和手动(或脚本化)部署,可以轻松地为内核开发设置环境.完成工作后,可以使用git diff将更改移动到配方.
以下页面上的说明非常有用:http://jumpnowtek.com/beaglebone/Working-on-the-BeagleBone-kernel.html
我正在重写一个旧的Rails应用程序,我认为我应该以RESTful方式进行,作为一种学习经验,如果没有别的.
我已经达成了一些切换布尔值的操作,例如,如果文章是否已发布.
在我做了几个动作之前:toggle_published,发布和取消发布.
它们非常易于使用:我只是在文章列表中链接到它们.
你会如何以RESTful方式做同样的事情?
我应该使用update-action,并构建一个迷你表单来替换之前使用的每个链接吗?我并不特别喜欢这个想法.
我希望能够使用通过USB连接到PC的红外遥控传感器来打开和关闭电脑.该传感器是一个定制PCB,采用AVR微处理器和V-USB软件USB实现.
现在,关闭电脑对软件没问题,但有没有办法用USB打开电脑?
(请注意,我不是在谈论从USB记忆棒或USB电源启动......)
我正在使用的应用程序无法在Visual Studio 2005的调试器中启动.
这是我做的:
该应用程序是一个非托管的C++项目,它使用大量的DLL文件作为插件.我正在使用"多线程调试"运行时,我确保所有依赖项都是针对相同的运行时编译的.
正是在这样做时,这个问题突然出现了.我试图扭转我的变化,但它没有帮助.重新启动计算机也无济于事.
我已经随机运行了一两次应用程序.如果我然后结束应用程序并再次启动它它没有启动.所以我不认为这是因为我的配置.
有任何想法吗?
还有一点需要注意:如果从Visual Studio外部启动应用程序,应用程序将启动并运行.
我需要做两次(或更多次)传球va_list.我有一个大小的缓冲区,我想用sprintf写一个格式化的字符串.如果格式化的字符串不适合分配的空间,我想要将分配的空间加倍并重复直到它适合.
(作为旁注,我希望能够首先计算格式化字符串的长度并分配足够的空间,但我发现可以做到的唯一功能是_snprintf,并且在VS2005中不推荐使用...)
现在,到目前为止没有问题:我在每次调用之前使用vsnprintf和va_start调用.
但我还创建了一个函数,它将a va_list作为参数,而不是"......".然后我不能再使用va_start了!我已经读过了va_copy,但VS2005不支持它.
那么,你会怎么做?
我正在为基于ARM-Cortex M3的设备编写启动脚本.如果我编译汇编程序启动脚本和C应用程序代码然后组合目标文件并将它们传输到我的设备一切正常.
但是,如果我使用ar创建存档(libboot.a)并将该存档与C应用程序组合,则会出现问题:
我把启动代码放在一个部分:
.section .boot, "ax"
.global _start
_start:
.word 0x10000800 /* Initial stack pointer (FIXME!) */
.word start
.word nmi_handler
.word hard_fault_handler
... etc ...
Run Code Online (Sandbox Code Playgroud)
我发现ld从最终的二进制文件中剥离了这个("boot"部分不可用).这是非常自然的,因为它不ld知道它的依赖性,但它会导致设备无法正确启动.
所以我的问题是:强制包含此代码的最佳方法是什么?
我们使用Python 2作为嵌入式应用程序,我们目前正在Raspberry Pi上进行原型设计.它有点慢,但可以接受.
现在我们已经将应用程序移植到Python 3.但由于某种原因,应用程序运行速度比使用Python 2慢大约4倍!我期待Python 3有点慢,但不是这样的!
我们的Linux发行版基于Yocto 2.2 Morty,我们使用默认的Python 3.5.2配方,没有自定义.我们还使用了meta-raspberrypi层来实现Raspberry兼容性.
我试着计时"pip3 --help"并得到以下结果:
$ time pip3 --help >/dev/null
real 0m22.686s
user 0m22.210s
sys 0m0.420s
Run Code Online (Sandbox Code Playgroud)
然后我使用最新的Raspbian发行版在相同的硬件(同样的SD卡)上尝试相同的测试:
$ time pip3 --help >/dev/null
real 0m6.874s
user 0m6.530s
sys 0m0.310s
$ time pip --help >/dev/null
real 0m4.329s
user 0m4.000s
sys 0m0.300s
Run Code Online (Sandbox Code Playgroud)
Python 2点比Python 3快一点,但最重要的是pip3在Raspbian上的运行速度比在Yocto上快3倍!
测试是非常可重复的,因此它们不是由pyc生成或缓存或类似的东西引起的.
有任何想法如何让Yocto像Raspbian一样快?
更新:
下面有一些关于Raspbian与Yocto中不同版本的Python和Pip的讨论,所以我仅使用Python标准库创建了一个新的基准:
Yocto 2.2 Morty:
sh-4.3# time python3 --version
Python 3.5.2
real 0m0.024s
user 0m0.010s
sys 0m0.000s
sh-4.3# time python3 -c "import asyncio"
real 0m3.439s
user 0m3.300s
sys …Run Code Online (Sandbox Code Playgroud) 我即将决定如何处理基于XML的UI描述格式的国际化.
格式通常如下所示:
...
<devif>
<screen id="scr1" title="Settings for this and that">
<header text="Climate readings"/>
<rd setp="123" text="Air temperature" unit="°C"/>
<rd setp="234" text="Humidity" unit="%RH"/>
<rd setp="345" text="CO2" unit="ppm"/>
<header text="Settings"/>
<wr setp="567" text="Air temperature demand" unit="°C"/>
</screen>
...
</devif>
Run Code Online (Sandbox Code Playgroud)
每个文件都包含大量屏幕,最多可包含10,000行,我们的应用程序中有十几个这样的文件.
我仍然可以改变格式以最好地满足我们的需求.那么你将如何翻译呢?
我一直在考虑一些可能的方法来解决这个问题:
第一种解决方案存在的问题是,根据上下文,英文文本可能会被翻译成不同的消息.
第二种解决方案使源文件的可读性降低(尽管不是很多),并且它不能轻松处理属性的转换.
一旦将文件翻译成5-6种语言,第三种解决方案就会使文件变得非常庞大和繁琐.
我有三个表:components,attributes和attribute_values。每个组件可以具有许多attribute_values。每个attribute_value属于一个属性。是的,这是可怕的EAV模式...
我创建了以下两种形式:
class AttributeValueForm(Form):
attribute = HiddenField()
value = StringField('Value')
class ComponentForm(Form):
... non-related fields left out ...
attribute_values = FieldList(FormField(AttributeValueForm))
Run Code Online (Sandbox Code Playgroud)
这些是SQLAlchemy模型:
class Component(db.Model):
__tablename__ = 'components'
id = db.Column(db.Integer, primary_key=True)
... non-related columns left out ...
class AttributeValue(db.Model):
__tablename__ = 'attribute_values'
id = db.Column(db.Integer, primary_key=True)
value = db.Column(db.String)
attribute_id = db.Column(db.Integer, db.ForeignKey('attributes.id'))
attribute = db.relationship('Attribute', backref='attribute_values'))
component_id = db.Column(db.Integer, db.ForeignKey('components.id'))
component = db.relationship('Component', backref='attribute_values'))
def Attribute(db.Model):
__tablename__ …Run Code Online (Sandbox Code Playgroud) 这是我的问题:
我有两个这样的课程:
class Signal {
public:
void connect(...) { sig.connect(...); }
private:
boost::signal2::signal sig;
};
class MyClass {
public:
Signal on_event;
};
Run Code Online (Sandbox Code Playgroud)
我想暴露,MyClass::on_event以便我可以my_class_instance.on_event.connect(...)从Python 调用.
这就是我如何包装这些类:
class_<Signal, boost::noncopyable> ("Signal", noinit)
.def("connect", &some_helper_function);
class_<MyClass> ("MyClass")
.def_readonly("on_event", &MyClass::on_event);
Run Code Online (Sandbox Code Playgroud)
这编译,但当我尝试connect从Python 调用时,我得到:AttributeError: can't set attribute.这在这里解释:http://www.boost.org/doc/libs/1_53_0/libs/python/doc/tutorial/doc/html/python/exposing.html,所以我改为.def_readwritefor on_event.
但现在我得到了编译时错误.它几乎不可能读取C++模板错误消息,但据我所知,因为它boost::signals2::signal是不可复制的.由于.def_readwrite使成员可分配,因此它不能是不可复制的.但对于我的用法我不想分配成员,我只是不想调用一个方法.
我考虑制作const 的connect方法Signal,即使它改变了对象,但是我不能sig.connect()从那个方法调用,所以这是一个不行的...
有任何想法吗?
我有点惊讶以下代码没有按预期工作:
#include "stdio.h"
class RetA
{
public:
virtual void PrintMe () { printf ("Return class A\n"); }
};
class A
{
public:
virtual RetA GetValue () { return RetA (); }
};
class RetB : public RetA
{
public:
virtual void PrintMe () { printf ("Return class B\n"); }
};
class B : public A
{
public:
virtual RetA GetValue () { return RetB (); }
};
int main (int argc, char *argv[])
{
A instance_A;
B instance_B;
RetA ret; …Run Code Online (Sandbox Code Playgroud) 我正在使用Boost Python为wxWidgets子集创建绑定.wxWidgets中的窗口对象不应手动删除,因为它们处理自己的删除:例如,当用户单击关闭按钮关闭顶级窗口时,它会自动删除自身.如果一个窗口被删除,奇怪的事情将事件处理程序等情况的发生
(详情:http://docs.wxwidgets.org/2.8/wx_windowdeletionoverview.html)
但是这导致了在Python中创建的窗口对象的问题:在垃圾收集时,C++对象总是被删除!
有没有办法告诉Boost Python不要拥有它创建的C++对象?或许类似于构造函数的调用策略?
(另外,我有点担心如何处理从C++中删除的对象.当关联的C++对象被删除时,Python对象会发生什么?Python不会以任何方式得到通知.)
c++ ×4
boost-python ×2
yocto ×2
arm ×1
avr ×1
bitbake ×1
boost ×1
c ×1
debugging ×1
device-tree ×1
embedded ×1
flask ×1
htpc ×1
ld ×1
linker ×1
linux-kernel ×1
localization ×1
lua ×1
luabind ×1
printf ×1
python ×1
python-3.x ×1
raspberry-pi ×1
raspbian ×1
rest ×1
return-value ×1
usb ×1
virtual ×1
wtforms ×1
wxwidgets ×1
xml ×1