2017-03-03 34 views
2

我有一个默认的设置面板颜色拾取:Kivy - 从设置面板

[ 
    { "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运行应用程序,我得到上述错误。任何方式绕过这个?

回答

1

不,这是not Settings.register_type()'s fault,也不SettingItem的错,因为这只是一个FloatLayout,这将意味着这会崩溃过:

FloatLayout('blob') 

,它工作得很好,我对Python的3。因此,如果它不是在FloatLayoutSettingItemSettings,我们要向上(或向下,基本上是从“基地”类),那么它在SettingButtons。一个简单的打印会告诉你什么是错的:

print(kwargs) 

有使用Python 3的变化(我找不到改变或PEP确切URL)它禁止你通过关键字参数下降到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 
+0

我明白了,所以代码在我的android上工作,因为它的构建方式是Python 2.7,即使我使用python 3编写它。是否有任何绕过? – Nick

+0

@Nick Yeah,同时编写Python 2和3兼容代码,或者如果您使用py3编写py3代码。 – KeyWeeUsr

+0

好吧,我做目标蟒3,但它似乎buildozer /蟒蛇为Android打包为Python 2由于某种原因 – Nick

1

考虑到我上面说我设法解决我的按钮问题的方式如下:

不是传递**kwargs到init内的超级内容如下:

super(SettingItem, self).__init__(**kwargs) 

我所做的是,使用Python 3的方式,并通过了sup er init没有像这样的任何参数:

super(SettingItem, self).__init__() 

而这样做它仍然有效。现在我们可以直接从按钮的设置菜单中启用颜色选择器。

我会给@KeyWeeUsr批准的答案,因为他的回复使我得出了这个结论。

+0

就像在这里注意,这只能解决设置加载崩溃的问题,实际上使用按钮,你仍然需要传递关键字参数。使用此修补程序只能让您直观地调试设置面板的外观 – Nick