Kivy:让A类方法影响B类对象的属性?

时间:2016-02-09 06:31:03

标签: python-2.7 methods kivy object-reference

过去3周,我一直与Kivy合作,为带有两个无线电的无线电模拟器构建GUI,每个无线电都有一个16键按键,多位置旋钮和数据显示。

如何引用.kv文件中的对象以使用.py文件中不同对象声明的方法对其进行操作?我可以使用 self 来让一个对象自己做事,但我无法弄清楚如何让一个对象的方法影响另一个对象。

在下面的.kv中,我可以使用 on_press()来创建一个按钮来更改另一个对象的text属性。但是,我太过于缩进以添加条件操作,例如:if knob8.index == 0,则radio_output.text = radio_output.text +' 0'。显然我必须使用自己的方法,但我不了解如何通过它们引用或影响其他对象。

ScreenManager对象是我的根,包含3个Screen对象。 ScreenTwo是我现在工作的地方。我希望能够使用 Knob_8_Pos change_image()方法来更改.kv文件中 Button 的任何属性的值下面。能够这样做将打开更多功能的大门,因为旋钮的位置决定了多个按钮可以做什么以及何时做什么。

我尝试在方法中使用 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文件中,其中一些如下。我一直在玩该方法的最后一行,但不存在的属性或未定义的全局变量和其他东西一直在使程序崩溃。我尝试从Widget创建一个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 个答案:

答案 0 :(得分: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' #<----