【问题标题】:python gtk loop ascii spinnerpython gtk 循环 ascii 微调器
【发布时间】:2011-12-08 14:48:02
【问题描述】:

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

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

但是,我想要传统的 ascii 微调器,但无法为它获得一个好的 lambda。有什么建议吗?

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

【问题讨论】:

  • 限制自己只使用最棒的语言功能就像拒绝吃冰淇淋以外的任何东西。
  • @ptomato:这是一个很好的类比。老实说,限制根本不是铁铸的。我只是好奇你会如何用 lambda 来做,或者它是否有可能。好奇心害死猫。 ^_~

标签: python lambda pygtk


【解决方案1】:

为什么要将自己限制在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)

注意:以上内容未经测试,但应该使总体思路足够清晰。

【讨论】:

  • 如果要在 gtk 循环中使用,则需要将 return true 添加到 spin() 方法 - 否则,循环假定它只会被调用一次。跨度>
  • 多个 nits 选择:为什么要加倍字符?为什么“如果> = len”?使用模组,卢克! _pos % len() 做你需要的。 :D
【解决方案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 会为您处理下一个角色,因此您无需费心自己管理状态。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-10
    • 2012-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多