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代码逻辑
- 在SecondWindow类中声明对应的ObjectProperty
- 将Spinner创建逻辑从
__init__移到on_kv_post方法中(该方法会在kv加载完成后自动触发) - 调整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
相关产品推荐
相关产品推荐

