python gtk loop ascii spinner - PullRequest
       4

python gtk loop ascii spinner

3 голосов
/ 08 декабря 2011

Я пытаюсь (для тестирования), чтобы маленький объект ascii spinner был напечатан на экране во время цикла gtk.main (). В настоящее время у меня есть этот код, который печатает точку каждые две секунды.

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

Тем не менее, я хотел бы вместо этого использовать традиционный спиннер ascii, но не могу получить хорошую лямбду для него. Есть предложения?

Редактировать : Два хороших ответа, но есть ли способ сделать это с помощью лямбды? Просто потому что лямбда крутая. Ничего больше.

Ответы [ 2 ]

2 голосов
/ 08 декабря 2011

Это то, что я только что попробовал в консоли без 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 позаботится о том, какой будет следующий символ, поэтому вы не будетенадо потрудиться управлять государством самостоятельно.
2 голосов
/ 08 декабря 2011

Почему вы ограничиваете себя 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)

Примечание: вышеизложенное не проверено, но должно дать достаточно ясную общую идею.

...