开发者社区> 问答> 正文

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

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

展开
收起
一码平川MACHEL 2019-01-16 16:36:13 3205 0
1 条回答
写回答
取消 提交回答
  • 问题是你在不同的地方画了几次,恰好在函数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

    2019-07-17 23:25:39
    赞同 展开评论 打赏
问答分类:
问答地址:
相关产品:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载