StringProperty 结构和类 Kivy

Posted

技术标签:

【中文标题】StringProperty 结构和类 Kivy【英文标题】:StringProperty Struct and Class Kivy 【发布时间】:2019-02-14 00:16:37 【问题描述】:

我的 python 代码遇到了一些问题。我是新手,因此甚至不知道问题可能出在哪里... 我正在使用 kivy 并希望在结构中发送一些数据,这仅适用于不在结构中的单个变量位:

class Counter_Timer(FloatLayout):
    for ii in range(len(client)):
        val[ii] = StringProperty() #becomes global variable
    val0 = StringProperty()        #stays local variable
    val1 = StringProperty()

    def update(self, dt):
        for ii in range(len(client)):
            result[ii]=readVal(client[ii])
        percVal = calcPerc(result)

        self.val0 = str(":10.1f".format(percVal[0])+'%') #works
        self.val1 = str(":10.1f".format(percVal[1])+'%') #works
        self.val[0] = self.val0                            #doesn't work

说实话,我什至不知道为什么我需要将 StringProperty() 分配给 val0 和 val1 用于 kivy,但它确实有效。但它不适用于我上面的 for 循环以及最后一行代码中的赋值。也许有人可以帮助我!

【问题讨论】:

valList 实例?它是在哪里定义的? 【参考方案1】:

问题 1

val0 = StringProperty()        #stays local variable
val1 = StringProperty()

为什么我需要将 StringProperty() 分配给 val0 和 val1?

回答

您不必将 StringProperty() 分配给 val0 和 val1。

问题 2

self.val[0] = self.val0                            #doesn't work

回答

由于val 是一个Python 列表并声明为全局,因此您不要将其引用为self.val。关键字self 引用“当前小部件实例”。 Kivy 将查找在 Counter_Timer 的类级别定义或在其任何方法中定义/初始化的属性 val

self.val[0] 替换为val[0]

示例

main.py

​​>
from kivy.app import App
from kivy.uix.floatlayout import FloatLayout
from kivy.properties import StringProperty, ListProperty
from kivy.clock import Clock

val = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]


class Counter_Timer(FloatLayout):

    for ii in range(10):
        val[ii] = StringProperty()  # becomes global variable
        print("\tva[0]=1".format(ii, val[ii]))

    val = ListProperty([0, 0, 0, 0, 0, 0, 0, 0, 0, 0])

    def __init__(self, **kwargs):
        super(Counter_Timer, self).__init__(**kwargs)
        print("\ninit:")
        Clock.schedule_once(self.update, 1)

    def update(self, dt):
        print("\nupdate:")
        print("\tglobal variable - val:", val)
        print("\tlocal variable - self.val:", self.val)

        self.val0 = str(":10.1f".format(88.8)+'%') #works
        self.val1 = str(":10.1f".format(50.0)+'%') #works
        val[0] = self.val0
        self.val[0] = self.val0

        print("\tself.val0=0, self.val1=1".format(self.val0, self.val1))
        print("\tglobal variable - val:", val)
        print("\tlocal variable - self.val:", self.val)


class Test(App):

    def build(self):
        print("\nbuild:")
        return Counter_Timer()


if __name__ == "__main__":
    Test().run()

输出

【讨论】:

以上是关于StringProperty 结构和类 Kivy的主要内容,如果未能解决你的问题,请参考以下文章

GQL 查询未返回 StringProperty 查询平等性测试的结果

带有自定义控件和自定义 StringProperty 的 Proguard

如何使用 kivy StringProperty?

Swift 结构体和类的区别

结构体和类的区别,联系

.NET 中的结构和类有啥区别?