Работа функции в фоновом режиме - как? Python и PyQT - PullRequest
0 голосов
/ 22 октября 2011

У меня относительно большое приложение, написанное на Python и использующее PyQT в качестве интерфейса GUI.Все приложение в одном классе, в одном файле.

Вот пример кода:

class Application(QMainWindow):
  def __init__(self):
    super(etc...)

    self.connect(self.mainBtn, SIGNAL("clicked()"), self.do_stuff)

  def do_stuff(self):
    <checking some parameters>
    else:
      do_some_other_long_stuff()


  def do_some_other_long_stuff(self):
     500 lines of code of stuff doing

Однако, вот в чем проблема: когда я нажимаю mainBtn, все идет хорошо, за исключением зависаний типа GUI - я ничего не могу сделатьиначе, пока функция не будет выполнена (и это веб-скребок, так что это занимает довольно много времени).Когда функция do_some_other_long_stuff заканчивается, все возвращается на круги своя.Это действительно раздражает.

Есть ли способ как-то "фон" для процесса do_some_other_stuff?Я заглянул в QThreads и, похоже, это именно так, однако это потребовало бы от меня переписать практически весь код, перевести половину моей программы в другой класс и, следовательно, изменить все имена переменных (при получении переменной из GUI).класс и положить его в рабочий класс)

1 Ответ

2 голосов
/ 22 октября 2011

Дубликат Обработка графического интерфейса с различными потоками , Как отслеживать прогресс потока в Python без зависания графического интерфейса PyQt? и т. Д.

Ваша функция do_stuff () должна запустить вычислительный поток и затем вернуться. Многопоточность - это имя для выполнения нескольких операций в одном процессе - по определению, если что-то происходит «в фоновом режиме», оно выполняется в отдельном потоке. Но вам не нужно разбивать функции на разные классы для использования потоков, просто убедитесь, что вычислительные функции ничего не делают с графическим интерфейсом, и основной поток не вызывает ни одну из функций, используемых вычислительным потоком.

РЕДАКТИРОВАНИЕ 10/23: Вот глупый пример запуска потоков в одном классе - ничто в языке или библиотеке потоков не требует отдельного класса для каждого потока. В примерах, вероятно, для обработки хорошего модульного программирования используется отдельный класс для обработки.

* * 1010
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...