【发布时间】: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_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'
【问题讨论】:
标签: python-2.7 methods kivy object-reference