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。正如这里的一个注意事项,这只解决了加载设置时的崩溃问题,实际使用该按钮,您仍然需要传递关键字参数。使用此修复程序只能使您直观地调试“设置”面板的外观