我正在尝试创建一个输出随机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
if name == '__main__':
Main().run()
这是.kv文件:
Container:
:
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
问题是你在不同的地方画了几次,恰好在函数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
if name == '__main__':
Main().run()
:
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
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。