2017-12-19 45 views
0

それぞれ3つのボタンを含む3つのドロップダウンを含むドロップダウンを作成したいと思います。Python KIVY:再帰的ドロップダウン

3つのDropDownをさらに開くようにしたいのですが、そのうちの1つをクリックすると、3つのボタンが表示され、いずれの場合でも、ボタンが表示されます。あなたが2回目のドロップダウンをクリックすると、子ウィジェットが隠されます。

私はドロップダウンリストを作成するには、この方法を使用しています:

の.py:

from kivy.app import App 
from kivy.uix.dropdown import DropDown 
from kivy.uix.screenmanager import ScreenManager, Screen 
from kivy.lang import Builder 
from kivy.properties import StringProperty 


class MyScreenManager(ScreenManager): 
    button_text = StringProperty('Show possibilities') 

    def __init__(self, **kwargs): 
     super(MyScreenManager, self).__init__(**kwargs) 
     self.dropdown = CustomDropDown(self) 

    def open_drop_down(self, widget):    
     self.dropdown.open(widget) 

class MyScreen(Screen): 
    def __init__(self, **kwargs): 
     super(MyScreen, self).__init__(**kwargs) 

class CustomDropDown(DropDown): 
    def __init__(self, screen_manager, **kwargs): 
     super(CustomDropDown, self).__init__(**kwargs) 
     self.sm = screen_manager 

    def on_select(self, data): 
     self.sm.button_text = data 

Builder.load_file("debug.kv") 

class MyAppli(App): 
    def build(self): 
     return MyScreenManager() 

if __name__ == '__main__': 
    MyAppli().run() 

が.kv:

<MyScreenManager>: 

    MyScreen: 

     AnchorLayout: 
      anchor_x: 'center' 
      anchor_y: 'top' 

      Button: 

       text: root.button_text 
       size:(200,50) 
       size_hint:(None,None) 
       on_release: root.open_drop_down(self) 

<CustomDropDown>: 
    Button: 
     text:"Item 1" 
     size:(200,50) 
     size_hint:(None,None) 
     on_release: root.select("ONE") 
    Button: 
     text:"Item 2" 
     size:(200,50) 
     size_hint:(None,None) 
     on_release: root.select(self.text) 
    Button: 
     text:"Item 3" 
     size:(200,50) 
     size_hint:(None,None) 
     on_release: root.select("THREE") 

答えて

0

は別のカスタムドロップダウンクラスを追加し、ボタンのメソッドを追加します2番目のドロップダウンを開いたり閉じたりします。 open_drop2()メソッドは、開いたり閉じたりします。カスケードビットを表示しようとして、paddingをそれぞれButtonに追加しました。同じスキームを使用して追加のカスケードを行うことができます。つまり、ボタンで開かれたCustomDropDown3クラスをCustomDropDown2に追加します。 kvファイルのdismiss_on_select: Falseは、is2Displayed属性が正しく更新されていることを確認する必要があります。

の.py:

from kivy.app import App 
from kivy.properties import StringProperty 
from kivy.uix.dropdown import DropDown 
from kivy.uix.screenmanager import ScreenManager, Screen 
from kivy.lang import Builder 


class MyScreenManager(ScreenManager): 
    button_text = StringProperty('Show possibilities') 

    def __init__(self, **kwargs): 
     super(MyScreenManager, self).__init__(**kwargs) 
     self.dropdown = CustomDropDown1(self) 

    def open_drop_down(self, widget): 
     self.dropdown.open(widget) 

class MyScreen(Screen): 
    def __init__(self, **kwargs): 
     super(MyScreen, self).__init__(**kwargs) 


class CustomDropDown1(DropDown): 
    def __init__(self, screen_manager, **kwargs): 
     super(CustomDropDown1, self).__init__(**kwargs) 
     self.sm = screen_manager 
     self.dropdown2 = CustomDropDown2(self.sm) 
     self.is2Displayed = False 

    def on_select(self, data): 
     self.sm.button_text = data 

    def open_drop2(self): 
     if not self.is2Displayed: 
      self.dropdown2.open(self) 
      self.is2Displayed = True 
     else: 
      self.dropdown2.dismiss() 
      self.is2Displayed = False 

class CustomDropDown2(DropDown): 
    def __init__(self, screen_manager, **kwargs): 
     super(CustomDropDown2, self).__init__(**kwargs) 
     self.sm = screen_manager 

    def on_select(self, data): 
     self.sm.button_text = data 

Builder.load_file("debug.kv") 

class MyAppli(App): 
    def build(self): 
     return MyScreenManager() 

if __name__ == '__main__': 
    MyAppli().run() 

.kv:

<MyScreenManager>: 
    MyScreen: 
     FloatLayout: 
      Button: 
       text: root.button_text 
       size: (200, 50) 
       size_hint:(None,None) 
       pos_hint: {'center_x': 0.5, 'top': 1.0} 
       on_release: root.open_drop_down(self) 

<CustomDropDown1>: 
    padding: [0,0,0,0] 
    Button: 
     text:"Item 1" 
     size:(200,50) 
     size_hint:(None,None) 
     text_size: self.size 
     valign: 'center' 
     padding: (10,0) 
     on_release: root.select(self.text) 
    Button: 
     text:"Item 2" 
     size:(200,50) 
     size_hint:(None,None) 
     text_size: self.size 
     valign: 'center' 
     padding: (10,0) 
     on_release: root.open_drop2() 
    Button: 
     text:"Item 3" 
     size:(200,50) 
     size_hint:(None,None) 
     text_size: self.size 
     valign: 'center' 
     padding: (10,0) 
     on_release: root.select(self.text) 

<CustomDropDown2>: 
    dismiss_on_select: False 
    Button: 
     text:"Item 1,2" 
     size:(200,50) 
     size_hint:(None,None) 
     text_size: self.size 
     valign: 'center' 
     padding: (50,0) 
     on_release: root.select(self.text) 
    Button: 
     text:"Item 2,2" 
     size:(200,50) 
     size_hint:(None,None) 
     text_size: self.size 
     valign: 'center' 
     padding: (50,0) 
     on_release: root.select(self.text) 
    Button: 
     text:"Item 3,2" 
     size:(200,50) 
     size_hint:(None,None) 
     text_size: self.size 
     valign: 'center' 
     padding: (50,0) 
     on_release: root.select(self.text) 
+0

はどうもありがとうございました。コードを実行してアイテム2をクリックすると、2番目のドロップダウンがアイテム3の下に表示されます。 2番目のドロップダウンを親(項目2)の下に表示させ、項目3を押し下げることは可能ですか? –

+0

私はDropDownを使ってそれが可能だとは思わない。 DropDownは、GridLayoutの非常にシンプルなサブクラスであり、多くの装飾がありません。より好きなことをしたい場合は、DropDownの使用を排除して、Pythonコードでメイン画面からボタンを追加/削除するだけです。 –