Threading Olayını Anlamadım. Koda ekler misiniz örnek

Arkadaşlar pyqt5 te bir uygulama yaptım. İşlemin tamamlanma yüzdesini ve listwidget e hisseleri işlem devam ederken göstermek istiyorum ama threading olayını tam kavrayamadım. Eklemiş olduğum koda bunu yapabilecek birisi var mı acaba? İşlem tara fonksiyonunda gerçekleşiyor. For döngüsünde tamamlanma yüzdesi ve listwidget a ekleme olayı işlem bitene kadar çalışmıyor.

Bugünkü taramada EREGL ve SELEC al çıktı bakalım yarın bakacağım borsaya.

import yfinance as yf
import pandas as pd
import numpy as np
import datetime
from datetime import timedelta
from sqlitehelper import *
from PyQt5 import QtWidgets, uic
from PyQt5.QtWidgets import QMainWindow, QMessageBox
import sys
from  hisse import Hisse


helper = SqliteHelper("borsa.db")
helper.hisse_tablo()

class Borsa(QMainWindow):
    def __init__(self):
        super(Borsa, self).__init__()
        uic.loadUi("ui/main.ui", self)
        self.show()

        self.actionHisse.triggered.connect(self.hisse_show)
        self.pushButton.clicked.connect(self.tara)
    
    def hisse_show(self):
        self.window = QtWidgets.QMainWindow()
        self.ui = Hisse()
        self.ui.show()


    def tara(self):
        try:
            self.listWidget.clear()
            self.listWidget_2.clear()

            bugun = datetime.datetime.now()
            start = bugun - timedelta(days=250)
            end = bugun + timedelta(days=1)

            start  = str(start.year) + "-" + str(start.month) + "-" + str(start.day)
            end  = str(end.year) + "-" + str(end.month) + "-" + str(end.day)       
            
            hisseler = helper.select("select Hisse from borsa order by Hisse ASC")

            count = 0

            for item in hisseler:
                count = count + 1

                yuzde = (count / len(hisseler))*100
                

                hisse = item[0] + ".IS"
                df = yf.download(hisse, start=start, end=end)


                df['ema_20'] = df['Close'].ewm(span=20, adjust=False).mean()
                df['ema_50'] = df['Close'].ewm(span=50, adjust=False).mean()
                df['ema_200'] = df['Close'].ewm(span=200, adjust=False).mean()


                df['bullish'] = 0.0
                df['bullish'] = np.where(df['ema_50'] > df['ema_200'], 1.0, 0.0)
                df['crossover'] = df['bullish'].diff()

                df['bullish_20_50'] = 0.0
                df['bullish_20_50'] = np.where(df['ema_20'] > df['ema_50'], 1.0, 0.0)
                df['crossover_20_50'] = df['bullish_20_50'].diff()

                #bu bölümün işlem bitene kadar çalışmıyor. Threading olayını anlamadım.
                if df['crossover'].iloc[-1] > 0 and df['crossover_20_50'].iloc[-1] > 0:
                    self.listWidget.addItem(item[0] + ": GÜÇLÜ AL")
                elif df['crossover'].iloc[-1] > 0:
                    self.listWidget.addItem(item[0] + ": AL")
                elif df['crossover'].iloc[-1] < 0 and df['crossover_20_50'].iloc[-1] < 0:
                    self.listWidget_2.addItem(item[0] + ": GÜÇLÜ SAT")
                elif df['crossover'].iloc[-1] < 0:
                    self.listWidget_2.addItem(item[0] + ": SAT") 

                #bu bölümün işlem bitene kadar çalışmıyor. Threading olayını anlamadım.
                self.label_4.setText("%" + str(yuzde))
        except:
            pass

Merhaba,

Qt ile yapılan uygulamalarda threading kullanmak istiyorsanız, Qt kütüphanesinin sunduğu QThread sınıfı ile birlikte, genellikle QObject tabanlı bir worker sınıfı tanımlayıp signal-slot mekanizması kullanmanız gerekir.

Aşağıda basit bir signal-slot mekanizmasına sahip bir PyQt uygulaması görüyorsunuz. Bu uygulama, QLineEdit’e girilen sayısal bir değere göre bir döngü başlatır ve bu işlem QThread içinde çalıştırılarak GUI’nin donması engellenir. Döngü ilerledikçe ilerleme bilgisi signal aracılığıyla ana thread’e (GUI’ye) iletilir ve bu bilgi progress bar’da görüntülenir.

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import sys

from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QPushButton, QLineEdit, QProgressBar
from PyQt5.QtCore import Qt, QObject, QThread, pyqtSignal


class Worker(QObject):
    finished = pyqtSignal()
    progress = pyqtSignal(int)
    
    def __init__(self, size: int):
        super().__init__()
        self.size = size

    def run(self):
        for i in range(self.size):
            self.progress.emit(i + 1)
        self.finished.emit()
        

class Window(QWidget):
    def __init__(self):
        super().__init__()   
        self.layout = QVBoxLayout(self)
        self.setLayout(self.layout)
        self.line = QLineEdit(self)
        self.btn = QPushButton("Start", self)
        self.pbar = QProgressBar(self)
        self.thread = None
        self.worker = None
        self.layout.addWidget(self.line)
        self.layout.addWidget(self.btn)
        self.layout.addWidget(self.pbar)
        self.layout.setAlignment(self.line, Qt.AlignCenter)
        self.layout.setAlignment(self.btn, Qt.AlignCenter)
        self.layout.setAlignment(self.pbar, Qt.AlignCenter)
        self.btn.clicked.connect(self.start_thread)
        
    def start_thread(self):
        text = self.line.text()
        if not text.isdigit() or int(text) <= 0:
            return 
        value = int(text)
        self.pbar.setMinimum(0)
        self.pbar.setMaximum(value)
        self.thread = QThread()
        self.worker = Worker(value)
        self.worker.moveToThread(self.thread)
        self.thread.started.connect(self.worker.run)
        self.worker.progress.connect(self.progress)
        self.worker.finished.connect(self.finished)
        self.worker.finished.connect(self.thread.quit)
        self.worker.finished.connect(self.worker.deleteLater)
        self.thread.finished.connect(self.thread.deleteLater)
        self.btn.setEnabled(False)
        self.thread.start()        
        
    def progress(self, i: int):
        self.pbar.setValue(i)
        
    def finished(self):
        self.btn.setEnabled(True)
        self.pbar.setValue(0)


if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = Window()
    window.show()
    sys.exit(app.exec_())

1 Beğeni