python gtk循环ascii微调器

时间:2011-12-08 14:48:02

标签: python lambda pygtk

我正在尝试(用于测试)在gtk.main()循环期间在屏幕上打印一个小的ascii微调器对象。目前,我有这个代码每两秒打印一个点。

    gobject.timeout_add(2 * 1000,
            lambda : (sys.stdout.write('.'), sys.stdout.flush()) )
    gtk.main()

然而,我想要传统的ascii旋转器,但不能得到一个好的lambda。有什么建议吗?

编辑:两个很好的答案,但有没有办法用lambda做到这一点?只是因为lambda很酷。没什么。

2 个答案:

答案 0 :(得分:2)

为什么要限制自己lambda?要做一个微调器,最简单的是维持状态:

class Spinner(object):
  def __init__(self):
    self._chars = r"-\|/-\|/"
    self._pos = 0

  def spin(self):
    sys.stdout.write(self._chars[self._pos])
    sys.stdout.write("\r")
    sys.stdout.flush()
    self._pos += 1
    if self._pos >= len(self._chars):
      self._pos = 0
    return True

spinner = Spinner()
gobject.timeout_add(2 * 1000, spinner.spin)

注意:以上是未经测试的,但应该使一般的想法足够清楚。

答案 1 :(得分:2)

这是我刚刚在没有gtk的控制台中尝试过的事情:

import sys
from itertools import cycle
from time import sleep

spinner = r'-\|/'

sys.stdout.write('Please wait... ')

for character in cycle(spinner):
    sys.stdout.write(character)
    sys.stdout.flush()
    sys.stdout.write('\b')
    sleep(1)

我喜欢的两件事与以前的解决方案略有不同:

  • 使用\b代替\r来保留同一行中的任何消息(例如"请稍候")
  • cicle负责照顾你的下一个角色,所以你不需要费心去管理这个角色。