2017-03-03 41 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