pyqt: длинный процесс в диалоге открытия файла - PullRequest
0 голосов
/ 30 сентября 2011

У меня мало опыта в программировании GUI, но я пишу приложение GUI с PyQt.С помощью этого приложения пользователь может открыть двоичный файл и выполнить его редактирование.

Когда файл открыт, я выполняю некоторую обработку, которая занимает некоторое время (~ 15 с).Поэтому, когда пользователь выбирает файл и нажимает кнопку «Открыть» в диалоговом окне открытия файла, графический интерфейс останавливается.Каков наилучший способ улучшить взаимодействие с пользователем?

Спасибо

Ответы [ 3 ]

2 голосов
/ 30 сентября 2011

Загрузка в фоновом режиме, показывающая прогресс через датчик в строке состояния.

Для этого вы можете начать загрузку, используя QThread. Ваш класс потока может выглядеть следующим образом (при условии, что parent будет иметь атрибут progress):

QtFileLoader(QtCore.QThread):
    def __init__(self,parent=None, filepath=None):
        QtCore.QThread.__init__(self,parent)
        self.data = None
        self.filepath = filepath

    def run(self):
        """ load data in parts and update the progess par """
        chunksize = 1000
        filesize = ... # TODO: get length of file
        n_parts = int(filesize/chunksize) + 1
        with open(self.filepath, 'rb') as f:
            for i in range(n_parts):
                self.data += f.read(chunksize)
                self.parent.progress = i 

Здесь обсуждается вопрос: использовать QThread или trheading.Thread

edit (согласно намёку @Nathan): На parent функция таймера должна проверять, скажем каждые 100 мс, значение self.parent.progress и соответственно устанавливать индикатор выполнения. Таким образом, индикатор выполнения устанавливается из основного потока графического интерфейса.

2 голосов
/ 30 сентября 2011

Вам необходимо периодически запрашивать приложение для обработки событий, ожидающих в очереди событий. Это можно сделать, вызвав метод processEvents () экземпляра QApplication. Если вы можете чередовать свои вычисления с вызовами processEvents (), графический интерфейс и индикаторы выполнения обновятся сами. Обратите внимание, что не - это то же самое, что сделать графический интерфейс отзывчивым.

Чтобы сделать графический интерфейс отзывчивым при выполнении нагрузки, вам нужно разделить операцию загрузки в фоновый поток. Вы не можете выполнять операции GUI из фонового потока, хотя фоновый поток может излучать сигналы, которые пересекают границы потока. Вот статья о многопоточном программировании PyQt.

1 голос
/ 30 сентября 2011

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

Основные структуры графического интерфейса, такие как wxpython и pyQt, имеют методы для запуска долго работающих приложений без зависания графического интерфейса. Лично я предпочитаю использовать непосредственно модуль потока Python

...