Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/205.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android Kivy-设置面板中的颜色选择器_Android_Kivy_Python 3.5 - Fatal编程技术网

Android Kivy-设置面板中的颜色选择器

Android Kivy-设置面板中的颜色选择器,android,kivy,python-3.5,Android,Kivy,Python 3.5,我有一个默认设置面板: [ { "type": "title", "title": "Test application" }, {"type": "buttons", "title": "Title here", "desc": "desc here", "section": "some section", "key": "configchangebuttons", "buttons":[ {"titl

我有一个默认设置面板:

[
    { "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.\uuuu init\uuuuu()不接受任何参数
,我知道这是来自构建设置的寄存器类型部分

编辑

经过更多的调查,似乎这种方法是有效的,按钮显示在设置面板中,但只有当APK是建立和运行在手机上。如果从linux运行应用程序,则会出现上述错误。有没有办法绕过这个

不,这是,也不是的错,因为这只是一个
浮动布局,这意味着它也会崩溃:

FloatLayout('blob')
它在Python3上运行得很好。因此,如果它不在
FloatLayout
SettingItem
Settings
中,并且我们正在向上(或向下,基本上是从“基类”开始),那么它就在
SettingButtons
中。一个简单的打印将告诉您出了什么问题:

print(kwargs)
Python3有一个变化(我找不到change或pep的确切url),它禁止您将关键字参数传递给
对象本身

此代码一直工作,直到达到您在
设置值()中提到的预期错误为止。


考虑到我上面所说的,我通过以下方式解决了我的按钮问题:

而不是像这样将
**kwargs
传递给init内部的超级用户:

super(SettingItem, self).__init__(**kwargs)
super(SettingItem, self).__init__()
我所做的是,使用Python 3方式,在没有任何参数的情况下传递super init,如下所示:

super(SettingItem, self).__init__(**kwargs)
super(SettingItem, self).__init__()
这样做仍然有效。现在,我们可以从按钮的设置菜单直接启用颜色选择器


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

因为我没有找到解决之前答案中操作按钮错误的实际方法,我想添加我自己的:为了使按钮与Python3兼容,我们需要在调用super时从kwargs中删除buttons关键字

def __init__(self, title, buttons, **kwargs):
    self.register_event_type('on_release')
    kw = kwargs.copy()
    kw.pop('buttons', None)
    super(SettingItem, self).__init__(**kw)
    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)
从那里,您可以在app类中的
on\u config\u change(self、config、section、key、value)
函数中执行任何您想要的操作。参数值将包含按钮的id


使用kivy 1.11.0进行了测试,我明白了,所以代码可以在我的android上运行,因为它是以python 2.7构建的,尽管我使用python 3编写它。有什么可以绕过的吗?@Nick Yeah,同时编写与Python 2和3兼容的代码,或者如果您以py3为目标,则只编写py3代码。我确实以Python 3为目标,但出于某种原因,buildozer/Python for android似乎将其打包为Python 2。正如这里的一个注意事项,这只解决了加载设置时的崩溃问题,实际使用该按钮,您仍然需要传递关键字参数。使用此修复程序只能使您直观地调试“设置”面板的外观