我有一个默认设置面板:
[
{ "type": "title",
"title": "Test application" },
{"type": "buttons",
"title": "Title here",
"desc": "desc here",
"section": "some section",
"key": "configchangebuttons",
"buttons":[
{"title":"Add","id":"button_add"},
{"title":"Del","id":"button_delete"},
{"title":"Rename","id":"button_rename"}
]},
{ "type": "numeric",
"title": "My second key",
"desc": "Description of my second key",
"section": "section1",
"key": "key2" }
]
我阅读了文档,但我真的没有看到实际向面板添加操作按钮的方法,以便启动颜色选择器并获得结果以将其保存在ini文件中。
我尝试为设置面板注册一个新对象(按钮),但它确实没有那么好。
我的目标是获取用户选择的颜色的rgb代码并将其保存在ini文件中,我将从中读取并在标签上使用它。
这是我尝试添加的按钮
class SettingButtons(SettingItem):
def __init__(self, **kwargs):
self.register_event_type('on_release')
super(SettingItem, self).__init__(**kwargs)
for aButton in kwargs["buttons"]:
oButton=Button(text=aButton['title'], font_size= '15sp')
oButton.ID=aButton['id']
self.add_widget(oButton)
oButton.bind (on_release=self.On_ButtonPressed)
def set_value(self, section, key, value):
# set_value normally reads the configparser values and runs on an error
# to do nothing here
return
def On_ButtonPressed(self,instance):
self.panel.settings.dispatch('on_config_change',self.panel.config, self.section, self.key, instance.ID)
我在这里注册实例:
def build_settings(self, settings):
settings.register_type('buttons', SettingButtons)
with open("settings.json", "r") as settings_json:
settings.add_json_panel('B4A settings', self.config, data=settings_json.read())
但是当我启动应用程序时,我得到了:
TypeError: object.__init__() takes no parameters
我知道这是来自build_settings的register_type部分
编辑
经过一些调查后,似乎这种方法有效并且按钮显示在设置面板中,但前提是APK是从手机构建并运行的。如果我从我的Linux运行应用程序我得到上述错误。有没有办法绕过这个?
答案 0 :(得分:1)
不,这是not Settings.register_type()
's fault,也不是SettingItem
的错,因为那只是FloatLayout
,这意味着这也会崩溃:
FloatLayout('blob')
在Python 3上它对我来说效果很好。所以,如果它不在FloatLayout
,SettingItem
,Settings
而且我们正在上升(或者下降,基本上来自“基础“类”,然后它在SettingButtons
。一个简单的打印将告诉你什么是错的:
print(kwargs)
Python 3发生了变化(我无法找到更改或pep的确切网址),它禁止您将关键字参数传递给object
本身。
此代码有效,直到达到您在set_value()
中提到的预期错误:
def __init__(self, title, buttons, **kwargs):
print(kwargs)
self.register_event_type('on_release')
super(SettingItem, self).__init__(**kwargs)
for aButton in buttons:
oButton=Button(text=aButton['title'], font_size= '15sp')
oButton.ID=aButton['id']
self.add_widget(oButton)
oButton.bind (on_release=self.On_ButtonPressed)
def set_value(self, section, key, value):
# set_value normally reads the configparser values and runs on an error
# to do nothing here
return
答案 1 :(得分:1)
考虑到我上面所说的,我设法通过以下方式解决了我的按钮问题:
而不是将**kwargs
传递给init中的super,如下所示:
super(SettingItem, self).__init__(**kwargs)
我所做的是,使用Python 3方式并传递超级init,没有任何像这样的args:
super(SettingItem, self).__init__()
这样做它仍然有效。现在我们可以直接从按钮的设置菜单中选择颜色选择器。
我会给@KeyWeeUsr批准的答案,因为他的答复是导致我得出这个结论的。
答案 2 :(得分:0)
由于我错过了摆脱以前的答案中的操作按钮错误的实际解决方案,因此我想添加自己的解决方案:为了使该按钮与Python 3兼容,我们需要删除按钮调用super时来自kwargs的em>关键字。
querySelector(`div[data-key="${keyCode}"]`)
从那里,您可以在应用程序类的x=rep(1:10,3)
y_all = c(1:10,2:11,3:12)
data = as.data.frame(cbind(x,y_all))
pic_1 = ggplot(data, aes(x=data$x,y=data$y_all))
pic_2 = pic_1 + stat_summary(fun.y = mean, geom = 'line', colour = 'blue')
pic_3 = pic_2+stat_summary(fun.y = mean, geom = 'ribbon',fun.ymax = max, fun.ymin =min)
pic_4=pic_3+stat_summary(fun.y = mean, geom = 'line', colour ='red',size=1)
函数中执行所需的任何操作。参数 value 将包含按钮的 id 。
经过Kivy 1.11.0测试