【问题标题】:Kivy: Make class A's method affect class B's object's property?Kivy:让A类的方法影响B类的对象属性?
【发布时间】:2016-02-09 06:31:02
【问题描述】:

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

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

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

一个 ScreenManager 对象是我的根,包含 3 个 Screen 对象。 ScreenTwo 是我现在工作的地方。我希望能够使用 Knob_8_Poschange_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'

【问题讨论】:

    标签: python-2.7 methods kivy object-reference


    【解决方案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' #<----
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-08
      相关资源
      最近更新 更多