Threads UI och Python
Jag har skrivit ett eget program med ett UI(QT). Programmet är skrivet för python3 så jag använder mig givetvis utav PyQT-biblioteket.
Mitt problem är att UI't inte uppdaterar sig/är responsivt när jag anropar en funktion via en knapp.
Låt oss säga att jag anropar en funktion som ligger och kör i 30 sekunder, då är UI't låst under denna tid.
Vad jag förstått så beror detta på att "uppritningen" av UI't är en loop och då jag anropar en funktion som tar upp hela processen så gör detta att UI't inte kan uppdatera sig?
Vad jag då förstått vidare så bör man då dela upp programmet så det körs i olika trådar och det är här jag skulle behöva en liten push hur jag ska lägga upp det(eller om det finns en alternativ lösning).
Ska bifoga en snutt av koden som jag tror kan vara intressant för detta:
if __name__ == "__main__":
import sys, socket, os
from PyQt4 import QtCore, QtGui
global settings
app = main_ui.QtGui.QApplication(sys.argv)
MainWindow = main_ui.QtGui.QMainWindow()
ui = main_ui.Ui_MainWindow()
ui.setupUi(MainWindow)
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.settimeout(None)
settings = startUp()
MainWindow.show()
QtCore.QObject.connect(ui.buttonconnect, QtCore.SIGNAL("clicked()"), connectPi)
QtCore.QObject.connect(ui.buttonshutdown, QtCore.SIGNAL("clicked()"), shutdownserver)
QtCore.QObject.connect(ui.buttonsetsave, QtCore.SIGNAL("clicked()"), saveSettings)
QtCore.QObject.connect(ui.buttonmanspindle, QtCore.SIGNAL("clicked()"), spindleMotor)
Koden ovan är egentligen "huvudkoden" och resten är enbart diverse funktioner som anropas av knapptryckningar i UI't som synes. Har mycket mer knappar men spelar ju ingen roll antar jag för detta problem.
Så tänker jag rätt att jag vill lägga MainWindow.show() i en tråd och sen på något sätt få in alla funktioner i en annan?
Och hur görs detta isåfall rent praktiskt?
Vad det handlar om är min bygglogg där jag bygger en liten CNC-maskin, problemet som uppstår är att vid körning så uppdateras inte XYZ-kordinaterna i realtid utan kanske en gång i minuten eller så, antar att detta beror på trådhanteringen(som är obefintlig idag)?
Vore tacksam för en knuff i rätt riktning då det skulle få min mjukvara att uppföra sig lite proffsigare
Kan givetvis bifoga mer kod om det är nödvändigt^^
Skulle kunna skriva en testkod här för att göra det tydligare:
def delay():
time.sleep(60)
#importerar och skapar nödvändiga ui-objekt här
MainWindow.show()
QtCore.QObject.connect(ui.buttonconnect, QtCore.SIGNAL("clicked()"), delay)
I koden ovan skulle UI't inte gå att exempelvis ändra storlek på under tiden som delay körs. Hur fixar man denna så att det går?
Bara gammalt skräp...