【问题标题】:How can I use python to display nested lists in separate lines in kv label?如何使用 python 在 kv 标签的单独行中显示嵌套列表?
【发布时间】:2015-05-22 00:12:16
【问题描述】:

我有一个列表列表,其中每个内部列表有 3 个项目(如下例所示)。

数据 = [ ["abe","abo","aba"], [“ade”,“acd”,“acr”], ["adr","adw","adz"], ["akw","aky","akz"], [“坏”,“bbf”,“btr”], [“bst”,“bsv”,“总线”] ]

在 kv 文件中,我设置了一个标签(在 ScrollView 内)以在用户按下给定按钮时显示列表中的信息。

> ScrollView:
      pos_hint_y: 'bottom'
      size_hint_y: 0.65
      id:scroll
      Label:
          id: mylabel
          text: 'Choose a letter to display the list'
          text_size: (self.width, None)
          size_hint_y: None
          height: self.texture_size[1]
          padding_x:20
          valign: ('top')
          halign: ('left')

现在(按原样)标签显示我想要的信息,但是是连续流动的。

> def btn_a(self):
    self.l = self.mylabel     # reference to mylabel in kv.file
    self.l.bind(size=lambda s, w: s.setter('text_size')(s, w))    # binding
    a_list = [x for x in self.data if x[0][0] == "a"]    # getting info starting with letter "a"
    self.l.text = str(a_list)  # setting the info inside the label

我希望信息显示如下:

abe, abo, aba
ade, acd, acr
adr, adw, adz
akw, aky, akz

我尝试使用“\n”.join(),尝试扁平化列表,使用循环和其他你会笑的解决方案......我在编程方面的经验很少,我'我想学习,但这让我睡不着觉。请帮忙!如何分隔每行 3 个项目(不带方括号,但带逗号)?

【问题讨论】:

  • @junnytony 的解决方案看起来应该以您想要的终端方式打印。如果你想知道为什么你的按钮在一行而不是新行,我没有看到你向我们展示的任何代码表明你会在任何地方创建一个新行。
  • 在 kv.file 中,我有一个 Button 触发 (on_press: root.btn_a()) main.py 中的 btn_a 函数。我想我应该解释一下我将@junnytony 的建议分配给: lis = "\n".join(["%s, %s, %s" % (a, b, c) for a, b, c在数据中])。然后更改以下内容:self.l.text = str(lis)。尽管我尝试了几段代码,但我没有将它们包含在问题中,因为它们不起作用。也许我应该这样做,以表明我做错了什么......对不起。
  • 我的意思是,您遇到的问题似乎与您向我们展示的代码无关...我的意思是,您似乎想制作一个 gui (在浏览器中?--再次,完全不熟悉 kv),在这种情况下,您需要通过 kv 或类似的东西为您的按钮定义行分隔。如果我正确理解您的问题,只需添加 '\n' (字符串的换行符)不一定会做任何事情。如果是网页,则需要
    标签。如果 kv 有它自己的换行语法,或者需要一个新组,那么我会查找它——就像 PySide QtGui 需要布局一样。

标签: python list nested label kivy


【解决方案1】:

假设您的数据与您指定的一样,这应该可以解决问题:

"\n".join(["%s, %s, %s" % (a, b, c) for a, b, c in data])

将生成一个列表,其中每行包含 3 个用逗号分隔的字符串。

编辑:为了完整起见,这也可以更通用地完成:

"\n".join([", ".join(entry) for entry in data])

这适用于内部列表可以是任意长度的列表或列表。

【讨论】:

  • 这很好用。如果它对其他人有帮助,我的错误是尝试使用“\n”.join(item[2]... 来定位列表中的每三个项目,这显然不起作用。
  • 我应该在这里提到,因为我的问题的目的是设置标签内的文本(而不是“打印”到控制台),我必须分配建议(在最后btn_a 函数的行),例如:lis = "\n".join(["%s, %s, %s" % (a, b, c) for a, b, c in data])。然后,将 btn_a 函数的最后一行从:self.l.text = str(a_list) 更改为:self.l.text = str(lis)
【解决方案2】:

我不知道“kivy”和结果的 UI 视图方面,但只需打印所需的字符串,您可以这样做:

for triplet in data:
    print(', '.join(triplet))

如果您希望将其作为字符串而不是打印到控制台,您可以这样做:

composed_string = '\n'.join([', '.join(triplet) for triplet in data])
print(composed_string)

【讨论】:

  • 效果很好。由于我不想打印到控制台,而是在标签内设置文本,因此我按照您的建议使用了 for 循环来创建字符串(composed_string)。希望这对其他人也有帮助。
【解决方案3】:

您可以尝试以下替代版本,以便练习以不同方式操作列表:

for x in data:
    for y in x:
        print y,
    print "\n",

请注意,打印语句末尾的逗号会阻止它自己添加新行,因为它通常会这样做

或者,你可以用一种奇怪的 hackey 方式来做,尝试不打印任何内容(或空格),这将添加你需要的换行符来分隔列表列表。

for x in data:
    for y in x:
        print y,
    print 

我知道这不是最好的方法;我只是想表明总有其他方法可以解决问题。对于早期学习者来说,练习尝试寻找各种解决方案可能是一种很好的做法。了解 print 对\n 的作用以及逗号的小技巧也很好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-14
    • 2014-08-15
    • 2021-04-24
    • 2019-07-11
    • 1970-01-01
    • 1970-01-01
    • 2018-12-28
    • 1970-01-01
    相关资源
    最近更新 更多