An art
An art

Reputation: 105

Pyqt5 how to run script every 5 minute or running script to check thread in web

I tried to make method run 5 minute or running script to check thread in web in pyqt5 ui with while True but the gui get frozen here the code, i google and found something like QRunnable or QPooThread, but still i can't understanding it.. how to implement it to Pyqt5 ui Designer

class Ui_MainWindow(object):
    # constructor using define first config
    def __init__(self):
        self.notify = webScrape() 
        self.errorFile = Path(os.path.dirname(os.path.abspath(
            __file__))+"\\resources\\log\\errors_log.txt")
        if os.path.exists(os.path.dirname(
                os.path.abspath(__file__))+"\\resources\\log") == False:
            os.mkdir(os.path.dirname(
                os.path.abspath(__file__))+"\\resources\\log")
        if not self.errorFile.exists() == True:
            open(os.path.dirname(os.path.abspath(__file__)) +
                 "\\resources\\log\\errors_log.txt", "w+")
        self.setPesanTime = None

def setupUi(self, MainWindow):
    # window
    MainWindow.setObjectName("MainWindow")
    MainWindow.resize(748, 542)
    icon = QtGui.QIcon()
    icon.addPixmap(QtGui.QPixmap(
        os.path.dirname(os.path.abspath(__file__))+"\\resources\\img\\favicon.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
    MainWindow.setWindowIcon(icon)
    self.centralwidget = QtWidgets.QWidget(MainWindow)
    self.centralwidget.setObjectName("centralwidget")
    self.line_2 = QtWidgets.QFrame(self.centralwidget)
    self.line_2.setGeometry(QtCore.QRect(10, 450, 321, 16))
    self.line_2.setFrameShape(QtWidgets.QFrame.HLine)
    self.line_2.setFrameShadow(QtWidgets.QFrame.Sunken)
    self.line_2.setObjectName("line_2")
    self.line = QtWidgets.QFrame(self.centralwidget)
    self.line.setGeometry(QtCore.QRect(10, 140, 311, 16))
    self.line.setFrameShape(QtWidgets.QFrame.HLine)
    self.line.setFrameShadow(QtWidgets.QFrame.Sunken)
    self.line.setObjectName("line")
    self.line_3 = QtWidgets.QFrame(self.centralwidget)
    self.line_3.setGeometry(QtCore.QRect(320, 10, 20, 441))
    self.line_3.setFrameShape(QtWidgets.QFrame.VLine)
    self.line_3.setFrameShadow(QtWidgets.QFrame.Sunken)
    self.line_3.setObjectName("line_3")
    # grid
    self.gridLayoutWidget = QtWidgets.QWidget(self.centralwidget)
    self.gridLayoutWidget.setGeometry(QtCore.QRect(30, 30, 201, 101))
    self.gridLayoutWidget.setObjectName("gridLayoutWidget")
    self.gridLayout = QtWidgets.QGridLayout(self.gridLayoutWidget)
    self.gridLayout.setContentsMargins(0, 0, 0, 0)
    self.gridLayout.setObjectName("gridLayout")
    # label
    self.label = QtWidgets.QLabel(self.centralwidget)
    self.label.setGeometry(QtCore.QRect(10, 160, 47, 13))
    font = QtGui.QFont()
    font.setBold(True)
    font.setWeight(75)
    self.label.setFont(font)
    self.label.setTextFormat(QtCore.Qt.AutoText)
    self.label.setObjectName("label")
    self.label_2 = QtWidgets.QLabel(self.centralwidget)
    self.label_2.setGeometry(QtCore.QRect(10, 0, 161, 31))
    font = QtGui.QFont()
    font.setBold(True)
    font.setWeight(75)
    self.label_2.setFont(font)
    self.label_2.setObjectName("label_2")
    self.label_4 = QtWidgets.QLabel(self.centralwidget)
    self.label_4.setGeometry(QtCore.QRect(350, 10, 161, 16))
    font = QtGui.QFont()
    font.setBold(True)
    font.setWeight(75)
    self.label_4.setFont(font)
    self.label_4.setObjectName("label_4")
    self.label_5 = QtWidgets.QLabel(self.centralwidget)
    self.label_5.setGeometry(QtCore.QRect(360, 30, 381, 16))
    self.label_5.setObjectName("label_5")
    self.label_6 = QtWidgets.QLabel(self.centralwidget)
    self.label_6.setGeometry(QtCore.QRect(370, 50, 381, 16))
    self.label_6.setObjectName("label_6")
    self.label_7 = QtWidgets.QLabel(self.centralwidget)
    self.label_7.setGeometry(QtCore.QRect(360, 70, 381, 16))
    self.label_7.setObjectName("label_7")
    self.label_8 = QtWidgets.QLabel(self.centralwidget)
    self.label_8.setGeometry(QtCore.QRect(370, 90, 381, 16))
    self.label_8.setObjectName("label_8")
    self.label_5 = QtWidgets.QLabel(self.centralwidget)
    self.label_5.setGeometry(QtCore.QRect(360, 30, 381, 16))
    self.label_5.setObjectName("label_5")
    self.label_6 = QtWidgets.QLabel(self.centralwidget)
    self.label_6.setGeometry(QtCore.QRect(370, 50, 381, 16))
    self.label_6.setObjectName("label_6")
    self.label_7 = QtWidgets.QLabel(self.centralwidget)
    self.label_7.setGeometry(QtCore.QRect(360, 70, 381, 16))
    self.label_7.setObjectName("label_7")
    self.label_8 = QtWidgets.QLabel(self.centralwidget)
    self.label_8.setGeometry(QtCore.QRect(370, 90, 381, 16))
    self.label_8.setObjectName("label_8")
    # checkbox
    self.chkSemuaKontak = QtWidgets.QCheckBox(self.gridLayoutWidget)
    self.chkSemuaKontak.setObjectName("chkSemuaKontak")
    self.gridLayout.addWidget(self.chkSemuaKontak, 0, 0, 2, 1)
    self.chkSemuaGrup = QtWidgets.QCheckBox(self.gridLayoutWidget)
    self.chkSemuaGrup.setObjectName("chkSemuaGrup")
    self.gridLayout.addWidget(self.chkSemuaGrup, 2, 0, 2, 1)
    self.chkAktifkanJawabPesan = QtWidgets.QCheckBox(self.centralwidget)
    self.chkAktifkanJawabPesan.setObjectName("chkAktifkanJawabPesan")
    self.chkAktifkanJawabPesan.setGeometry(QtCore.QRect(360, 100, 381, 16))
    # textarea
    self.plainTextEdit = QtWidgets.QPlainTextEdit(self.centralwidget)
    self.plainTextEdit.setGeometry(QtCore.QRect(20, 180, 281, 261))
    self.plainTextEdit.setObjectName("plainTextEdit")
    self.pesanTerima = QtWidgets.QPlainTextEdit(self.centralwidget)
    self.pesanTerima.setGeometry(QtCore.QRect(350, 120, 381, 351))
    self.pesanTerima.setObjectName("pesanTerima")
    # button
    self.kirimBtn = QtWidgets.QPushButton(self.centralwidget)
    self.kirimBtn.setGeometry(QtCore.QRect(50, 470, 91, 31))
    self.kirimBtn.setObjectName("kirimBtn")
    self.batalBtn = QtWidgets.QPushButton(self.centralwidget)
    self.batalBtn.setGeometry(QtCore.QRect(170, 470, 91, 31))
    self.batalBtn.setObjectName("batalBtn")
    self.setAutoJawab = QtWidgets.QPushButton(self.centralwidget)
    self.setAutoJawab.setGeometry(QtCore.QRect(360, 480, 361, 31))
    self.setAutoJawab.setObjectName("setAutoJawab")
    # menu bar
    MainWindow.setCentralWidget(self.centralwidget)
    self.menubar = QtWidgets.QMenuBar(MainWindow)
    self.menubar.setGeometry(QtCore.QRect(0, 0, 748, 21))
    self.menubar.setObjectName("menubar")
    MainWindow.setMenuBar(self.menubar)
    # status bar
    self.statusbar = QtWidgets.QStatusBar(MainWindow)
    self.statusbar.setObjectName("statusbar")
    MainWindow.setStatusBar(self.statusbar)
    # declare event for properti
    self.kirimBtn.clicked.connect(self.kirimPesan)
    self.setAutoJawab.clicked.connect(self.setPesanClicked)
    self.chkSemuaKontak.toggled.connect(self.chkSemuaKontakChecked)
    self.chkSemuaGrup.toggled.connect(self.chkSemuaGrupChecked)

    self.retranslateUi(MainWindow)
    QtCore.QMetaObject.connectSlotsByName(MainWindow)

def retranslateUi(self, MainWindow):
    _translate = QtCore.QCoreApplication.translate

the method / function that i want to run every 5 minute

def setPesanClicked(self):
    self.setPesanTime = datetime.now().strftime("%m/%d/%Y")
    while True:
        if self.notify.thereNewMessage() > 0:
            print('there something')
        else:
            print('wait 5 Minute')
            print(self.notify.thereNewMessage())

main run:

if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())

Upvotes: 0

Views: 585

Answers (1)

Mario Camilleri
Mario Camilleri

Reputation: 1557

Use QThread to start your background task in a different thread and so avoid blocking your ui in the main thread. Python has its own threading module, but since you appear to be using PyQt it makes sense to use QThread instead.

Start by importing QThread:

from PyQt5.QtCore import QThread

Declare your own QThread subclass, with the code in the run() method.

class bkgTask(QThread):

    def run(self):
        self.setPesanTime = datetime.now().strftime("%m/%d/%Y")
        while True:
            if self.notify.thereNewMessage() > 0:
                print('there something')
            else:
                print('wait 5 Minute')
                sleep(5*60)
                print(self.notify.thereNewMessage())

Create and run the background task:

bkgThread = bkgTask()
bkgThread.start()

Note that you start the task by calling start(), which in turn will call your run() method.

The first line goes with the imports. The last 2 lines start the thread, and should be somewhere in the main program - maybe between MainWindow.show ... and sys.exit, or in the MainWindow init. The bkgTask class needs to be declared somewhere with your other classes.

I'm not sure what the self in self.setPesanTime = datetime.now().strftime("%m/%d/%Y") refers to - you will probably need to move that line outside the bkgTask class unless you are going to use setPesanTime in the threaded code.

Upvotes: 1

Related Questions