1

我有一个 Python/Cocos 应用程序,它(除其他外)通过总线接收事件并在屏幕上显示相关信息。

我有一个cocos.text.Label显示来自远程传感器的值。当我尝试通过设置标签来使用新值更新此标签时,element.text我遇到了分段错误。

在实际代码中,其他东西使用这个值没有任何问题,所以我相信这是一个问题cocos.text.Label,但是分段错误仅在总线触发更新而不是按键事件或类似事件时发生。

下面是一个展示相同行为的最小示例:

#!/usr/bin/python

import cocos
import functools
import pyglet
import remotes # Proprietary library for getting events through a remote event bus

class TestLayer(cocos.layer.Layer, pyglet.event.EventDispatcher):
    is_event_handler = True

def __init__(self):
    super(TestLayer, self).__init__()

    self.bus = remotes.RemoteEventBus()

    widget = remotes.RemoteWidget("force", self.bus, None)
    widget.set_on_value_listener(functools.partial(self.on_value_change))

    self.label_value = 0.0
    self.label = cocos.text.Label(text=str(self.label_value))
    self.add(self.label)

def on_value_change(self, event):
    # Normalised_value will be between 0.0 and ~1.1
    self.update_label(int(event.normalized_value * 100))

def on_key_press(self, key, modifiers):
    self.update_label(key)

def update_label(self, value):
    self.label_value = value
    ### Segfault here (sometimes
    self.label.element.text = str(self.label_value)


if __name__ == "__main__":
    cocos.director.director.init(width=320, height=240, caption="Segfault Test",  fullscreen=False)

    test_layer = TestLayer()
    main_scene = cocos.scene.Scene(test_layer)

    cocos.director.director.run(main_scene)

看起来传递给标签的值会影响它是否存在段错误,但我不知道为什么。什么可能导致这种行为?

为使用专有库道歉,我正在努力在没有它的情况下重现这个问题,但到目前为止还没有运气。

4

0 回答 0