每次启动QGIS 3时,带有级联列表的Python插件运行速度都会变慢

时间:2018-12-29 09:32:11

标签: python qgis

我正在为QGIS编写Python插件,其中数据存储在Postgres DB中。第一步是在级联选择中选择“父项”之后选择一个项。

它可以工作,但是经过一些测试,它变得越来越慢。当我重新加载插件时,它以初始速度运行。我想这是内存中积累的问题,但我看不出如何解决它。

(我已经在gis.stackexchange上发布了这个问题,但是我被告知最好放在这里...)。

文件1:plan_culture.py

from PyQt5 import QtWidgets
import os.path
from PyQt5.QtCore import QSettings, QTranslator, qVersion, QCoreApplication
from PyQt5.QtGui import QIcon
from PyQt5.QtWidgets import QAction, QFileDialog
from .resources import *
from .plan_culture_dialog import PlanCultureDialog
from .liaisons_bdd import LiaisonsBDD

class PlanCulture:

def __init__(self, iface):

    # Save reference to the QGIS interface
    self.iface = iface
    # -----------
    self.departements = None
    self.choix_dep = None
    self.sql_com = None
    self.curseur = None
    self.tuples = None
    self.liste_com = None
    self.communes = None
    self.choix_com = None
    self.sql_expl = None
    self.liste_expl = None
    self.exploitations = None

def run(self):

    self.dlg.listExploitations.clear()
    self.dlg.listDepartements.clear()
    self.dlg.listCommunes.clear()
    #------------------remplissage de la liste des departements---------------
    self.departements = LiaisonsBDD.choix_departements(self)
    self.dlg.listDepartements.addItems(self.departements)
    self.dlg.listDepartements.currentTextChanged.connect(self.choix_communes)
    #---------------montrer le dialogue
    self.dlg.show()


def choix_communes(self):

    self.choix_dep = str(self.dlg.listDepartements.currentText())
    self.sql_com = "SELECT communes.nom_com  from referentiel.communes  \
    JOIN exploitations ON communes.insee_com = exploitations.insee_com \
    WHERE communes.nom_dep LIKE '{}' ORDER BY nom_com".format(self.choix_dep)
    #------------------execution du sql---------
    self.curseur = LiaisonsBDD.connexion_BDD(self)
    self.curseur.execute(self.sql_com)
    self.tuples = self.curseur.fetchall()   
    self.liste_com = []
    for x in self.tuples:
        self.liste_com.append(x[0])
    #------------------remplissage de la liste des communes---------------
    self.communes = self.liste_com
    self.dlg.listCommunes.clear()
    self.dlg.listCommunes.addItems(self.communes)
    self.dlg.listCommunes.currentTextChanged.connect(self.choix_exploitations)

def choix_exploitations(self):

    self.choix_com = str(self.dlg.listCommunes.currentText())
    #--chaine sql pour remplissage de la liste avec les exploitations sur la commune choisie
    self.sql_expl = "SELECT exploitations.nom_exploitation  FROM exploitations \
    JOIN referentiel.communes ON communes.insee_com = exploitations.insee_com \
    WHERE communes.nom_com LIKE '{}'  ORDER BY nom_exploitation".format(self.choix_com)
    #------------------execution du sql---------
    self.curseur = LiaisonsBDD.connexion_BDD(self)
    self.curseur.execute(self.sql_expl)
    self.tuples = self.curseur.fetchall()   
    self.liste_expl = []
    for x in self.tuples:
        self.liste_expl.append(x[0])
    #------------------remplissage de la liste des exploitations---------------
    self.exploitations = self.liste_expl
    self.dlg.listExploitations.clear()
    self.dlg.listExploitations.addItems(self.exploitations)

文件2:Liaisons_BDD.py

import os.path
from qgis.core import QgsProject, QgsDataSourceUri, QgsCredentials
from PyQt5.QtWidgets import QMessageBox
from PyQt5.QtCore import QMetaObject, pyqtSlot
import psycopg2

class LiaisonsBDD:

def __init__(self, iface):

    super(plan_culture_dialog, self).__init__(parent)
    self.iface = iface
    self.setupUi(self)
    self.iface.addDockWidget(Qt.RightDockWidgetArea, self)

    # database properties
    self.couche = None
    self.connInfo = None
    self.success = None
    self.username1 = None
    self.password1 = None
    self.connexion = None
    self.curseur = None
    # sql ---------
    self.sql_dep = None
    self.tuples = None
    self.liste_dep = None



def connexion_BDD(self):
    """ouvrir connexion  a la BDD pour rapatriement donnees"""
    #############################################################################
    #utilisation de la methode QgsCredentials pour recuperer le password de la session ouverte
    #############################################################################
    self.couche = self.iface.activeLayer()
    self.connInfo = QgsDataSourceUri(self.couche.dataProvider().dataSourceUri()).connectionInfo()
    self.success, self.username1, self.password1 = QgsCredentials.instance().get(self.connInfo, None, None)
    if self.success:
        QgsCredentials.instance().put(self.connInfo, self.username1, self.password1)        

    #############################################################################
    #utilisation des metodes du module psycopg2 pour connexion a BDD avec req SQL
    #############################################################################

    self.connexion = psycopg2.connect(host ="localhost",  port="5432", dbname="pe_v2", user=self.username1, password=self.password1)
    self.curseur = self.connexion.cursor()
    return self.curseur

def choix_departements(self):

    self.sql_dep = "SELECT departements.nom_dep, departements.insee_dep from referentiel.departements \
    JOIN (select count(exploitations.*), insee_dep from exploitations group by insee_dep) AS nbre_exploit \
    ON nbre_exploit.insee_dep = departements.insee_dep ORDER BY nom_dep"

    self.curseur = LiaisonsBDD.connexion_BDD(self)
    self.curseur.execute(self.sql_dep)
    self.tuples = self.curseur.fetchall()   
    self.liste_dep = []
    for x in self.tuples:
        self.liste_dep.append(x[0])
    return self.liste_dep

0 个答案:

没有答案