2017-12-17 1 views
0

Ich benutze die neueste Version von Kivy: v1.10.1.dev0, git-Unknown, 20171208, Python v3.6.2, Mac OS.Wie Widgets von BoxLayout neu positionieren

Ich möchte folgendes erreichen: Wenn ich einen Wert in den Einstellungen reposition/redraw BoxLayout mit den geänderten Einstellungen aktualisiere, aktualisiere ich in meinem Fall size_hint Wert. Hier ist die Arbeit, die ich habe bisher:

my.py

from kivy.app import App 


class MyApp(App): 
    def build_config(self, config): 
     config.read('./my.ini') 

    def build_settings(self, settings): 
     settings.add_json_panel('Test', self.config, filename='my.json') 

    def on_config_change(self, config, section, key, value): 
     if section in ('layout',) and key in ('size_hint',): 
      # NOT WORKING!! 
      # print(self.root.canvas.clear()) 
      # self.root.canvas.ask_update() 
      # self.root.canvas.draw() 

      # NOT WORKING!! 
      print(self.root) 
      print(self.root.do_layout()) 

if __name__ == "__main__": 
    MyApp().run() 

my.kv

#:import SettingsWithSidebar kivy.uix.settings.SettingsWithSidebar 
BoxLayout: 
    RecycleView: 
     size_hint: float(app.config.get('layout', 'size_hint')), 1 
     Button: 
      text: 'Open Settings' 
      on_touch_down: app.settings_cls = SettingsWithSidebar; app.open_settings() 
    RecycleView: 
     size_hint: 1-float(app.config.get('layout', 'size_hint')), 1 
     Button: 
      text: 'Just a test' 

my.ini

[layout] 
size_hint = 0.6 

my.json

[ 
    { 
     "type": "string", 
     "title": "Size Hint", 
     "desc": "Size Hint", 
     "section": "layout", 
     "key": "size_hint" 
    } 
] 

Also, wie sehe ich das neue Layout mit dem neuen Wert size_hint aktualisiert, wenn ich das Einstellungsfenster schließe?

Thx!

Antwort

0

OK, nach einiger Hilfe von IRC#Kivy ist die Lösung, nicht direkt app.config.get('layout', 'size_hint') in .kv Datei zu verwenden, sondern Properties stattdessen verwendet.

my.kv

BoxLayout: 
    RecycleView: 
     size_hint: app.size_hint, 1 
     Button: 
      text: 'Open Settings' 
      on_touch_down: app.open_settings() 
    RecycleView: 
     size_hint: 1-app.size_hint, 1 
     Button: 
      text: 'Just a test' 

my.py

from kivy.app import App 
from kivy.properties import NumericProperty 
from kivy.uix.settings import SettingsWithSidebar 


class MyApp(App): 
    settings_cls = SettingsWithSidebar 
    size_hint = NumericProperty() 

    def build_config(self, config): 
     config.read('./my.ini') 

    def build_settings(self, settings): 
     settings.add_json_panel('Test', self.config, filename='my.json') 

    def load_config(self): 
     config = super(MyApp, self).load_config() 
     self.size_hint = config.getfloat('layout', 'size_hint') 
     return config 

    def on_config_change(self, config, section, key, value): 
     if section in ('layout',) and key in ('size_hint',): 
      self.size_hint = value 


if __name__ == '__main__': 
    MyApp().run() 
Verwandte Themen