如何将Python变量传递给Kivy?

时间:2017-11-22 17:20:51

标签: python kivy

我想获得在&ranggen'中生成的随机值在按钮中显示为文本(此时按钮显示字符串)。如何将rand_val输入.kv文件?

public class Foo
{
    [MapTo("SourceOfBar")]
    public int Bar { get; set; }
}

2 个答案:

答案 0 :(得分:1)

某些函数的参数和名称不正确,我认为它们是由于您尝试复制和删除次要部分而引起的,但请记住订单在python中很有用。

如果要将属性分配给Widget,则必须首先获取它,并且必须放置id,此id将是将创建和分配的变量的名称,我们可以访问它通过ids,如下所示:

from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.lang import Builder
from kivy.clock import Clock
import random

root = Builder.load_string('''
<Demo>:
    cols: 1
    BoxLayout:
        orientation: 'vertical'
        Button:
            id: btn
            size_hint: .2, .2
            pos_hint: {'x':0, 'center_y': .1}

''')
class Demo(BoxLayout):
    def __init__(self, *args, **kwargs):
        BoxLayout.__init__(self, *args, **kwargs)
        Clock.schedule_interval(self.randgen, 0.01)

    def randgen(self, dt):
        rand_val = random.randint(0, 10)
        self.ids.btn.text = str(rand_val)
        print(rand_val)

class MainApp(App):
    def build(self):
        return Demo()

if __name__ == '__main__':
    MainApp().run()

答案 1 :(得分:0)

有两种方法可以解决这个问题。方法1使用ObjectProperty,方法2使用StringProperty。

方法1 - 使用ObjectProperty

在此示例中,ObjectProperty用于连接按钮,因为id是窗口小部件的弱化参数。使用ObjectProperty可以创建直接引用,提供更快的访问速度并且更加明确。

main.py

from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.properties import ObjectProperty
from kivy.lang import Builder
from kivy.clock import Clock
import random

root = Builder.load_string('''
<Demo>:
    btn: btn
    orientation: 'vertical'
    Button:
        id: btn
        text: 'rand_val_here'
        size_hint: .2, .2
        pos_hint: {'x':0, 'center_y': .1}

''')


class Demo(BoxLayout):
    btn = ObjectProperty(None)

    def __init__(self, **kwargs):
        super(Demo, self).__init__(**kwargs)
        Clock.schedule_interval(self.randgen, 0.01)

    def randgen(self, dt):
        self.btn.text = str(random.randint(0, 10))


class MainApp(App):
    title = "Updating Button's Text - Using ObjectProperty"

    def build(self):
        return Demo()


if __name__ == '__main__':
    MainApp().run()

输出

Figure 1: Method 1 - Using ObjectProperty

方法2 - 使用StringProperty

在不改变原始应用程序的情况下,解决方案如下:

  1. 由于你的根小部件类,Demo是一个BoxLayout,因此kv文件中不需要属性 cols:1 ,只适用于GridLayout
  2. 声明 StringProperty
  3. 类型的 rand_val
  4. 使用 app.rand_val
  5. 填充按钮的文字

    注意: 您的应用已嵌套BoxLayout。

    main.py

    from kivy.app import App
    from kivy.uix.boxlayout import BoxLayout
    from kivy.properties import StringProperty
    from kivy.lang import Builder
    from kivy.clock import Clock
    import random
    
    root = Builder.load_string('''
    <Demo>:
        BoxLayout:
            orientation: 'vertical'
            Button:
                text: app.rand_val
                size_hint: .2, .2
                pos_hint: {'x':0, 'center_y': .1}
    
    ''')
    
    
    class Demo(BoxLayout):
        pass
    
    
    class MainApp(App):
        rand_val = StringProperty("")
    
        def build(self):
            Clock.schedule_interval(self.randgen, 0.01)
            return Demo()
    
        def randgen(self, dt):
            self.rand_val = str(random.randint(0, 10))
            print(self.rand_val)
    
    
    if __name__ == '__main__':
        MainApp().run()
    

    输出

    Figure 2: Method 2 - Using StringProperty