Kivy - 来自设置面板的ColorPicker

时间:2017-03-03 15:46:17

标签: android kivy python-3.5

我有一个默认设置面板:

[
    { "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运行应用程序我得到上述错误。有没有办法绕过这个?

3 个答案:

答案 0 :(得分:1)

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

FloatLayout('blob')

在Python 3上它对我来说效果很好。所以,如果它不在FloatLayoutSettingItemSettings而且我们正在上升(或者下降,基本上来自“基础“类”,然后它在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兼容,我们需要删除按钮关键字。

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测试