从python main.py函数获取变量值到.kv文件

时间:2015-07-13 05:59:49

标签: python kivy

大家好我不能从这个函数中获取变量值,但是如果它在类的外面,那么我可以得到值但是如果它在函数中我无法获得值

我的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)

2 个答案:

答案 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()

所以现在你的文本将等于函数返回的任何内容。