大家好我不能从这个函数中获取变量值,但是如果它在类的外面,那么我可以得到值但是如果它在函数中我无法获得值
我的main.py
class ExampleApp(App):
def build(self,App):
self.load_kv("exapmleapp.kv")
def my_any():
w="THIS IS STRING"
if __name__ == "__main__":
ExampleApp().run()
这是我的kv档案
Label:
text:app.w
我想要的只是具有存储在w变量
中的文本的标签提前致谢
这是我得到的错误
Traceback (most recent call last):
File "test.py", line 67, in <module>
ExampleApp().run()
File "/usr/local/lib/python2.7/dist-packages/kivy/app.py", line 797, in run
self.load_kv(filename=self.kv_file)
File "/usr/local/lib/python2.7/dist-packages/kivy/app.py", line 594, in load_kv
root = Builder.load_file(rfilename)
File "/usr/local/lib/python2.7/dist-packages/kivy/lang.py", line 1749, in load_file
return self.load_string(data, **kwargs)
File "/usr/local/lib/python2.7/dist-packages/kivy/lang.py", line 1828, in load_string
self._apply_rule(widget, parser.root, parser.root)
File "/usr/local/lib/python2.7/dist-packages/kivy/lang.py", line 2018, in _apply_rule
e), cause=tb)
kivy.lang.BuilderException: Parser: File "./exampleapp.kv", line 3:
...
1:
2:Label:
>> 3: text:app.w
...
BuilderException: Parser: File "./exampleapp.kv", line 3:
...
1:
2:Label:
>> 3: text:app.w
...
AttributeError: 'ExampleApp' object has no attribute 'w'
File "/usr/local/lib/python2.7/dist-packages/kivy/lang.py", line 1649, in create_handler
return eval(value, idmap)
File "./exampleapp.kv", line 3, in <module>
text:app.w
File "/usr/local/lib/python2.7/dist-packages/kivy/lang.py", line 858, in __getattribute__
return getattr(object.__getattribute__(self, '_obj'), name)
File "/usr/local/lib/python2.7/dist-packages/kivy/lang.py", line 2011, in _apply_rule
value, rule, rctx['ids'])
File "/usr/local/lib/python2.7/dist-packages/kivy/lang.py", line 1654, in create_handler
cause=tb)
答案 0 :(得分:2)
我认为您的问题可以通过几种不同的方式解决。
选择何种方式取决于您希望功能存在的位置。
以下是使用py3在我的计算机上运行的答案。
from kivy.app import App
from kivy.lang import Builder
from kivy.uix.boxlayout import BoxLayout
mykv = Builder.load_string("""
<MyLabels>:
Label:
text: root.my_any()
Label:
text: '2'
""")
class MyLabels(BoxLayout):
def my_any(self):
print('in my_any')
w = 'this is a string'
return w
class ExampleApp(App):
def build(self):
return MyLabels()
if __name__ == '__main__':
ExampleApp().run()
我添加了一个额外的&#34;根窗口&#34;拿着小部件,这应该让它更容易理解一种也可以扩展的方式(kv-file root现在有&lt;括号&gt;而python得到了另一个关心根窗口的类)
值得记住的是,应用程序是一个应用程序,即它不是小部件集的一部分,可能更容易将功能和属性附加到。 另一种方法是使用stringproperties(通常链接到一个小部件 - 如标签/按钮),文档中有一些例子。
答案 1 :(得分:1)
问题在于您尝试从App类中获取值w
,而不是它。 w
仅存在于方法my_any
中。相反,您必须调用my_any
并使其返回您的字符串值。
class ExampleApp(App):
def build(self,App):
self.load_kv("exapmleapp.kv")
def my_any():
w="THIS IS STRING"
return w # it has to return something for it to be accessible outside of the function
if __name__ == "__main__":
ExampleApp().run()
然后在kv文件中,您必须将其更改为:
Label:
text:app.my_any()
所以现在你的文本将等于函数返回的任何内容。