首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何根据列表在kivy中生成6个彩色标签?

如何根据列表在kivy中生成6个彩色标签?
EN

Stack Overflow用户
提问于 2020-09-21 07:20:25
回答 1查看 105关注 0票数 0

所有人。

我正在尝试利用python函数来生成基于列表中的字符串的标签。然而,据我所知,因为我正在编写在python文件中创建标签的代码,所以它并不完全按照我想要的方式工作。

我有两个选择。我可以重写生成列表的python代码函数,以便它正确地初始化标签,或者,我可以重写kv文件中的代码,这样我就有了一个基于map_object数组的自动更新的网格布局,该数组包含将被转换为地图“tiles”的字符串。

我宁愿用kivy生成生成标签和配置UI的样式,并将逻辑保留在python中,但我会做任何更容易的方法。然而,我不确定如何实现这两种方法,这就是为什么我在这里问这个问题。

此外,请记住,每个项目的颜色将基于字符串。“^”将为绿色,“_”将为棕色,而“*”将为白色。我在字典中有十六进制值,它将链接到每个单独的字符串,所以当需要生成标签的颜色时,我将使用该字典来获取它。然而,在本例中,我只是使用了一个RGBA值来简化代码。

最后一个奇怪的问题是,代码当前将生成6个无色标签,并在右下角添加一个红色方块。我假设这是因为我在没有正确初始化标签的情况下用python函数创建了标签,这就是为什么我更希望标签直接在kivy文件中创建,并基于一个对象'map_object‘,它可以通过按下按钮来改变数组的大小,并且有一个网格布局,也可以根据该数组的大小进行适当的更新。

你有什么建议?

代码如下:

kivy-tests.py

代码语言:javascript
复制
import kivy
from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.gridlayout import GridLayout
from kivy.uix.label import Label
from kivy.graphics import Color, Rectangle



class Entry(BoxLayout):
    # '^' label background color will be green
    # '*' label background color will be white
    # '_' label background color will be brown
    map_object = [['^', '*', '_'], ['*', '^', '*']]
    
    map_layout = GridLayout(cols = 3)
    
    def generate_tile_labels(self):
        # This if-else statement clears the grid of tiles
        # each time the function is called.
        if self.map_layout in self.children:
            self.map_layout.clear_widgets()
        else:
            self.add_widget(self.map_layout)
        
        for row in self.map_object:
            for tile in row:
                self.new_label = Label(text = 'Test')
                self.new_label.canvas.before.add(Color(1,0,0,1))
                self.new_label.canvas.before.add(Rectangle(pos=self.pos))
                self.map_layout.add_widget(self.new_label)

        
class kvfiletests(App):
    def build(self):
        return Entry()

if __name__ == '__main__': 
    kvfiletests().run()

kvfiletests.kv

代码语言:javascript
复制
<Entry>
    orientation: 'vertical'

    Button:
        text: 'Generate the Map'
        on_press: root.generate_tile_labels()
        
    GridLayout:
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-09-21 08:21:25

您可以对Label使用kv中的规则,对Labels使用颜色字典

代码语言:javascript
复制
from kivy.app import App
from kivy.lang import Builder
from kivy.properties import ListProperty
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.label import Label

kv = '''
<Entry>
    orientation: 'vertical'

    Button:
        text: 'Generate the Map'
        on_press: root.generate_tile_labels()
        
    GridLayout:
        id: grid
        cols: 3
        padding: 4
        spacing: 4
    
<MyLabel>:
    color: 0,0,0,1
    canvas.before:
        Color:
            rgba: self.bg_color
        Rectangle:
            pos: self.pos
            size: self.size
'''

class MyLabel(Label):
    bg_color = ListProperty([0,0,0,1])


class Entry(BoxLayout):
    # '^' label background color will be green
    # '*' label background color will be white
    # '_' label background color will be brown
    colors = {'^': [0,1,0,1], '*': [1,1,1,1], '_': [150.0/256.0, 75.0/256.0, 0, 1]}
    map_object = [['^', '*', '_'], ['*', '^', '*']]

    def generate_tile_labels(self):
        self.map_layout = self.ids.grid
        self.map_layout.clear_widgets()

        for row in self.map_object:
            for tile in row:
                self.new_label = MyLabel(text=tile, bg_color=self.colors[tile])
                self.map_layout.add_widget(self.new_label)


class kvfiletests(App):
    def build(self):
        Builder.load_string(kv)
        return Entry()


if __name__ == '__main__':
    kvfiletests().run()

为了方便起见,我使用了kv字符串。

您在左下角看到一个红色方块的原因是因为您的代码在默认大小和位置(分别为(100,100)(0,0) )创建了一个红色Rectangle。在python中,Rectangle的大小和位置不会更新,除非您编写代码进行更新。使用kv提供自动更新。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63984525

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档