Reputation: 105
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
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