过去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'
答案 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' #<----