Новичок
Профиль
Группа: Участник
Сообщений: 29
Регистрация: 13.9.2008
Где: Russia, Urals, Ye katerinburg
Репутация: нет Всего: нет
|
Здраствуйте, проблема в том, что не как не получается менять прогресс бар из потоков так, чтобы все изменения были атомарными. Короче привожу весь текст(я решил сделать через QStandartModel). Косяк в том, что потоки все отработали, а бар до 100 не доходит иногда(( Цитата | #!/usr/bin/env python # -*- coding: cp1251 -*- #Polyakov © 2008 #Version 0.5.1 try: import threading except ImportError: import dummy_threading as threading import sys, MySQLdb, csv, codecs from PyQt4 import QtCore, QtGui, uic
Instanse = QtCore.QObject def trUtf8(Instance, SourceText): return QtCore.QObject.trUtf8(Instance, SourceText) app = QtGui.QApplication(sys.argv) app.setStyle("Plastique") form_class, base_class = uic.loadUiType("query.ui")
def generateSqlString( garrison, queryType, month, year, finiteMonth, finiteYear ): query = "" if (( queryType == 'Код 72' )or( queryType == 'Test' )): if ( (month==finiteMonth) and (year==finiteYear) ): query = """SELECT `upvd01`.`d`, `upvd01`.`e`, `upvd01`.`f`, `upvd01`.`g` FROM `upvd12` join `upvd01` WHERE `upvd12`.`b`=72 and `upvd01`.`a` = `upvd12`.`a` and `upvd01`.`e`="""+str( garrison )+""" and `upvd12`.`p`="""+str( month )+""" and `upvd12`.`r`="""+str( year ) else: if (year!=finiteYear): query = """SELECT `upvd01`.`d`, `upvd01`.`e`, `upvd01`.`f`, `upvd01`.`g` FROM `upvd12` join `upvd01` WHERE `upvd12`.`b`=72 and `upvd01`.`a` = `upvd12`.`a` and `upvd01`.`e`="""+str( garrison )+""" and ((`upvd12`.`r`<"""+str( finiteYear )+""" and `upvd12`.`r`>"""+str( year )+""") or (`upvd12`.`p`>="""+str( month )+""" and `upvd12`.`r`="""+str( year )+""" and `upvd12`.`p`<="""+str( finiteMonth )+""" and `upvd12`.`r`="""+str( finiteYear )+'))' else: query = """SELECT `upvd01`.`d`, `upvd01`.`e`, `upvd01`.`f`, `upvd01`.`g` FROM `upvd12` join `upvd01` WHERE `upvd12`.`b`=72 and `upvd01`.`a` = `upvd12`.`a` and `upvd01`.`e`="""+str( garrison )+""" and `upvd12`.`p`>="""+str( month )+""" and `upvd12`.`p`<="""+str( finiteMonth )+""" and `upvd12`.`r`="""+str( finiteYear ) return query
class sqlThread ( threading.Thread ): def __init__ ( self, basename, query, model, qmodel, index, progress, lock, dbpasswd = "", dbhost = "localhost", dbuser = "root" ): self.basename = basename self.dbpasswd = dbpasswd self.dbhost = dbhost self.dbuser = dbuser self.model = model self.qmodel = qmodel self.query = query self.index = index self._lock = lock self.progress = progress threading.Thread.__init__ ( self ); def run ( self ): try: rows = self.model.rowCount() self.model.removeRows(0, rows) self.model.insertRow(0) self.model.setData(self.model.index(0, 0), QtCore.QVariant( trUtf8( form, unicode('Запрос выполняется...', 'cp1251').encode( 'utf8' )) ) ) dbi = MySQLdb.connect ( host = self.dbhost, user = self.dbuser, passwd = self.dbpasswd, db = self.basename ) cursor = dbi.cursor() cursor.execute( self.query ) result = dbi.store_result() rows = self.model.rowCount() self.model.removeRows(0, rows) for item in cursor.fetchall(): self.model.insertRow( 0 ) string = "" string = (str(item[0])).zfill(2)+"/"+(str(item[1])).zfill(2)+"/"+(str(item[2])).zfill(4)+"-"+(str(item[3])).zfill(2) self.model.setData(self.model.index(0, 0), QtCore.QVariant( string )) self.model.insertRow( 0 ) self.model.setData( self.model.index(0, 0), QtCore.QVariant( QtCore.QString(trUtf8( form, unicode('Запрос Успешно завершен', 'cp1251').encode( 'utf8' )) )) ) dbi.close ( ) self.qmodel.setData( self.index, QtCore.QVariant( cursor.rowcount ) ) except MySQLdb.Error, e: print "MySQL error ", sys.exc_info()[1][0], "\n Description: ", sys.exc_info()[1] self.model.insertRow(0) self.model.setData(self.model.index(0, 0), QtCore.QVariant( "MySQL error occured!" )) self.qmodel.setData( self.index, QtCore.QVariant( "MySQL error occured!" ) ) except: print "Unexpected error: \n Description: ", sys.exc_info() self.model.insertRow(0) self.model.setData(self.model.index(0, 0), QtCore.QVariant( trUtf8( form, unicode('Произошла ошибка во время выполнения', 'cp1251').encode( 'utf8' )) ) ) finally: print "Finally" if( self._lock.locked() ): print 'Locked!' print "Lock request ", self.getName() self._lock.acquire( ) print "Got lock ", self.getName() index = self.progress.index( 0, 0, QtCore.QModelIndex()) number = self.progress.itemData( index ) self.progress.setData( index, QtCore.QVariant( (number[0].toInt()[0])+1 ) ) self._lock.release() print "Release ", self.getName()
class guiForm(QtGui.QDialog, form_class): def __init__(self, *args): QtGui.QWidget.__init__(self, *args) self.sqlThreads = [] self.caseModels = [] self.querysNamesIndex = { 'Код 72':0, 'Test':1, 'dfdf':2 } self.garrisons = [] self.caseModelIndex = 0 self.setupUi(self) self.progressModel = QtGui.QStandardItemModel( 1,1 ) self.progressModel.setData(self.progressModel.index(0, 0), QtCore.QVariant( 0 ) ) self.queryModel = QtGui.QStandardItemModel( 0, len( self.querysNamesIndex )+1 ) cols = self.queryModel.columnCount()-1 for queryName, queryIndex in self.querysNamesIndex.items(): self.queryModel.setHeaderData( queryIndex, QtCore.Qt.Horizontal, QtCore.QVariant( trUtf8( self, unicode(queryName, 'cp1251').encode( 'utf8' ) ) ) ) self.inputQuery.setModel(self.queryModel) self.inputQuery.hideColumn(cols) self.connect(self.progressModel, QtCore.SIGNAL("dataChanged ( const QModelIndex &, const QModelIndex & )"), self.on_progressModel_dataChanged) self.addQuerys()
def saveMainCheet(self): fileName = QtGui.QFileDialog.getSaveFileName(self, trUtf8( self, unicode('Выберите имя файла для отчета', 'cp1251').encode( 'utf8' )) , "report.csv", self.tr("Comma Separated Values (*.csv);;All Files (*)") ) if not fileName.isEmpty(): report_fd = open( fileName, "wb" ) d = csv.excel( ) d.quoting=0 d.delimiter=';' report_writer = csv.writer( report_fd, d ) rows = self.queryModel.rowCount() cols = self.queryModel.columnCount()-1 record = [] record.append ( "Гарнизоны" ) for queryName, queryIndex in self.querysNamesIndex.items(): record.append ( queryName ) report_writer.writerow ( record ) for row in range (rows): record = [] record.append ( self.garrisons[row][1] ) for col in range (cols): index = self.queryModel.index( row, col, QtCore.QModelIndex()) number = self.queryModel.itemData( index ) record.append ( number[0].toInt()[0] ) report_writer.writerow ( record ) report_fd.close()
def saveCases(self, garrisonIndex): fileName = QtGui.QFileDialog.getSaveFileName(self, trUtf8( self, unicode('Выберите имя файла', 'cp1251').encode( 'utf8' )) , trUtf8( self, unicode(self.garrisons[garrisonIndex][1], 'cp1251').encode( 'utf8' )+".csv"), self.tr("Comma Separated Values (*.csv);;All Files (*)")) if not fileName.isEmpty(): fn = QtCore.QString (fileName).toAscii() report_fd = open(fn, "wb" ) d = csv.excel() d.quoting = 0 d.delimiter = ';' report_writer = csv.writer( report_fd, d ) caseModel = self.caseModels[self.caseModelIndex] rows = caseModel.rowCount() record = [] record.append ( self.garrisons[garrisonIndex][1] ) report_writer.writerow ( record ) for row in range (rows): record = [] index = caseModel.index( row, 0, QtCore.QModelIndex()) number = caseModel.itemData( index ) record.append ( number[0].toString() ) report_writer.writerow ( record ) report_fd.close()
def on_progressModel_dataChanged(self, x): index = self.progressModel.index( 0, 0, QtCore.QModelIndex()) number = self.progressModel.itemData( index ) self.progress.setValue( self.progressModel.itemData( index )[0].toInt()[0]+1 ) #print self.progress.value() if( self.progress.value()==self.progress.maximum() ): self.sqlThreads = [] self.startQueryLoop.setEnabled( True ) self.all2csv.setEnabled( True ) self.progress.setEnabled( False ) self.progress.setValue( 0 ) print 'All querys done.'
def on_inputQuery_clicked( self, x ): self.tableView.setModel( self.caseModels[ x.row() ] ) self.caseModelIndex = x.row()
def on_startQueryLoop_pressed(self): index = self.progressModel.index( 0, 0, QtCore.QModelIndex() ) number = self.progressModel.itemData( index ) self.progressModel.setData( index, QtCore.QVariant( 0 ) ) self.progress.setEnabled( True ) self.startQueryLoop.setEnabled( False ) self.all2csv.setEnabled( False ) self.progress.setMaximum ( ((len( self.querysNamesIndex ))*(len( self.garrisons )))*2 ) progress_lock = threading.Lock() for queryName, queryIndex in self.querysNamesIndex.items(): for garrisonIndex in range( len( self.garrisons ) ): #print "Starting thread..." if( progress_lock.locked() ): print 'Locked!' index = self.progressModel.index( 0, 0, QtCore.QModelIndex()) print "Main lock request" progress_lock.acquire( ) print "Got lock" number = self.progressModel.itemData( index ) self.progressModel.setData( index, QtCore.QVariant( (number[0].toInt()[0])+1 ) ) progress_lock.release() print "Main release" index = self.queryModel.index( garrisonIndex, queryIndex, QtCore.QModelIndex()) self.queryModel.setData( index, QtCore.QVariant( 'N/A' ) ) startDate = self.dateBox.date() finiteDate = self.finiteDateBox.date() query = "" query = generateSqlString( self.garrisons[garrisonIndex][0], queryName, startDate.month(), startDate.year(), finiteDate.month(), finiteDate.year() ) newThread = sqlThread( "db", query, self.caseModels[ garrisonIndex ], self.queryModel, index, self.progressModel, progress_lock ) newThread.start()
def on_all2csv_pressed(self): self.saveMainCheet()
def on_cases2csv_pressed(self): self.saveCases( self.caseModelIndex )
def addQuerys(self): csvgf = open( "garrisons.csv", "r" ) all_garrisons = csv.DictReader(csvgf, fieldnames=['id', 'Name']) for garrison in all_garrisons: self.garrisons.append ( (garrison['id'], garrison['Name']) ) rows = self.queryModel.rowCount() self.queryModel.insertRow( rows ) self.queryModel.setHeaderData( rows, QtCore.Qt.Vertical, QtCore.QVariant( trUtf8( self, unicode(garrison['Name'], 'cp1251').encode( 'utf8' )) ) ) currentModel = QtGui.QStandardItemModel( 0, 1 ) currentModel.setHeaderData(0, QtCore.Qt.Horizontal, QtCore.QVariant( trUtf8( self, unicode('Номер дела', 'cp1251').encode( 'utf8' )) ) ) self.caseModels.append ( currentModel ) csvgf.close() self.tableView.setModel( self.caseModels[ 0 ] ) self.caseModelIndex = 0
form = guiForm() form.show() app.exec_()
|
|