2016-02-09 3 views
0

Я работаю с Kivy в течение последних 3 недель, чтобы создать графический интерфейс для симулятора радио с двумя радиостанциями, каждый с 16-кнопочной клавиатурой, многопозиционной ручкой и дисплеем данных.Kivy: метод класса A влияет на свойство объекта класса B?

Как я могу ссылаться на объекты в моем .kv-файле, чтобы воздействовать на них методами, объявленными другим объектом в файле .py? Я могу использовать self, чтобы объект делал что-то для себя, но я не могу понять, как сделать метод одного объекта влияющим на другой объект.

В .kv ниже, я могу использовать on_press(), чтобы кнопка изменила свойство текста другого объекта. Однако я слишком отступы, чтобы добавить условное действие, например: if knob8.index == 0, затем radio_output.text = radio_output.text + '0'. По-видимому, я должен использовать свои собственные методы, но я не понимаю, как ссылаться или воздействовать на другие объекты через них.

Объект ScreenManager - это мой корень и содержит 3 объекта экрана. ScreenTwo - это то место, где я сейчас работаю. Я хочу использовать метод change_image()Knob_8_Pos, чтобы изменить значение любого свойства кнопки в .kv-файле ниже. Возможность сделать это откроет двери для гораздо большей функциональности, потому что положение ручки определяет, что могут делать несколько кнопок и когда.

Я попытался использовать ids [] в методе, но не удалось. Я надеялся использовать что-то вроде parent, чтобы ссылаться на объект на один уровень выше в иерархии от объекта, вызывающего функцию, но это не вариант.

<ScreenTwo>: 
    FloatLayout: 
     id: screentwo_layout 

    DisplayLabel: 
     id: radio_output 
     text: 'Buttons and stuff change this field' 

    Button: 
     id: button_0 
     text: "but_0" 
     size_hint: 0.06,0.1 
     pos_hint: {'center_x':0.2, 'center_y':0.47} 
     on_press: 
      radio_output.text = radio_output.text + '0' 
      print(radio_output.text) 
     background_normal: 'Images/normal.png' 
     background_down: 'Images/down.png' 
     border: 20,20,20,20 

    Knob_8_Pos: 
     id: knob8 
     size_hint: 0.19,0.35 
     pos_hint: {'center_x':0.725, 'center_y':0.38} 
     on_press: 
      self.change_image(self) 

Метод change_image() в моем файле main.py, некоторые из которых следует. Я играл с последней строкой метода, но несуществующие атрибуты или неопределенные глобальные переменные и другие вещи продолжают сбой программы. Я попытался сделать класс Radio из виджета, чтобы провести FloatLayout с кнопками, ручкой и дисплеем, так как я думал, что это облегчит ссылку на объект, но до сих пор это был полный провал.

class Knob_8_Pos(Button): 
    knob_index = BoundedNumericProperty(0, min=0, max=7, errorvalue=0) 
    knob_pict = ListProperty(['knob_0.png','knob_1.png','knob_2.png',...]) 

    def __init__(self, **kwargs): 
     super(Knob_8_Pos, self).__init__(**kwargs) 
     self.background_normal = 'Images/knob_0.png' 

    def change_image(self, touch): 
     self.knob_index += 1 
     self.background_normal = self.knob_pict[self.knob_index] 
     self.background_down = 'Images/knob_down.png' 
     if self.knob_index == 0: 
      print('Knob_index is zero.') 
      self.ids[button_0].text = 'Changed' 

ответ

1

Почему бы не отправить button0 в класс change_image?

Knob_8_Pos: 
    id: knob8 
    size_hint: 0.19,0.35 
    pos_hint: {'center_x':0.725, 'center_y':0.38} 
    on_press: 
     self.change_image(button_0) 

И изменить его текст, как этот

def change_image(self, button0): # <---- 
    self.knob_index += 1 
    self.background_normal = self.knob_pict[self.knob_index] 
    self.background_down = 'Images/knob_down.png' 
    if self.knob_index == 0: 
     print('Knob_index is zero.') 
     button0.text = 'Changed' #<----