Обработка PyQt, приводящая к задержке графического интерфейса - PullRequest
0 голосов
/ 26 июля 2011

Я пишу приложение на Qt, использующее python, которое будет обрабатывать текстовый файл.Пользователь выбирает файл со своего жесткого диска, и программа открывает и обрабатывает его.Основная проблема, с которой я столкнулся, заключается в том, что когда вы запускаете ее в первый раз, это нормально;но если вы запускаете его несколько раз без перезапуска программы, каждый раз после 1-го будет занимать одно и то же точное время, но индикатор выполнения запаздывает, и иногда диалоговое окно выбора файла не исчезает, пока обработка не будет завершена.Вот код ниже.Я знаю, что отступ неправильный, он не будет правильно копироваться.Кто-нибудь может увидеть деталь, которая может вызвать задержку после 1-го пробега?

import sys,  time,  os
from PyQt4 import QtCore, QtGui
from PyQt4.QtCore import *
from PyQt4.QtGui import *

try:
    _fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
    _fromUtf8 = lambda s: s

class Ui_MainWindow(QtGui.QMainWindow):

    def updateProgress(self):
        self.progressBar.setValue(self.progressBar.value()+1)
        self.progressBar.repaint()

def processCollect(self):
    filename = None
    self.progressBar.setValue(0)

    #Get the filename from user
    try:
        filename = QtGui.QFileDialog.getOpenFileName(self,  "Open Collect",  sys.path[1] + "/",  "Text files (*.txt)")
    except IOError:
        filename == None

    if filename:
        #Find number of lines
        file = open(filename,  "r")
        linecount = 0
        for line in file:
            linecount = linecount+1
        file.close()
        print(linecount)

        #Set up progress bar
        self.progressBar.setMinimum(0)
        self.progressBar.setMaximum(linecount)
        self.progressBar.show()

        #Read file contents and update progress bar
        file = open(filename,  "r")
        for line in file:
            line = line.replace("\n", "")
            print(line)
            time.sleep(.05)
            self.updateProgress()
        file.close()

def setupUi(self, MainWindow):
    #Create the main window
    MainWindow.setObjectName(_fromUtf8("MainWindow"))
    MainWindow.resize(800, 600)

    #Body of the main window
    self.centralwidget = QtGui.QWidget(MainWindow)

    #Add process collect button
    self.centralwidget.setObjectName(_fromUtf8("centralwidget"))
    self.centralwidget.buttonProcessCollect = QtGui.QPushButton(self.centralwidget)
    self.centralwidget.buttonProcessCollect.setGeometry(QtCore.QRect(310, 240, 120, 40))
    self.centralwidget.buttonProcessCollect.setObjectName(_fromUtf8("buttonProcessCollect"))

    #Add progress bar
    self.progressBar = QtGui.QProgressBar(self.centralwidget)
    self.progressBar.setGeometry(QtCore.QRect(165, 290, 430, 20))
    self.progressBar.setProperty("value", 0)
    self.progressBar.setObjectName("progressBar")
    self.progressBar.hide()

    #Add actions to body
    self.centralwidget.connect(self.centralwidget.buttonProcessCollect,  SIGNAL("clicked()"),  self.processCollect)

    #Add body to the menu
    MainWindow.setCentralWidget(self.centralwidget)

    #Add text
    self.retranslateUi(MainWindow)

    #Connect actions
    QtCore.QMetaObject.connectSlotsByName(MainWindow)

def retranslateUi(self, MainWindow):
    MainWindow.setWindowTitle(QtGui.QApplication.translate("MainWindow", "MainWindow", None, QtGui.QApplication.UnicodeUTF8))
    self.centralwidget.buttonProcessCollect.setText(QtGui.QApplication.translate("MainWindow", "Process Collect", None, QtGui.QApplication.UnicodeUTF8))

if __name__ == "__main__":
    import sys
    app = QtGui.QApplication(sys.argv)
    MainWindow = QtGui.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())

1 Ответ

2 голосов
/ 26 июля 2011

Это можно решить с помощью потоков, чтобы не затрагивать реальный пользовательский интерфейс.

Вы можете использовать модуль потока Python или модуль qt qthread.

Twio ссылки на эту тему:

обсуждение списка рассылки

вопрос stackoverflow, заданный ранее, слегка отличается

Вот учебник по созданию потоков с pyqt: Threading pyqt4

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