J'ai fait des recherches sur ce sujet au cours des derniers jours et je n'ai pas trouvé de réponse adaptée à mon application. Je construis une interface graphique en python 2.7 avec PyQt4 pour interagir avec un robot. J'ai besoin d'un thread (principal) pour exécuter l'interface graphique créée avec QT Designer et un autre thread (worker) pour transmettre en continu des données vers et depuis le robot. Je veux utiliser les données saisies dans l'interface graphique (thread principal) dans le thread de travail infini. Dans tous les didacticiels que j'ai vus, les données sont uniquement envoyées par le worker au thread principal; comme l'exemple habituel de "barre de chargement".Python PyQt4 Filetage, variables de partage
C'est ce que j'ai jusqu'à présent. Ce programme importe la sortie de l'interface graphique de QT Designer et imprime les valeurs sur la console quand elles sont pressées. J'ai aussi un fil infini mis en place qui imprime "bonjour" à la console qui fonctionne. Juste pour me faire pointer dans la bonne direction, pouvez-vous me montrer comment changer l'impression infinie "bonjour" à quelque chose d'autre quand le bouton appelé "bouton-poussoir" est cliqué? Je suis familier avec le C/C++ mais c'est mon premier projet Python et toute aide est appréciée.
from PyQt4 import QtGui, QtTest, QtCore # Import the PyQt4 module we'll need
import sys # We need sys so that we can pass argv to QApplication
import gui # Import the GUI output from QT Designer
class GUI(QtGui.QMainWindow, gui.Ui_MainWindow): # This class is to interact with the GUI
def __init__(self):
super(self.__class__, self).__init__()
self.setupUi(self)
self.threadclass = ThreadClass()
self.threadclass.start() # start thread class
######### Binds GUI widgets with functions #####
self.connectbutton.clicked.connect(self.pushbutton) # Call function "pushbutton" when pressed
self.motor_up.clicked.connect(self.motorup) # Call function motorup when pressed
self.motor_down.clicked.connect(self.motordown) # Call function motorup when pressed
self.motor_speed_slider.valueChanged.connect(self.slider) # Call function slider
self.auto_manual_check.stateChanged.connect(self.checkbox) # Call function checkbox
self.Kp_box.valueChanged.connect(self.kp_entry)
self.Ki_box.valueChanged.connect(self.ki_entry)
self.Kd_box.valueChanged.connect(self.kd_entry)
######### Functions to run when GUI event is encountered
def pushbutton(self): # stuff to do if connect button is pressed ## THIS BUTTON
self.connectlabel.setText("Connected")
QtTest.QTest.qWait(2000)
self.connectlabel.setText("Disconnected")
self.emit(SIGNAL("text(Qstring)"),"it worked")
def slider(self): # Stuff to do when slider is changed
print(self.motor_speed_slider.value()) # Print to monitor
def motorup(self): # Run if motor up is clicked
print("motor up")
def motordown(self): # Run if motor down is clicked
print("motor down")
def checkbox(self): # Run if checkbox is changed
if self.auto_manual_check.isChecked():
print("is checked")
else:
print("unchecked")
def kp_entry(self): # Run if kp is changed
print(self.Kp_box.value())
def ki_entry(self): # Run if ki is changed
print(self.Ki_box.value())
def kd_entry(self):# Run if kd is changed
print(self.Kd_box.value())
class ThreadClass(QtCore.QThread): # Infinite thread to communicate with robot
def __init__(self, parent = None):
super(ThreadClass, self).__init__(parent)
def run(self):
while 1: # Runs continuously
print "hello" # CHANGE THIS WHEN pushbutton IS PRESSED
def main(): # Function to run the main GUI
app = QtGui.QApplication(sys.argv) # A new instance of QApplication
form = GUI() # We set the form to be our ExampleApp
form.show() # Show the form
app.exec_() # and execute the app
if __name__ == '__main__': # if we're running file directly and not importing it
main() # run the main function
EDIT: Merci pour les réponses rapides et détaillées. Après avoir expérimenté vos solutions, je pense que je me rapproche, mais je ne les fais pas travailler pour mon application, je pense que je n'ai pas été clair dans ma question initiale. Je tente essentiellement de passer des variables entre les threads, l'impression réelle était juste pour montrer que la variable a été transférée avec succès. Je pense que ce code dépouillé l'éclaircira. Tout ce que je veux faire est de permettre à l'utilisateur de mettre à jour une valeur dans l'interface graphique, puis de passer cette valeur au thread de travail. Dans ce cas, j'ai une boîte de saisie pour que l'utilisateur puisse changer le numéro. J'ai alors besoin du programme pour transférer ce nombre au thread de travail qui communiquera avec le robot. À l'heure actuelle, le code ne fonctionne pas, je l'ai juste obtenu le plus près possible pour mieux montrer ce que j'essaie de faire.
Si elle aide, ceci est mon GUI here
Les commentaires de [this] (http://stackoverflow.com/a/35534047/1994235) answer peuvent être utiles (il y en a un qui explique comment étendre la connexion signal/slot pour inclure des arguments supplémentaires afin qu'ils soient envoyé au travailleur). –