尝试使用python将字符串格式化为列

时间:2012-06-28 19:55:01

标签: python string label pygtk pango

我正在尝试格式化字符串以显示高分表的两列。使用print

时,Python可以很好地完成这项工作
print '{0:2d} {1:3d} {2:4d}'.format(x, x*x, x*x*x)

但是当尝试使用格式化字符串时,似乎变得更具挑战性。这是我想要得到的结果:

#for name, score in list: prints the following
1. FirstName LastName   45000
2. First LastName       78000
3. Fst Lst              11123
4. Name Name            40404
5. llll lll             12345

这是一个进入pygtk标签的字符串。目前我有这个:

score_string += "%i. %-15.12s\t%15s\n" % (index, name, score)

产生不值得信任的结果。我当前的测试数据显示如下:

1. Firstname Lastname          49900
2. First Last              93000
3. Name Name               6400

由于该列表中的第一个名称比其余名称长(宽度,不是字符数),因此该选项卡会强制该分数超出位置。有没有办法做到这一点,不仅要考虑字符串的长度,还要考虑字符串的宽度?

2 个答案:

答案 0 :(得分:2)

这样的事可以接受吗?

>>> names = ["Firstname Lastname", "First Last", "Name Name"]
>>> scores = [49900, 93000, 6400]
>>> for i,v in enumerate(zip(names, scores)):
...     name, score = v[0], v[1]
...     print "% *d. % -*s %d" % (3, i, 30, name, score)
... 
  0. Firstname Lastname             49900
  1. First Last                     93000
  2. Name Name                      6400

这里“name”字段用空格填充,最大宽度为30个字符。

编辑:我现在看到字体的宽度也是一个问题。我一开始没有意识到你的问题。我会留下这件事以防万一未来的Google员工出于不同的原因而来到这里。

答案 1 :(得分:0)

您有两种选择:

  1. 将PyGTK标签的字体更改为具有相等宽度字符的字体(在游戏中不合理,它会让我们想起旧的街机时代)。您可以使用pango.Layout的{​​{3}}。

  2. 执行此操作
  3. 使用彼此相邻的两个标签,并使用类pango.Layout的方法set_markup。第一个标签将名称对齐到左侧,第二个标签包含分数,它与右侧对齐。只要它们的空间足够,名称和分数就会分别与左右对齐。