2017-02-28 14 views
0

ポップアップを作成しました。これは基本的にいくつかの行のオプションです(最大5行)。Kivy Stack-GridLayoutから要素を削除する

「+」ボタンを押すと、新しい行が表示されます。

「 - 」ボタンを押すと、最後の行が表示されます。不幸にもそれはしません。

Iはroot.removeすでに以下を試してみた():

- > widget_path.pop(0): 視覚的変化、IがNの代わりにN-1の行を参照。

- > widget_path.pop(): 最後の行ではなく最初の行を削除します。

- >のGridLayout(COLS:4)の代わりにStackLayoutの:同様の結果

は、あなたが私を助けてもらえますか?ここで

は私のコードです:

.kvの-file。

<FormPopup>: 
    size_hint: None, None 
    size: '361pt', '220pt' 
    BoxLayout: 
     orientation: 'vertical' 

    BoxLayout: 
     size_hint: 1, None 
     height: '20pt' 
     orientation: 'horizontal' 
     Label: 
      text: 'column1' 
     Label: 
      text: 'column2' 
     Label: 
      text: 'column3' 
     Label: 
      text: 'column4' 
     # list of sensors 
     StackLayout: 
      padding: 0 
      spacing: 1 
     orientation: 'lr-tb' 
     pos_hint: {'center_x': .5, 'center_y': .5} 
       height: self.minimum_height 
       id: measure_stack 

     BoxLayout: 
     orientation: 'horizontal' 
      MyButton: 
       text: '+' 
        on_release: root.add() 
      MyButton: 
        text: '-' 
        on_release: root.remove() 

私の.pyクラス:

class FormPopup(Popup): 
    """Class: Popup for comments""" 
    def __init__(self): 
     super().__init__() 
     self.error = 0 
     self.linenumber = 0 
     self.add() 

    def add(self): 
     """add a new option-line""" 
     widget_path = self.ids 
     if self.linenumber < 5 : 
      sensor_id = 'sensor_' + str(self.linenumber) 
      widget_path['measure_stack'].add_widget(Spinner(id = sensor_id, size_hint=(None,None), height='20pt', width='85pt', text = '---', values= ('A','B','C'))) 
      measurand_id = 'measurand_' + str(self.linenumber) 
      widget_path['measure_stack'].add_widget(Spinner(id = measurand_id, size_hint=(None,None), height='20pt', width='85pt', text = '---', values= ('A','B','C'))) 
      branchwise_id = 'branchwise_' + str(self.linenumber) 
      widget_path['measure_stack'].add_widget(Spinner(id = branchwise_id, size_hint=(None,None), height='20pt', width='85pt', text = '---', values= ('A','B','C'))) 
      procedure_id = 'procedure_' + str(self.linenumber) 
      widget_path['measure_stack'].add_widget(Spinner(id = procedure_id, size_hint=(None,None), height='20pt', width='85pt', text = '---', values= ('A','B','C'))) 
      self.linenumber += 1 

    def remove(self): 
     """remove one option-line""" 
     widget_path = self.ids.measure_stack.children 
     # do not remove if there is only one line 
     if len(widget_path) > 4: 
      self.linenumber -= 1 
      for i in range(4): 
       widget_path.pop(0) 

答えて

1

は、ウィジェットを取得し、それを削除します。
その例:

from kivy.app import App 
from kivy.lang import Builder 


root = Builder.load_string(''' 

BoxLayout: 
    GridLayout: 
     id: grid 
     cols: 1 
     rows: 5 
     Label: 
      text: "label 1" 
     Label: 
      text: "label 2" 
     Label: 
      text: "label 3" 
     Label: 
      text: "label 4" 

    Button: 
     text: "Remove last item" 
     on_release: grid.remove_widget(grid.children[0]) 

''') 



class MyApp(App): 

    def build(self): 
     return root 

MyApp().run() 
関連する問題