使用LVGL的slider控件时,出现松手后异常归零的问题

Viewed 60

问题描述:使用的01 k230开发板,通过CanMV使用lvgl的slider控件时,出现了拖动滑动条松手后,异常归零复位的现象,不确定是否都存在这个问题。

期待结果:slider控件拖动到某个位置松手后,能够保持在设定位置,正常获取slider控件的value值。
实际结果:拖动滑动条松手后,异常归零复位。

软硬件版本信息:CanMV v1.3-88-g3552131(based on Micropython e00a144) on 2025-07-25; k230_canmv_01studio with K230

错误日志为了查找问题,监听了slider控件的全部事件,监听事件号、slider值、事件名称如下,在标红色处开始出现了置零问题:image.png

尝试解决过程:查询了lv_slider.c底层相关源代码,看看此处是否需要去掉标红色框的内容(或者有其他解决方案):5b95db09755c749cd3a09e22dcee1e9.png

补充材料

def user_gui_init():
    # 创建屏幕
    scr = lv.obj()

    # 创建Label控件
    label = lv.label(scr)
    label.set_text("Value: 0")
    label.align(lv.ALIGN.TOP_MID, 0, 20)

    # 创建Slider控件
    slider = lv.slider(scr)
    #slider.set_width(300)
    slider.set_size(500, 20)  # 设置尺寸
    slider.align(lv.ALIGN.CENTER, 0, 0)
    slider.set_range(0, 100)
    slider.set_value(0, lv.ANIM.OFF)

    # 定义Slider事件回调
    def slider_event_cb(event):
        code = event.get_code()
        value1 = slider.get_value()
        if code == lv.EVENT.VALUE_CHANGED:
            slider.set_value(value1, lv.ANIM.OFF)
            label.set_text("Value: %d" % value1)

    slider.add_event(slider_event_cb, lv.EVENT.VALUE_CHANGED, None)

    # 加载屏幕
    lv.scr_load(scr)
4 Answers

已经修好这个问题,有两个地方需要修改

定义Slider事件回调

def slider_event_cb(event):
    code = event.get_code()
    if code == lv.EVENT.VALUE_CHANGED:
        value1 = slider.get_value()
        #这句话需要屏蔽掉,不然会反复触发事件
        #slider.set_value(value1, lv.ANIM.OFF)
        label.set_text("Value: %d" % value1)


        class touch_screen():
def __init__(self):
    self.state = lv.INDEV_STATE.RELEASED

    self.indev_drv = lv.indev_create()
    self.indev_drv.set_type(lv.INDEV_TYPE.POINTER)
    self.indev_drv.set_read_cb(self.callback)
    self.touch = TOUCH(0)

def callback(self, driver, data):
    x, y, state = 0, 0, lv.INDEV_STATE.RELEASED
    tp = self.touch.read(1)
    if len(tp):
        x, y, event = tp[0].x, tp[0].y, tp[0].event
        if event == 2 or event == 3:
            state = lv.INDEV_STATE.PRESSED
            #这里需要放进来,因为这里需要在PRESSED的情况下发送时间
            data.point = lv.point_t({'x': x, 'y': y})
            data.state = state

你试试

牛!经测试已经完美解决了,多谢啦

请附上完整代码,谢谢

遇到了新的问题,就在以上程序基础上,使用slider.set_user_data("myData")想传递自定义参数,数字或字符串,回调函数中进行调用时,显示为Blob ,而不是传递的自定义参数,请问如何正确获取传递的自定义数据呢?谢谢!

#=============================================
def slider_event_cb(event):
    code = event.get_code()
    if code == lv.EVENT.VALUE_CHANGED:
        slider = lv.slider.__cast__(event.get_target())
        print(slider.get_user_data())#错误:提示为 Blob ,而不是传递的自定义参数

        value1 = slider.get_value()
        print("value1:",value1)

#===============================================
def user_gui_init():
    # 创建屏幕
    scr = lv.obj()

    # 创建Label控件
    label = lv.label(scr)
    label.set_text("Value: 0")
    label.align(lv.ALIGN.TOP_MID, 0, 20)

    # 创建Slider控件
    slider = lv.slider(scr)
    #slider.set_width(300)
    slider.set_size(500, 20)  # 设置尺寸
    slider.align(lv.ALIGN.CENTER, 0, 0)
    slider.set_range(0, 100)
    slider.set_value(0, lv.ANIM.OFF)
    slider.set_user_data("myData")#设置想要传递的自定义数据

    slider.add_event(slider_event_cb, lv.EVENT.VALUE_CHANGED, None)

    # 加载屏幕
    lv.scr_load(scr)

返回的是Blob的数据类型,但是要怎么转成string还没有查到
可以
mydata = slider.get_user_data()
print(type(mydata))
就不是string类

我昨晚测的就是这样的,很奇怪,根据网上查的这个函数的使用很简单,没有需要特别处理的地方呢

data_bytes = uctypes.bytes_at(blob.ptr, blob.size)

    # 解码为字符串(假设使用UTF-8编码)
    return data_bytes.decode('utf-8')

我查到的要这么转,但是报错没有ptr和size

mydata="testdata"
slider.set_user_data(mydata)

blob = slider.get_user_data()
data_bytes = uctypes.bytes_at(blob.ptr, blob.size)
print("Slider data_bytes:",data_bytes)

是的,我测试着也是错误:AttributeError: 'Blob' object has no attribute 'ptr'