Python: бесконечный цикл и графический интерфейс

Я пытаюсь написать программу на Python с графическим интерфейсом wxPython. Программа должна собирать некоторую информацию в фоновом режиме (бесконечный цикл), но в это время должен быть активен графический интерфейс. Мол, если я нажму на какую-то кнопку, то должна измениться какая-то переменная или другая информация, и в новом цикле эта переменная должна использоваться вместо старой.

Но я не знаю, как это сделать. Я думаю, что я должен использовать многопоточность, но я не понимаю, как ее использовать.

Кто-нибудь может подсказать, как решить эту проблему?

Заранее спасибо!


person Andrew    schedule 16.08.2011    source источник
comment
возможный дубликат Python/wxPython: постоянное выполнение работы в фоновом режиме   -  person miku    schedule 16.08.2011
comment
Вы правы, когда говорите, что должны использовать потоки. Графический интерфейс должен использовать один поток, а любая другая обработка должна выполняться в другом потоке. Начните с простого примера многопоточности и продвигайтесь дальше. stackoverflow.com/questions/7082529/   -  person styfle    schedule 16.08.2011


Ответы (3)


Вам обязательно нужно использовать потоки, чтобы добиться этого. Затем, когда вы получаете некоторые данные из потока без графического интерфейса, вы можете использовать один из потокобезопасных методов wxPython, чтобы сообщить ему о необходимости обновления. Вот небольшое руководство: http://www.blog.pythonlibrary.org/2010/05/22/wxpython-and-threads/

Или многолетний фаворит: http://wiki.wxpython.org/LongRunningTasks.

Другой способ сделать это - создать сервер сокетов, используя модуль сокетов Python, и таким образом общаться с wx.

person Mike Driscoll    schedule 16.08.2011

Это называется "нарезка". Используйте модуль потоковой обработки python.

Два примера:

пример 1:

from threading import Thread

class MyCollector(Thread):

    def __init__(self, collect_from):
        Thread.__init__(self) # must be called !
        self.collect_from = collect_from

    def run(self):
        while True:
            # .. collect ur things


collector_thread = MyCollector(my_source_to_collect_from)
collector_thread.start()

# go on with gui

example 2:

from threading import Thread

def collector(collect_from):
    while True:
        # .. collect ur things

collector_thread = Thread(target = collector, args = (my_source_to_collect_from,))
collector_thread.start()

# go on with gui
person Niklas R    schedule 16.08.2011

Рассматривали ли вы, чтобы wxPython периодически вызывал ваш обработчик событий и выполнял в нем фоновую обработку? Конечно, это зависит от того, сможете ли вы разделить свою работу на отдельные части. Имейте в виду, что ваша фоновая обработка должна быть неблокирующей, чтобы управление своевременно возвращалось к wxPython, чтобы обеспечить отзывчивую обработку графического интерфейса. Не уверен, каков идиоматический способ реализации такой фоновой обработки в wxPython, но, если я правильно помню, техника в (Py)Qt заключалась в использовании таймера.

person aknuds1    schedule 16.08.2011