在下面的文件中将“MyKivyRoot”设置为我的根小部件时,我错过了哪些步骤?
我的印象是.kv文件中的顶部/最左侧窗口小部件会自动被视为根窗口小部件。但显然我错过了一些必要的步骤。
使用“app.root.show_text()”似乎没有指向正确的位置(我得到一个“'NoneType'对象没有属性'show_text'”错误)。
但是我可以从< MyKivyRoot>阻止使用“root.show_text()”
我忘记在这做什么?
这是我的'main.py'的简化版本:
from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
class MyKivyRoot(BoxLayout):
def show_text(self):
return "Here is your text"
class NewClass(BoxLayout):
pass
class MyKivyApp(App):
pass
if __name__ == '__main__':
MyKivyApp().run()
这是'MyKivy.kv'
MyKivyRoot:
<MyKivyRoot>:
Label:
text: root.show_text()
NewClass
<NewClass>:
Label:
text: app.root.show_text()
我一直在使用“使用Kivy创建应用程序”一书,并且书中的代码没有任何问题(我有使用PySide的经验)。但是当我尝试自己进行实验时,我立即被这个基本的(我假设的)问题困住了。据我所知,我的内容与本书中的(工作)代码完全相同,但很明显我有一些东西可以忽略。
任何帮助将不胜感激!
答案 0 :(得分:0)
您需要返回根小部件。
from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.lang import Builder
kv = '''
<MyKivyRoot>:
Label:
text: root.show_text()
NewClass
<NewClass>:
Label:
text: app.root.show_text() if app.root else ''
# The first two just define classes, they don't create instances:
MyKivyRoot:
# This does
'''
class MyKivyRoot(BoxLayout):
def show_text(self):
return "Here is your text"
class NewClass(BoxLayout):
pass
class MyKivyApp(App):
def build(self):
return Builder.load_string(kv)
if __name__ == '__main__':
MyKivyApp().run()