Отправка значения прогресса на индикатор выполнения в python - PullRequest
2 голосов
/ 13 апреля 2011

В моей игре у меня есть два модуля: island.py , который загружает острова в мою игру, а второй модуль - gui.py , который обрабатывает графические виджеты перед началом игры. Моя проблема заключается в том, как отправить значения прогресса из модуля island.py в индикатор выполнения, созданный в gui.py module EDIT: также с экземпляром экрана загрузки для доступа к индикатору выполнения в это и изменить его значение.

В модуле island.py

def __iter__(self):
        total = float(len(self.ground_map))
        import game.gui
        for i in self.get_coordinates():
            yield i
            global count
            count+=1
            progress = (count/total) * 100 
            game.gui.Gui.set_progress(progress)
        global count
        count = 0

В модуле gui.py

def show_loading_screen(self):
    self._switch_current_widget('loadingscreen', center=True, show=True) # Creates the loading screen and its associated widgets, except the progress bar.

@staticmethod
def set_progress(progress):
    # Now I have the progress values, and it will be updated automatically... how can I pass it to the progress bar widget?
    # I need to create the progress bar widget here, but to do that I need to have the self instance to give me the current screen that I will create the progress bar for **AND HERE IS THE PROBLEM!!**
    def update_loading_screen(progress):
        """updates the widget."""
        **self,current**.findChild(name="progressBar")._set_progress(progress)
    update_loading_screen(progress)

Как я могу сделать эту функцию update_loading_screen?

Ответы [ 3 ]

4 голосов
/ 21 апреля 2011

Расширяя ответ RockSport ... вот как я это сделал

class GUI:
    def __init__(self):
        GUI.self = self


    @staticmethod
    def set_progressbar():
        print "set progress bar"
        print GUI.self


g = GUI()
g.set_progressbar()
3 голосов
/ 13 апреля 2011

Я бы атаковал это немного по-другому. Я хотел бы получить pyDispatcher, с помощью которого вы можете определить, что qt называет «слотами и сигналами», или вы можете знать, что это просто «сигналы», а не ось SIGNAL. Эти сигналы, когда «испускаются» или выполняют серию или набор функций, вы прикрепили к сигналу. Слоты - это функции, которые выполняются, диспетчер ведет словарь слабых ссылок на слоты и вызывает их с аргументами, которые вы посылаете своим сигналом.

См. примеры для pydispatch , чтобы увидеть, как все это сочетается.

, но вы бы сделали что-то вроде: dispatcher.connect(reciever, signal, sender) или connect(game.gui.Gui.set_progress, 'update_progress', island.Class), тогда в __iter__ вы бы отправили сигнал типа send('update_progress', sender=island.Class, progress=progress), это вызовет update_progress с kwargs progress=progress. Таким образом, вы можете изменить прогресс обновления как статический метод и напрямую обновлять графический интерфейс.

1 голос
/ 20 апреля 2011

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

 GUI.self = self

в GUI .__ init __

Статический метод может получить доступ к GUI.self.

Для дальнейшего чтения посмотрите http://en.wikipedia.org/wiki/Singleton_pattern и http://code.activestate.com/recipes/52558-the-singleton-pattern-implemented-with-python/

...