Python: бесконечный цикл и графический интерфейс - PullRequest
3 голосов
/ 16 августа 2011

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

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

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

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

Ответы [ 3 ]

2 голосов
/ 16 августа 2011

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

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

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

0 голосов
/ 16 августа 2011

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

0 голосов
/ 16 августа 2011

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

Два примера:

пример 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

пример 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
...