【问题标题】:Freezing screen in kivykivy冻结屏幕
【发布时间】:2020-12-26 22:42:35
【问题描述】:

我得到了 kivy 标签,我正在从另一个函数中更新其他类(不是应用程序或其他东西) 通过此代码:

App.get_running_app().root.screens[3].fingerSensorStatus = "Place Finger"

fingerSensorStatus 变量是 kv 文件中的文本

Label:
            pos_hint: {'x': 0.3 , 'y': 0.6 }
            text: root.fingerSensorStatus
            font_size: 40
            size_hint: 0.4, 0.4

这导致我的屏幕冻结并将其变为黑色。 于是我在App类中看到了这个解决方案:

class AddFingerWindow(Screen):

    namee = ObjectProperty(None)
    passwd = ObjectProperty(None)
    fingerSensorStatus = StringProperty("")
    
    
    Clock.schedule_interval(self.callback, 1)

    def callback(self):
        fingerSensorStatus = db.FsensorStatus

但我得到了

"NameError: name 'self' is not defined"

我试图解决它:

def __init__(self):
        namee = ObjectProperty(None)
        passwd = ObjectProperty(None)
        fingerSensorStatus = StringProperty("")
        Clock.schedule_interval(self.callback, 1)

但是 init() 得到了一个意外的关键字参数“名称”。

我该如何解决这个问题(我的意思是冻结屏幕)?

【问题讨论】:

    标签: python kivy


    【解决方案1】:

    属性(ObjectProperty、StringProperty、...)必须在类级别声明 - 即 在您的 __init__ 之外

    当一个类被实例化时你想要运行的 Python 代码应该在__init__ 期间声明,所以Clock.schedule_interval 在那里。

    请注意,这不是任意区别,您的 Clock 代码在类级别没有意义,因为不仅 self 没有定义,而且它没有任何有用的值 - 请记住,此代码在类时运行在任何实例存在之前解释定义。相比之下,Property 对象是 Python 描述符,必须存在于类级别,因为它们定义了每个实例的行为方式的一些细节。

    【讨论】:

    • 那么如何使用 Clock.schedule_interval 来更新相同的类属性? (fingerSensorStatus)
    • 嗯,你不明白这样做的哪一部分?你需要传递一个函数来做你想做的事情。您的代码 sn-ps 之一很接近,但 callback 需要设置 self.fingerSensorStatus 而不仅仅是 fingerSensorStatus (它只是定义了一个什么都不做的局部变量),并且还会从时钟接收一个额外的参数你可以忽略。
    猜你喜欢
    • 2015-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-06
    • 2011-12-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多