PyQT-GUI与不同线程中的SQLAlchemy查询

2024-06-02 04:42:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在写一个股票管理软件,它使用一个数据库来存储数据。我确实想反复进行查询,以保持界面的最新状态。此外,我希望在不同的线程中执行查询,以避免阻塞gui。你知道吗

到目前为止,我已经让GUI工作了,并且我将由sqlalchemy管理的查询移到了不同的线程中。GUI加载数据并由数据填充。遗憾的是,当我尝试重新查询和更新时,出现了错误SQLite objects created in a thread can only be used in that same thread。你知道吗

def init_threads(self):
        self.data_thread = QtCore.QThread()
        self.mydata = Main_data()
        self.mydata.moveToThread(self.data_thread)
        self.data_thread.start()
        self.mydata.getchemical_finished.connect(self.update_result)

def init_connections(self):
        self.reset_btn.clicked.connect(self.mydata.getchemical)

class Main_data(QtCore.QObject):
   getchemical_finished = QtCore.pyqtSignal()

   def __init__(self):
       super(QtCore.QObject, self).__init__()
        self.engine = db.create_engine('data.db')
        self.session = sessionmaker(bind=self.engine)()

        @QtCore.pyqtSlot()
       def getchemical(self, chemical_id=None, chemical_name=None):
        if all(v is None for v in [chemical_id, chemical_name]):
            self.mychemicals = self.session.query(Chemical).all()
        elif chemical_name is not None:
            self.mychemical = self.session.query(Chemical).filter(Chemical.name == chemical_name).first()
        elif chemical_id is not None:
            self.mychemical = self.session.query(Chemical).filter(Chemical.id == chemical_id).first()
        self.getchemical_finished.emit() 

我尝试使用sess=scoped\u会话(自我会话)在函数中得到化学物质,但这并没有改变任何东西。 我读过使用炼金术的书,但是我以前没有用过,我想知道,这是否是正确的方法?什么是最好和最有效的方法?为了实现对接口的更新,我会启动另一个线程,每x秒触发一次更新。你知道吗

~z~费边


Tags: 数据nameselfnoneiddatainitsession