Макет страницы Kivy покрывает одну страницу другой, чтобы предотвратить перекрытие

В Kivy я пытаюсь покрыть первую страницу другой после того, как натяну вторую страницу на первую страницу. На данный момент происходит наложение слов из списка, потому что страницы кажутся прозрачными и вторая страница не закрывает первую. Я пытался изменить цвет фона виджета, но безрезультатно, даже пытался добавить фоновое изображение на каком-то этапе. Пожалуйста, помогите, это заняло достаточно моего времени. Я был бы признателен за решение на чистом питоне вместо языка kv, если это возможно. Пример:

from kivy.app import App
from kivy.lang import Builder
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.pagelayout import PageLayout
from kivy.uix.button import Button
from kivy.uix.label import Label
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.core.window import Window
from kivy.graphics import Color, Rectangle

# Window.clearcolor = (252, 235, 233, 0)

class MyScreenManager(ScreenManager):
    pass

class PageLayoutScreen(Screen):
    pass

class PageLayout1(PageLayout):
    def __init__(self, **kwargs):
        super(PageLayout1, self).__init__(**kwargs)

        myList = ['hello there', 'hello to you too']
        t = 0
        for i in myList:
            nameWdgt = Label(text="[b]" + myList[t] + "[/b]", markup=True, font_size='15sp')
            locationWdgt = Label(text="[b]" + myList[t] + "[/b]", markup=True, font_size='15sp')
            self.add_widget(nameWdgt)
            self.add_widget(locationWdgt)

            # below is my attempt to cover the first item in the list "hello there" when we pull the second item in the list over it "hello to you too"
            with self.canvas.before:
                Color(0, 1, 0, 1)  # green; colors range from 0-1 instead of 0-255
                self.profile_layout = Rectangle(size=self.size, pos=self.pos)
            t += 1

root_widget = Builder.load_string('''
#:import NoTransition kivy.uix.screenmanager.NoTransition
#:import sys sys
MyScreenManager:
    transition: NoTransition()

    PageLayoutScreen:

<PageLayoutScreen>:
    name: 'test'
    PageLayout1
''')

class ScreenManagerApp(App):
    def build(self):
        return root_widget

ScreenManagerApp().run()

person Jeff    schedule 21.07.2017    source источник


Ответы (1)


Label по умолчанию прозрачен, кроме текстуры (текста), поэтому вы видите перекрытие. Ваша попытка создать фон просто нарисовала прямоугольник с размером по умолчанию. Вам нужно нарисовать фон для каждой метки, чтобы увидеть, что происходит.

edit: я не уверен, чего вы пытались добиться, используя ScreenManger и Screen, поэтому я их не учел.

Вот пример:

from kivy.app import App
from kivy.lang import Builder
from kivy.uix.pagelayout import PageLayout
from kivy.uix.label import Label
from kivy.properties import NumericProperty

Builder.load_string("""
<MyLabel>:
    font_size: "15sp"
    markup: True
    canvas.before:
        Color:
            rgba: self.bg
            rgba: [[1, 0, 0, 1], [0, 1, 0, 1], [0, 0, 1, 1], [.5, .5, .5, 1]][self.pg_index]
        Rectangle:
            size: self.size
            pos: self.pos

""")


class MyLabel(Label):
    pg_index = NumericProperty(None)


class PageLayout1(PageLayout):
    def __init__(self, *args, **kwargs):
        super(PageLayout1, self).__init__(*args, **kwargs)

        myList = ['hello there', 'hello to you too']
        pg_index = 0
        for i in myList:
            nameWdgt = MyLabel(text="[b]" + myList[0] + "[/b]", pg_index=pg_index)
            pg_index += 1

            locationWdgt = MyLabel(text="[b]" + myList[1] + "[/b]", pg_index=pg_index)

            pg_index += 1

            self.add_widget(nameWdgt)
            self.add_widget(locationWdgt)


class ScreenManagerApp(App):
    def build(self):
        return PageLayout1()


if __name__ == '__main__':
    ScreenManagerApp().run()
person Mox    schedule 22.07.2017
comment
Спасибо @Mox, ваше решение работает, но я нашел недостающую часть, используя только python с layout.canvas.add(Color(0., 1., 0)) и layout.canvas.add(Rectangle(size=(100 , 100))). Они лучше всего работают внутри ScrollView на случай, если у кого-то возникнут проблемы при их циклическом просмотре. - person Jeff; 24.07.2017