我的Kivy程序在左下角出现了一个随机的白色方块-问答-阿里云开发者社区-阿里云

开发者社区> 问答> 正文

我的Kivy程序在左下角出现了一个随机的白色方块

一码平川MACHEL 2019-01-16 16:36:13 1762

1yVff
我正在尝试创建一个输出随机10x10黑白方块网格的程序。除了左下角有一个不需要的白色方块覆盖网格的一部分外,它主要起作用。

我甚至无法弄清楚导致这个问题的小部件。我试过从root开始打印都无济于事。

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

:

id: contain
canvas.before:
    Color:
        rgba: 0,0,0.5,1 #blue, just for the grid
    Rectangle:
        pos: self.pos
        size: self.size

:

canvas.before:
    Color:
        rgba: 1,1,1,1 #white
    Rectangle:
        pos: self.pos
        size: self.size
图形学 容器
分享到
取消 提交回答
全部回答(1)
  • 一码平川MACHEL
    2019-07-17 23:25:39

    问题是你在不同的地方画了几次,恰好在函数changeBG中,你只需要在一个地方画画并将背景颜色设置为属性,这样当这个值改变时,Label将被重新绘制。

    另一个错误是您正在创建一个不在.kv中使用的Container。

    在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()
    • .kv

    Container holds all the other layouts

    :

    id: contain
    canvas.before:
        Color:
            rgba: 0,0,0.5,1 #blue, just for the grid
        Rectangle:
            pos: self.pos
            size: self.size
    

    :

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

    I0JfQ

    0 0
人工智能
使用钉钉扫一扫加入圈子
+ 订阅

了解行业+人工智能最先进的技术和实践,参与行业+人工智能实践项目

推荐文章
相似问题
推荐课程