我在Kivy中创建了一个简单的应用程序,该应用程序具有选项卡,每个选项卡中我只有几个小部件。在添加tabbedPanel之前,我没有问题可以通过“ ids”到达每个小部件。例如:
app.root.ids.mylabel1.ids.mylabel2.content
但是,现在我已经在tabbedPanel中添加了小部件,这些小部件对我来说变得无法访问。 tabbedPanel“阻止”我并且不包含ID:例如,我的.kv文件具有一个按钮:
<SelectableButton>:
text: self.button_text
id: SelectableButton_id
canvas.before:
Color:
rgba: (0, 0.517, 0.705, 1) if self.selected else (0, 0.517, 0.705, 1)
Rectangle:
pos: self.pos
size: self.size
state: self.btnState
on_release:
print(app.root.content.ids)
返回一个空字典。我按照tabbedPanel的指导进行操作,发现它只有一个“子项”,即“ .content”。但我仍然无法在此选项卡中找到任何小部件。
我会以错误的方式处理吗?或者有人可以指导我如何访问特定选项卡中的窗口小部件。
答案 0 :(得分:0)
使用Kivy TabbedPanel,您可以使用ids
或app.root.ids.id-name
来引用self.ids.id-name
,例如app.root.ids.label3.text
或self.ids.label3.text
的原因,是因为在解析您的kv文件时,kivy会收集所有标有 id 的小部件,并将它们放在此self.ids
字典类型属性中。
from kivy.app import App
from kivy.uix.tabbedpanel import TabbedPanel
from kivy.lang import Builder
from kivy.uix.label import Label
from kivy.uix.button import Button
Builder.load_string("""
<Test>:
size_hint: .5, .5
pos_hint: {'center_x': .5, 'center_y': .5}
do_default_tab: False
TabbedPanelItem:
text: 'first tab'
Label:
text: 'First tab content area'
TabbedPanelItem:
id: tab2
text: 'tab2'
BoxLayout:
id: box1
orientation: 'vertical'
Label:
id: label1
text: 'Second tab content area'
Button:
id: button1
text: 'Button that does nothing'
BoxLayout:
id: box2
orientation: 'vertical'
Label:
id: label2
text: 'Label 2'
BoxLayout:
id: box3
orientation: 'vertical'
Button:
id: button2
text: 'Button 2'
Label:
id: label3
text: 'Label 3'
TabbedPanelItem:
text: 'tab3'
RstDocument:
text:
'\\n'.join(("Hello world", "-----------",
"You are in the third tab."))
""")
class Test(TabbedPanel):
def __init__(self, **kwargs):
super(Test, self).__init__(**kwargs)
print(f"\nself.ids.items():")
for key, val in self.ids.items():
if isinstance(val, Label) or isinstance(val, Button):
print(f"\tkey={key}, val={val}, val.text={val.text}")
else:
print(f"\n\tkey={key}, val={val}")
print(f"\nself.ids.label3.text={self.ids.label3.text}")
class TabbedPanelApp(App):
def build(self):
return Test()
if __name__ == '__main__':
TabbedPanelApp().run()