Python Forum
Closing the Programm after stuck in while loop
Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Closing the Programm after stuck in while loop
#1
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
Reply
#2
Without seeing the code, it's hard to help.
Reply
#3
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_())
Reply
#4
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_())
Reply


Possibly Related Threads…
Thread Author Replies Views Last Post
  [Tkinter] Tried to programm a parking lot Croshihw 0 2,177 Sep-19-2018, 09:08 AM
Last Post: Croshihw

Forum Jump:

User Panel Messages

Announcements
Announcement #1 8/1/2020
Announcement #2 8/2/2020
Announcement #3 8/6/2020