2017-04-03 11 views
0

私はドロップダウンメニューからオプションを選択してスクロールビューに行の2つのラベルを追加するために+ボタンを押してスクロールビューを作成しようとしています。これまでのコードです:Kivy - スケーラブルなScrollViewを作成する

from kivy.app import App 
from kivy.uix.label import Label 
from kivy.lang import Builder 
from kivy.properties import ListProperty 
from kivy.uix.boxlayout import BoxLayout 
from kivy.uix.gridlayout import GridLayout 
from kivy.uix.dropdown import DropDown 
from kivy.uix.button import Button 
from kivy.uix.textinput import TextInput 

from kivy.uix.screenmanager import ScreenManager, Screen, FadeTransition 

class CaloriesScreen(Screen): 
    pass 

class theScreenManager(ScreenManager): 
    pass 

root_widget = Builder.load_string(''' 
#:import FadeTransition kivy.uix.screenmanager.FadeTransition 

theScreenManager: 
    CaloriesScreen: 

<CaloriesScreen>: 
    name: 'calories' 
    BoxLayout: 
     orientation: 'vertical' 

     BoxLayout: 
      orientation: 'horizontal' 
      size_hint: 1, .3 
      Button: 
       text: '<' 
       size_hint: .1, 1 
       font_size: 75 
       background_normal: "" 
       background_color: 0.18, .5, .92, 1 
       on_release: app.root.current = 'main' 

      Label: 
       text: 'Calories' 
       halign: 'left' 
       font_size: 50 
       canvas.before: 
        Color: 
         rgb: 0.18, .5, .92 
        Rectangle: 
         pos: self.pos 
         size: self.size 
      Widget: 
       size_hint: .1, 1 
       canvas.before: 
        Color: 
         rgb: 0.18, .5, .92 
        Rectangle: 
         pos: self.pos 
         size: self.size 

     BoxLayout: 
      orientation: 'horizontal' 
      size_hint: 1, .4 
      spacing: 50 
      canvas.before: 
       Color: 
        rgb: 0.8, 0.8, 0.8 
       Rectangle: 
        pos: self.pos 
        size: self.size 
      Label: 
       text: 'Recipes' 
       font_size: 30 
       color: 0.18, .5, .92, 1 


      Button: 
       id: btn 
       text: 'Select a recipe...' 
       font_size: 30 
       on_release: dropdown.open(self) 
       height: '48dp' 
       pos_hint: { 'top' : 0.75} 
       size_hint: .8, .5 

      DropDown: 

       id: dropdown 
       on_parent: self.dismiss() 
       on_select: btn.text = '{}'.format(args[1]) 


       Button: 
        text: 'Simple Cheese Omelette' 
        size_hint_y: None 
        height: '48dp' 
        on_release: dropdown.select('First Item') 

       Button: 
        text: 'Burger' 
        size_hint_y: None 
        height: '48dp' 
        on_release: dropdown.select('Second Item') 

       Button: 
        text: 'Tomato and Caper Linguine' 
        size_hint_y: None 
        height: '48dp' 
        on_release: dropdown.select('Third Item') 


      Button: 
       text: '+' 
       font_size: 30 
       background_normal: "" 
       background_color: 0.18, .5, .92, 1 
       pos_hint: { 'top' : 0.65} 
       size_hint: .1, .3 
       #on_release: 
      Widget: 
       size_hint: .02, 1 

     BoxLayout: 
      orientation: 'horizontal' 
      size_hint: 1, .2 
      canvas.before: 
       Color: 
        rgb: 0.18, .5, .92 
       Rectangle: 
        pos: self.pos 
        size: self.size 
      Label: 
       text:'Food' 
       color: (1, 1, 1, 1) 
      Label: 
       text:'Calories' 
       color: (1, 1, 1, 1) 

     ScrollView: 
      scroll_timeout: 250 
      scroll_distance: 20 
      do_scroll_y: True 
      do_scroll_x: False 
      GridLayout: 
       id: grid 
       cols: 2 
       spacing: 10 
       padding: 10 
       Label: 
        text:'Food' 
        color: (1, 1, 1, 1) 
       Label: 
        text:'Calories' 
        color: (1, 1, 1, 1) 


''') 

class temprecipeapp(App): 
    def build(self): 
     return root_widget 

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

スクロールビューの白色の食品とカロリーのラベルは例です。理想的には彼らはトップに浮かぶだろうし、私はドロップダウンから新しいオプションを選択し、キューに追加することができるだろう。私はこれについてどうやって行くのですか?現在、スクロールビューにスタックしているラベルをたくさん追加すると、スクロールが有効になりません。

答えて

1

2列、foodcaloriesそれはおそらく最高だろうに合わせてアイテムを作成することであるヘッダはFoodCaloriesをIEとFoodItemとして彼らのために別の容器を作成し、テーブルから「コピー」動作をしますただBoxLayoutです。

FoodItemを持っていることを2 StringProperties

  • 食品
  • カロリー

、あなたがroot.foodroot.caloriesによってKVでそれらにアクセスすることができます。

kvでこのようなアイテムを直接作成してScrollViewに配置するには、Factoryが必要です(デフォルトでは使用できません)。それを使用すると、基本的にこれを行うことができます。

Factory.MyWidget() 

を、それはあなたがあなたのGridLayoutadd_widgetメソッドに渡す必要がある、あなたのウィジェットのインスタンスを作成します。コード内

編集:

... 
from kivy.properties import StringProperty 

... 
root_widget = Builder.load_string(''' 
#:import FadeTransition kivy.uix.screenmanager.FadeTransition 
#:import Factory kivy.factory.Factory # <- import Factory 

... 
      DropDown: 

       id: dropdown 
#    on_parent: self.dismiss() <- don't do this 
       on_select: btn.text = '{}'.format(args[1]) 


       Button: 
        text: 'Simple Cheese Omelette' 
        size_hint_y: None 
        height: '48dp' 
        on_release: dropdown.select('First Item') 

       Button: 
        text: 'Burger' 
        size_hint_y: None 
        height: '48dp' 
        on_release: dropdown.select('Second Item') 

       Button: 
        text: 'Tomato and Caper Linguine' 
        size_hint_y: None 
        height: '48dp' 
        on_release: dropdown.select('Third Item') 


      Button: 
       text: '+' 
       font_size: 30 
       background_normal: "" 
       background_color: 0.18, .5, .92, 1 
       pos_hint: { 'top' : 0.65} 
       size_hint: .1, .3 
       on_release: grid.add_widget(Factory.FoodItem(food=btn.text, calories='10')) <- add a new item 

... 
     ScrollView: 
      scroll_timeout: 250 
      scroll_distance: 20 
      do_scroll_y: True 
      do_scroll_x: False 
      GridLayout: 
       id: grid 
       cols: 1 <- change cols 
       size_hint_y: None 
       height: self.minimum_height <- make the layout resize itself 
       spacing: 10 
       padding: 10 

<FoodItem>: 
    size_hint_y: None 
    height: 20 <- set a size for the item 
    Label: 
     text: root.food 
     color: (1, 1, 1, 1) 
    Label: 
     text: root.calories 
     color: (1, 1, 1, 1) 
''') 

class FoodItem(BoxLayout): 
    food = StringProperty('') 
    calories = StringProperty('') 

... 

はまた、それは物事が容易になり、純粋なDropdownの代わりにSpinnerを使用することを検討してください(とあなたがon_parent動作を回避します)。

関連する問題