【发布时间】: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