繁体   English   中英

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

[英]How do you generate 6 colored labels in kivy based off of a list?

每个人。

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

我有两个选择。 我可以重写生成列表的 python 代码 function,以便它正确初始化标签,或者,我可以重写 kv 文件中的代码,以便我有一个网格布局,它基于保存字符串的 map_object 数组自动更新这将被转换成 map '瓷砖'。

我宁愿使用 kivy 生成生成标签并配置 UI 的样式,并将逻辑保留在 python 中,但我会采用更简单的方法。 但是,我不确定如何执行这两种方法,这就是我在这里问这个问题的原因。

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

最后一个奇怪的问题是代码目前会生成 6 个无色标签,并在右下角添加一个红色方块。 我假设这是因为我使用 python function 创建标签而没有正确初始化它们,这就是为什么我宁愿直接在 kivy 文件中创建标签并基于 object,可以更改的“map_object”按下按钮即可更改数组大小,并具有一个网格布局,该布局也将根据该数组的大小正确更新。

你有什么建议?

代码如下:

kivy-tests.py

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()
    

kv文件测试.kv

<Entry>
    orientation: 'vertical'

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

您可以在kv中为Label使用规则,为Labels使用 colors 的字典:

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字符串。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM