Я работаю с 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'