![]() |
|
Closing the Programm after stuck in while loop - Printable Version +- Python Forum (https://python-forum.io) +-- Forum: Python Coding (https://python-forum.io/forum-7.html) +--- Forum: GUI (https://python-forum.io/forum-10.html) +--- Thread: Closing the Programm after stuck in while loop (/thread-14736.html) |
Closing the Programm after stuck in while loop - Rigunas - Dec-14-2018 Hello, I am working on a small project which start after pressing a button. For this project I'm using Python (X, Y) and have created the graphical interface in QtDesigner. For this I started the application at the beginning, opened and displayed the created window. Now I wait until the start button is pressed. Afterward the function just goes on in a while loop. My problem now is that the project stops responding to the buttons and I can't stop the project anymore. Is there a way to work around this or get rid of the while loop all together? Greetings Matthias RE: Closing the Programm after stuck in while loop - Axel_Erfurt - Dec-14-2018 Without seeing the code, it's hard to help. RE: Closing the Programm after stuck in while loop - Alfalfa - Dec-14-2018 You must always avoid blocking your main loop, as it makes the GUI non responsive. For a long running task, you must place the code in a separate thread and communicate through qt signals and slots system. #!/usr/bin/python3
# Threading example with QThread and moveToThread (PyQt5)
import sys
import time
from PyQt5 import QtWidgets, QtCore
class WorkerThread(QtCore.QObject):
signalExample = QtCore.pyqtSignal(str, int)
def __init__(self):
super().__init__()
@QtCore.pyqtSlot()
def run(self):
while True:
# Long running task ...
self.signalExample.emit("leet", 1337)
time.sleep(5)
class Main(QtWidgets.QMainWindow):
def __init__(self):
super().__init__()
self.worker = WorkerThread()
self.workerThread = QtCore.QThread()
self.workerThread.started.connect(self.worker.run) # Init worker run() at startup (optional)
self.worker.signalExample.connect(self.signalExample) # Connect your signals/slots
self.worker.moveToThread(self.workerThread) # Move the Worker object to the Thread object
self.workerThread.start()
def signalExample(self, text, number):
print(text)
print(number)
if __name__== '__main__':
app = QtWidgets.QApplication([])
gui = Main()
sys.exit(app.exec_())
RE: Closing the Programm after stuck in while loop - Rigunas - Dec-17-2018 This is my code so far. Any suggestions? # -*- coding: utf-8 -*-
"""
Created on Mon Dec 03 11:12:09 2018
@author: Matthias Hochholzer
"""
import sys
import os
import subprocess
import time
from PyQt4.QtCore import *
from PyQt4.QtGui import *
from PyQt4.uic import *
class HexChecker():
# def getLines(): different approche
# global filePath, toolPath, gotPath
# filePath = w.hexLine.text()
# toolPath = w.consolLine.text()
# gotPath = 1
# print filePath
def checkHex(self):
global filePath, toolPath
filePath = w.hexLine.text()
toolPath = w.consolLine.text()
while go:
global oldDate
newDate = time.strftime('%Y-%m-%d %H:%M:%S', time.gmtime(os.path.getmtime(filePath)))
if newDate != oldDate:
subprocess.Popen([toolPath, "-c", "SWD", "-P", filePath, "-v", "-Rst"], shell = True)
oldDate = newDate
time.sleep(1)
def cancelFlashing(self):
global go
go = 0
filePath = "start"
toolPath = "start"
oldDate = "0000-00-00 00:00:00"
go = 1
hexChecker = HexChecker()
app = QApplication(sys.argv)
w = loadUi("Autoflash.ui")
w.startButton.clicked.connect(hexChecker.checkHex)
w.closeButton.clicked.connect(hexChecker.cancelFlashing)
w.show()
sys.exit(app.exec_())
|