【问题标题】:How do you generate 6 colored labels in kivy based off of a list?如何根据列表在 kivy 中生成 6 个彩色标签?
【发布时间】:2021-01-07 02:11:25
【问题描述】:

每个人。

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

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

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

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

最后一个奇怪的问题是代码当前会生成 6 个无色标签,并且还会在右下角添加一个红色方块。我假设这是因为我使用 python 函数创建标签而没有正确初始化它们,这就是为什么我宁愿直接在 kivy 文件中创建标签并基于可以更改的对象“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()
    

kvfiletests.kv

<Entry>
    orientation: 'vertical'

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

【问题讨论】:

    标签: python python-3.x user-interface kivy kivy-language


    【解决方案1】:

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

    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))创建了一个红色RectangleRectangle 的大小和位置不会在 python 中更新,除非您编写代码来进行更新。使用kv 提供自动更新。

    【讨论】:

    • 您的回答/回答不仅完美,而且您的回答比我预期的要快得多。非常感谢。我真的很感激!!!!
    • 有点太快了。我进行了编辑以简化对generate_tile_labels() 中的GridLayout 的访问。
    • 我将学习代码以了解更多关于 kivy 和 python 进程的信息。很高兴看到其他人如何解决我正在解决的问题。它给了我很多洞察力,我为此感谢你。谢谢,约翰!
    猜你喜欢
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 2021-03-09
    • 2021-12-17
    • 2016-08-16
    • 2022-01-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多