PyQt5 Başka bir class'ta self.close kullanma

Birinci dosya

class botucalistirclass(QtCore.QObject):

    global otherclass

    redmessage = QtCore.pyqtSignal(str)
    greenmessage = QtCore.pyqtSignal(str)
    yellowmessage = QtCore.pyqtSignal(str)


    def bot(self):
        global islenen_hesap_sayisi
        print("working")
        mode = "PC" #Modu db üzerinden çekecek daha sonrasında.
        print(id)
        if mode=="PC":
            while islenen_hesap_sayisi<hesapsayisi:

                islenen_hesap_sayisi += 1
                print(islenen_hesap_sayisi)
                #Selenium kodları buraya gelecek.
                sys.exit()
        elif mode=="VDS":
            #Selenium kodları buraya gelecek.

            self.yellowmessage.emit("Program 24 saatlik bekleme süresine girdi.")
            #HWID doğrulaması eklenecek.
            time.sleep(86460)
class MainPage(QMainWindow):

        def __init__(self, *args, **kwargs):
            QtWidgets.QWidget.__init__(self, *args, **kwargs)
            loadUi("agb.ui", self)
            



            global islenen_hesap_sayisi
            islenen_hesap_sayisi = 0





            self.thread = QtCore.QThread()
            self.botucalistir = botucalistirclass()

            self.botucalistir.greenmessage.connect(self.green_log_message)
            self.botucalistir.yellowmessage.connect(self.yellow_log_message)
            self.botucalistir.redmessage.connect(self.red_log_message)

            self.botucalistir.moveToThread(self.thread)

            self.thread.started.connect(self.botucalistir.bot)
            self.botucalistirbutton.clicked.connect(self.thread.start)

        def add_item(self, message, color):
            item = QListWidgetItem(message)
            item.setForeground(color)
            self.loglist.insertItem(0, item)

        def red_log_message(self, message):
            self.add_item(message, Qt.red)
        def green_log_message(self, message):
            self.add_item(message, Qt.green)
        def yellow_log_message(self, message):
            self.add_item(message, Qt.yellow)

İkinci dosya

from PyQt5.QtWidgets import *

from PyQt5.uic import loadUi

import qdarkstyle

from second import MainPage

app = QApplication([])

window = MainPage()

app.setStyleSheet(qdarkstyle.load_stylesheet_pyqt5())

window.show()

app.exec_()

Botucalistirbutton ile botucalistirclass’taki def bot’u çalıştırıyorum. Fakat aynı butona tekrar tıkladığımda işlem yapmıyor, o class’taki görevin bitmesi gerekiyor. self.close() yazıyordu internette fakat onu denediğimde “AttributeError: ‘botucalistirclass’ object has no attribute ‘close’” hatası veriyor. Yardımcı olabilirseniz sevinirim.

Hangi buton? Neden tekrar kullanilamiyor?

Hangi class? Nasil bir loop?

self ne ki?

bkz: Soru Sorarken Sıkça Düşülen Hatalar #6

1 Beğeni

Üzgünüm class kodunu yazmayı unutmuşum. def bot() class’a bağlı. Program 2 dosyadan oluşuyor, 2 dosyayı da konuya yazıp güncelliyorum. Uyarı için teşekkürler

QThread::start’i tekrar cagiriyor ama thread zaten baslamis oldugu icin bir sey degismiyor.

Butona her basildiginda bot’un tekrar cagrilmasi icin:

  • bot’u dogrudan cagirmak
  • sinyal/slot mekanizmasiyla bot’u cagirmak
  • bot’u calistiran thread’i her basista sifirdan olusturup baslatmak

islemlerinden biri gerekiyor.

Nerede?

Bot doğrudan çağırılamıyor, selenium kodları olduğu için GUI kitleniyor maalesef. Bot’u çalıştıran thread’i her basışta nasıl sıfırdan oluşturup başlatabileceğimi anlatabilir misiniz veya bununla alakalı bir kaynak atabilir misiniz acaba?

Burada diğer class’ı kapatmak için self.close() kullanın yazıyordu, def bot’u çağırsam while döngüsünü bitse yine de dönüp duruyor. Ben de “class’ı kapatmak mantıklı olur mu acaba?” diye düşündüm.

“class’i kapatmak” diye bir sey yok. QObject yerine pencere gibi kapanabilen bir sey olsaydi close metodu olurdu ve cagirmak mantikli olabilirdi.

https://forum.yazbel.com/search?q=pyqt%20thread

Olmadi duz threading.Thread de is gorur.

Tavsiyeleriniz için teşekkür ederim, attığınız link’teki konuları inceleyip internette araştırma yaptım. Thread konusunda çok iyi olmadığım için tam olarak neyi yazıp search edeceğimi bilmiyordum.

Sonradan bu konuyu okuyup yazılımındaki çözmek isteyen arkadaşlar için “otherclass= self.thread” ekledim thread kodlarından sonra. Sonrasında diğer class’ı durdurmak istediğim yere “otherclass.terminate()” yazdım.