You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kivy如何将动态生成的Spinner绘制在ScrollView上层而非BoxLayout内

核心问题原因

  • 第一:你在Screen的__init__方法中操作控件时,kv文件的内容还未完成加载,此时ids为空,ObjectProperty也未完成绑定,所以无法拿到布局引用。
  • 第二:Kivy控件的绘制层级由子控件的添加顺序决定,先添加的控件层级更低、绘制在下层,后添加的控件层级更高、绘制在上层。你当前在kv中先给SecondWindow添加了包含ScrollView的BoxLayout,若要Spinner显示在上层,需要在BoxLayout加载完成后再添加Spinner。

解决步骤

步骤1:修正kv配置

去掉id的引号,给SecondWindow绑定listadespl的ObjectProperty引用:

<SecondWindow>:
    id: Ventana
    name: "cotiza"
    listadespl: Listadespl # 绑定FloatLayout引用到类的ObjectProperty
    canvas.before:
        Color:
            rgba: (148/255,193/255,255/255,1)
        RoundedRectangle:
            size: self.size
            pos: self.pos
            radius:[55]
    BoxLayout:
        orientation:'vertical'
        spacing: 10
        Spinner:
            size_hint: None, None
            size: 100, 40
            id: RUC # 去掉id两侧的引号
            text: "RUC"
            values: ['20555949457', '2058474586', '1025874658']
        ScrollView:
            do_scroll_x: False
            do_scroll_y: True
            FloatLayout: 
                id:Listadespl
                canvas.before:
                    Color:
                        rgba: (255/255, 206/255,53/255,1)
                    RoundedRectangle:
                        size: self.size
                        pos: self.pos
                        radius: [55]
                size_hint: (1, None)
                height: 2000
                orientation:'vertical'                
        Button:
            font_size: 12
            size: 50, 50 
            size_hint: 0.3, 0.3
            pos_hint: {"x":.7}
            background_color: 0,0,0,0
            text: "+"
            color: 0,0,0,1
            canvas.before:
                Color:
                    rgba: (23/255,152/255,216/255,0.71)
                RoundedRectangle:
                    size: self.size
                    radius:[20]
                    pos: self.pos
            on_press: root.pressiona(self)

步骤2:修改Python代码逻辑

  1. 在SecondWindow类中声明对应的ObjectProperty
  2. 将Spinner创建逻辑从__init__移到on_kv_post方法中(该方法会在kv加载完成后自动触发)
  3. 调整Spinner添加逻辑,保证层级高于ScrollView
class SecondWindow(Screen, FloatLayout):
    # 声明绑定用的ObjectProperty
    listadespl = ObjectProperty(None)
    conn = sqlite3.connect("inventingt.db")
    cursor = conn.cursor()
    cursor.execute("""SELECT Codigo FROM masterinv """)
    rows = cursor.fetchall()
    listcode = [str(t[0]) for t in rows] 
    childsid = ListProperty([])
    
    def __init__(self, **kwargs):
        super(SecondWindow, self).__init__(**kwargs)
        # 不要在这里操作kv相关的控件和ids,此时还未加载完成

    def on_kv_post(self, base_widget):
        super().on_kv_post(base_widget)
        # kv加载完成后再执行创建Spinner的逻辑
        Spinners = []
        s = int(input("introduce un valor"))
        for i in range(s):
            j = Spinner()
            j.size_hint = None,None
            # 直接计算每个Spinner的位置,不需要二次遍历修改
            j.pos = (20, 300 + 60 * i)
            j.background_color = [255, 255, 255, 1]
            j.text = "Prueba"
            j.color = [0, 0, 0, 1]
            j.size = (100,44)
            j.values = self.listcode
            # 直接添加到SecondWindow,此时BoxLayout已经在子控件列表中,后添加的Spinner层级更高,会显示在ScrollView上层
            self.add_widget(j)
            # 如果需要把Spinner加到ScrollView内嵌的FloatLayout中,替换上面的self.add_widget为self.listadespl.add_widget(j)即可
            Spinners.append(j)
        print(Spinners)

内容的提问来源于stack exchange,提问作者Luis R

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 22:15:02