реализация объекта типа счетчика в классе как подпроцесс - PullRequest
2 голосов
/ 29 ноября 2011

Я абсолютный новичок и только начал посещать занятия сегодня, и я пытаюсь сделать что-то вроде «вращающегося» объекта, который я могу назвать примерно так: Одна из вещей, которые меня смущают, - использовать ли «нить», «многопоточность» или «процессы». Я только что где-то читал, что экземпляр потока стоит 8 мг, так как это простая текстовая вещь, он не гарантирует использование огромного количества памяти. Мой первый вопрос - какой модуль мне использовать, а второй - как реализовать это в классе, чтобы я мог назвать его так:

spin.start() - starts it

spin.stop() -  stops it

spin.cursor_invisible() - turns the cursor invisible

spin.cursor_visible() - cursor visible!

Я скопировал некоторый код и прочитал некоторые книги, но я немного смущен, что у меня до сих пор таково: я добавил несколько комментариев, чтобы показать, насколько я невежественен. Честно говоря, я много читаю! Это своего рода большая вещь, чтобы получить вашу голову вокруг.

spinner="▏▎▍▌▋▊▉█▉▊▌▍▎" #utf8

#convert the utf8 spinner string to a list
chars=[c.encode("utf-8") for c in unicode(spinner,"utf-8")]

class spin():   # not sure what to put in the brackets was (threading.Thread, but now im not sure whether to use processes or not)

    def __init__(self):
            super(spin, self).__init__() # dont understand what this does
            self._stop = threading.Event()

    def run (self):
            threading.Thread(target = self).run()
            pos=0
            while not self._stop:
                    sys.stdout.write("\r"+chars[pos])
                    sys.stdout.flush()
                    time.sleep(.15)
                    pos+=1
                    pos%=len(chars)

    def cursor_visible(self):
            os.system("tput cvvis")
    def cursor_invisible(self):
            os.system("tput civis")
    def stop(self):
            self._stop.set() #the underscore makes this a private variable ?
    def stopped(self):
            return self._stop.isSet()

1 Ответ

2 голосов
/ 29 ноября 2011

Я немного изменил ваш код. Теперь это работает! Сначала прокомментированная версия:

Первая строка сообщает Python, что этот исходный файл содержит символы utf-8

# -*- coding: utf-8 -*- 

Затем вам нужно импортировать все, что вы в конечном итоге будете использовать. Вам не нужно делать это в начале файла, как это, но я парень C, и мне это нравится ...

import threading
import sys
import time
import os

spinner="▏▎▍▌▋▊▉█▉▊▌▍▎" #utf8

#convert the utf8 spinner string to a list
chars=[c.encode("utf-8") for c in unicode(spinner,"utf-8")]

class spin(threading.Thread):   # not sure what to put in the brackets was (threading.Thread, but now im not sure whether to use processes or not)

Threading отлично подходит для этого

    def __init__(self):
        super(spin,self).__init__() # dont understand what this does

Поскольку вы переопределяете метод многопоточности init . В связи с вашим собственным init вам нужно вызвать init родительского класса, чтобы убедиться, что объект правильно инициализирован.

        self._stop = False

Я изменил это на логическое значение. Поток. Для этого события излишни.

    def run (self):
        pos=0
        while not self._stop:
            sys.stdout.write("\r"+chars[pos])
            sys.stdout.flush()
            time.sleep(.15)
            pos+=1
            pos%=len(chars)

    def cursor_visible(self):
        os.system("tput cvvis")
    def cursor_invisible(self):
        os.system("tput civis")
    def stop(self):
        self._stop = True  #the underscore makes this a private variable ?

В некотором роде. Это на самом деле не личное, подчеркивание просто говорит всем, что это плохая форма доступа к нему.

    def stopped(self):
        return self._stop == True

И, наконец, небольшой тест кода:

if __name__ == "__main__":
    s = spin()
    s.cursor_invisible()
    s.start()
    a = raw_input("")
    s.stop()
    s.cursor_visible()

А вот и некомментированная версия ...

# -*- coding: utf-8 -*- 

import threading
import sys
import time
import os

spinner="▏▎▍▌▋▊▉█▉▊▌▍▎" #utf8

#convert the utf8 spinner string to a list
chars=[c.encode("utf-8") for c in unicode(spinner,"utf-8")]

class spin(threading.Thread):   # not sure what to put in the brackets was (threading.Thread, but now im not sure whether to use processes or not)

    def __init__(self):
        super(spin,self).__init__() # dont understand what this does
        self._stop = False

    def run (self):
        pos=0
        while not self._stop:
            sys.stdout.write("\r"+chars[pos])
            sys.stdout.flush()
            time.sleep(.15)
            pos+=1
            pos%=len(chars)

    def cursor_visible(self):
        os.system("tput cvvis")
    def cursor_invisible(self):
        os.system("tput civis")
    def stop(self):
        self._stop = True  #the underscore makes this a private variable ?
    def stopped(self):
        return self._stop == True


if __name__ == "__main__":
    s = spin()
    s.cursor_invisible()
    s.start()
    a = raw_input("")
    s.stop()
    s.cursor_visible()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...