2015-11-26 66 views
0

我想在由Kivys ScreenManager管理的第二個屏幕中生成下拉列表。如果我這樣做,我得到這個回溯:ScreenManager是否與Kivy中的DropDown兼容?

... 
File "C:/Users/ORANG/PycharmProjects/waldi/playground/cw.py", line 76, in on_text 
     instance.drop_down.open(instance) 
File "C:\Kivy-1.9.0-py2.7-win32-x64\kivy27\kivy\uix\dropdown.py", line 215, in open 
     'Cannot open a dropdown list on a hidden widget') 
    kivy.uix.dropdown.DropDownException: Cannot open a dropdown list on a hidden widget 

這是代碼,這基本上是相同此 example,只是嵌入在屏幕管理方案簡單,可以是:

from kivy.app import App 
from kivy.uix.boxlayout import BoxLayout 
from kivy.uix.dropdown import DropDown 
from kivy.uix.button import Button 
from kivy.uix.screenmanager import ScreenManager, Screen 
from kivy.uix.textinput import TextInput 
from kivy.properties import ListProperty, StringProperty 
import re 
from kivy.lang import Builder 

Builder.load_string(''' 
<Lieferant>: 
    ComboLayout: 
     Label: 
      text: 'Label' 
     ComboEdit: 
      size_hint: .5, .3 
      pos_hint: {'center':(.5, .5)} 
      # `args` is the keyword for arguments passed to `on_text` in kv language 
      on_text: self.parent.on_text(self, args[1]) 
''') 

class ComboEdit(TextInput): 
    """ 
    This class defines a Editable Combo-Box in the traditional sense 
    that shows it's options 
    """ 
    options = ListProperty(('',)) 
    ''' 
    :data:`options` defines the list of options that will be displayed when 
    touch is released from this widget. 
    ''' 

    def __init__(self, **kw): 
     ddn = self.drop_down = DropDown() 
     ddn.bind(on_select=self.on_select) 
     super(ComboEdit, self).__init__(**kw) 

    def on_options(self, instance, value): 
     ddn = self.drop_down 
     # clear old options 
     ddn.clear_widgets() 
     for option in value: 
      # create a button for each option 
      but = Button(text=option, 
         size_hint_y=None, 
         height='36sp', 
         # and make sure the press of the button calls select 
         # will results in calling `self.on_select` 
         on_release=lambda btn: ddn.select(btn.text)) 
      ddn.add_widget(but) 

    def on_select(self, instance, value): 
     # on selection of Drop down Item... do what you want here 
     # update text of selection to the edit box 
     self.text = value 

class ComboLayout(BoxLayout): 
    rtsstr = StringProperty("".join(("Substrate1,,,Substrate1,,,Substrate1,,,", 
            "Substrate1,,,Substrate1,,,Substrate_coating", 
            ",,,silicon,,,silicon_Substrate,,,substrate_", 
            "silicon,,,"))) 
    def on_text(self, instance, value): 
     if value == '': 
      instance.options = [] 
     else: 
      match = re.findall("(?<=,{3})(?:(?!,{3}).)*?%s.*?(?=,{3})" % value, \ 
           self.rtsstr, re.IGNORECASE) 
      # using a set to remove duplicates, if any. 
      instance.options = list(set(match)) 
     instance.drop_down.open(instance) 
class Intro(Screen): 
    pass 
class Lieferant(Screen): 
    pass 

class CWApp(App): 
    def build(self): 
     sm = ScreenManager() 
     sm.add_widget(Intro(name='Intro')) 
     sm.add_widget(Lieferant(name='Lieferant')) 
     return sm 

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

它可以合併它們嗎?你會如何做到這一點? 此代碼運行,如果我只是註釋此行了,它與下拉屏幕之前增加了一個畫面:

sm.add_widget(Intro(name='Intro')) 

回答

0

確定 - 對於這個問題,我拿到「風滾草Badget」 - LOL
我承認這是一個非常特別的,並且很明顯,我在這裏是一個初學者多少。所以我基於同樣的問題提出了另一個問題,並花費了一些努力使它更容易理解代碼並重現它。這已經回報了!如果您遇到過這種問題,請在此尋找解決方案:Is it a bug in Kivy? DropDown + ScreenManager not working as expected