В моей программе Kivy в левом нижнем углу отображается случайный белый квадрат - PullRequest
0 голосов
/ 16 января 2019

White Box Error Kivy

Я пытаюсь создать программу, которая выводит случайные сетки 10х10 из черно-белых квадратов. В основном это работает, за исключением того, что в левом нижнем углу есть нежелательный белый квадрат, закрывающий часть сетки.

Я даже не могу понять, какой виджет будет вызывать это. Я попытался напечатать всех детей, начиная с корня, но безрезультатно.

import random
import kivy
kivy.require("1.10.1")
from kivy.app import App
from kivy.lang import Builder
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.gridlayout import GridLayout
from kivy.uix.label import Label
from kivy.config import Config
from kivy.graphics import Color
from kivy.graphics import Rectangle


Config.set('graphics', 'width', '400')
Config.set('graphics', 'height', '400')

class Container(FloatLayout):
    pass

class ColorLabel(Label):
    def __init__(self, **kwargs):
        super(ColorLabel, self).__init__(**kwargs)

        with self.canvas:
            Color(1, 1, 1, 1)
            self.rect = Rectangle(size=self.size, pos=self.pos)

        self.bind(size=self._update_rect, pos=self._update_rect)

    def _update_rect(self, instance, value):
        self.rect.pos = instance.pos
        self.rect.size = instance.size

    def changeBG(self):
        with self.canvas.after:
            Color(0,0,0,1)
            self.rect = Rectangle(size=self.size, pos=self.pos)

class Main(App):
    def build(self):
        Builder.load_file("EveryImage.kv")
        the_grid = GridLayout(cols=10, spacing=1)

        i = 100
        while i > 0:
            i -= 1
            newLabel = ColorLabel()
            the_grid.add_widget(newLabel)
            x = random.randint(0,1)
            if x == 0:
                newLabel.changeBG()

        root = Container()
        root.add_widget(the_grid)           
        return root

# Keep everything below this last!      
if __name__ == '__main__':
    Main().run()

А вот и файл .kv:

#EveryImage.kv
Container:

#Container holds all the other layouts
<Container>:
    id: contain
    canvas.before:
        Color:
            rgba: 0,0,0.5,1 #blue, just for the grid
        Rectangle:
            pos: self.pos
            size: self.size

<ColorLabel>:
    canvas.before:
        Color:
            rgba: 1,1,1,1 #white
        Rectangle:
            pos: self.pos
            size: self.size

1 Ответ

0 голосов
/ 16 января 2019

Проблема в том, что вы рисуете несколько раз в разных местах, именно в функции changeBG, вместо этого вам просто нужно рисовать в одном месте и установить цвет фона в качестве свойства, чтобы при изменении этого значения метка была перекрашена.

Другая ошибка заключается в том, что вы создаете контейнер, который вы не используете в .kv.

В случае цикла while это можно упростить с помощью цикла for.

*. Py

import random

import kivy
kivy.require("1.10.1")
from kivy.app import App
from kivy.lang import Builder
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.gridlayout import GridLayout
from kivy.uix.label import Label
from kivy.config import Config

Config.set('graphics', 'width', '400')
Config.set('graphics', 'height', '400')

class Container(FloatLayout):
    pass

class ColorLabel(Label):
    pass

class Main(App):
    def build(self):
        Builder.load_file("EveryImage.kv")
        the_grid = GridLayout(cols=10, spacing=1)
        for _ in range(100):
            newLabel = ColorLabel()
            the_grid.add_widget(newLabel)
            if random.choice([True, False]):
                newLabel.bg_color = [0,0,0,1]
        root = Container()
        root.add_widget(the_grid)           
        return root

# Keep everything below this last!      
if __name__ == '__main__':
    Main().run()

*. Кв

#Container holds all the other layouts
<Container>:
    id: contain
    canvas.before:
        Color:
            rgba: 0,0,0.5,1 #blue, just for the grid
        Rectangle:
            pos: self.pos
            size: self.size

<ColorLabel>:
    bg_color: 1, 1, 1, 1
    canvas.before:
        Color:
            rgba: self.bg_color # white
        Rectangle:
            pos: self.pos
            size: self.size

enter image description here

...