2013-11-07 3 views
4

Я читал учебник Kivy и не мог найти, как отключить виджет (например, кнопку).Как отключить виджет в Киви?

def foo(self, instance, *args): 
    #... main business logic, and then 
    instance.disable = False 
    # type(instance) = kivy.uix.Button 

Я связываю foo с functools.partial.

Каков правильный параметр?

ответ

10
  1. Это disabled, не disable
  2. Установите его Истинной

Пример:

from kivy.uix.button import Button 
from kivy.app import App 
from functools import partial 

class ButtonTestApp(App): 
    def foo(self, instance, *args): 
     instance.disabled = True 

    def build(self): 
     btn = Button() 
     btn.bind(on_press=partial(self.foo, btn)); 
     return btn 

if __name__ == '__main__': 
    ButtonTestApp().run() 
+0

Я добавил определение функции Foo (я, * Например, арг): печать instance.disabled instance.disabled = true' и получил _print instance.disabled AttributeError: 'Кнопка' объект имеет no attribute 'disabled'_ –

+0

Свойство 'disabled' было введено в версии 1.8.0. Если вы хотите его использовать, вам необходимо реализовать свою структуру. – Nykakin

+0

Но как? [На официальном сайте] (http://kivy.org/#download) написано, что «Текущая версия 1.7.2, выпущенная 4 августа 2013 года». Откуда у тебя новый))? –

13

Если вы используете kivy версии> = 1,8, то вы можете просто widget.disabled = Правда. Если в предыдущих версиях вы можете просто управлять отключением себя, просто убедитесь, что он не реагирует на касание и отображает альтернативный вид при отключении.

4

В следующем примере MyButton следует @ qua-non idea. Он использует BooleanProperty для изменения background_color и color. Что более важно, оно добавляет условие if self.enabled: в on_touch_down. Если нет on_touch_down, то нет on_touch_move, on_touch_up, on_press или on_release. Поэтому мы можем считать отключенным Button.

Я использую имя enabled вместо disabled, чтобы избежать возможных будущих проблем с использованием того же атрибута Kivy 1.8.0.

from kivy.app import App 
from kivy.uix.gridlayout import GridLayout 
from kivy.properties import BooleanProperty 
from kivy.uix.button import Button 
from kivy.lang import Builder 

Builder.load_string(""" 
<Example>: 
    cols: 3 
    Button: 
     text: "Disable right button" 
     on_press: my_button.enabled = False 
    Button: 
     text: "enabled right button" 
     on_press: my_button.enabled = True 
    MyButton: 
     id: my_button 
     text: "My button" 
     on_press: print "It is enabled" 
""") 

class MyButton(Button): 
    enabled = BooleanProperty(True) 

    def on_enabled(self, instance, value): 
     if value: 
      self.background_color = [1,1,1,1] 
      self.color = [1,1,1,1] 
     else: 
      self.background_color = [1,1,1,.3] 
      self.color = [1,1,1,.5] 

    def on_touch_down(self, touch): 
     if self.enabled: 
      return super(self.__class__, self).on_touch_down(touch) 

class Example(GridLayout):  
    pass 

class MyApp(App): 
    def build(self): 
     return Example() 

if __name__=="__main__": 
    MyApp().run() 
Смежные вопросы