2017-07-17 5 views
0

J'ai un morceau de code en cours d'exécution, la communication entre deux threads et l'état. J'ai rencontré le problème de mettre à jour le champ QLineEdit en fonction de la valeur émise. Jusqu'à présent, cela fonctionne bien avec les lignes commentées, mais ce n'est pas ce que je cherche ... Comment modifier la fonction show_process pour faire le travail ... une aide sera plus que bienvenue?PyQt, communication QThread, mise à jour QLineEdit filed

import sys, time 
from PyQt4 import QtGui, QtCore 

class Window(QtGui.QMainWindow): 
    def __init__(self): 
     super(Window, self).__init__() 
     self.setGeometry(50, 50, 500, 200) 
     self.setWindowTitle("TEST APP!") 
     self.home() 

    def Label(self, name, width, length, fontSize) : 
     label_name = QtGui.QLabel(name, self) 
     label_name.move(width,length) 
     label_font = label_name.font() 
     label_font.setPointSize(fontSize) 
     label_name.setFont(label_font) 

    def Field(self, TrueFalse, width, length, startText) : 
     field_name = QtGui.QLineEdit(self) 
     field_name.setDisabled(TrueFalse) 
     field_name.move(width, length) 
     field_name.setAlignment(QtCore.Qt.AlignCenter) 
     field_name.setText(startText) 

    def home(self): 
     self.Label('TEST1', 10, 60, 10) 
     self.Label('TEST2', 10, 120, 10) 
     self.Field(True, 130, 60, 'Ready') # first one 
     self.Field(True, 130, 120, 'Ready') # second one 

     self.start = QtGui.QPushButton("start", self) 
     self.start.clicked.connect(self.startPressed) 
     self.start.move(260, 20) 
     self.stop = QtGui.QPushButton("Stop", self) 
     self.stop.clicked.connect(self.stopPressed) 
     self.stop.move(380, 20) 

     self.show() 

    def startPressed(self): 
     self.get_thread_start = Start_Process('239.200.10.1', 50010) 
     self.stop.clicked.connect(self.get_thread_start.terminate) 
     self.start.setDisabled(True) 
     self.get_thread_start.updated.connect(self.show_process) 

     self.get_thread_start.start() 

    def stopPressed(self): 
     self.start.setDisabled(False) 
     self.get_thread_start.running = False 

    def show_process(self, data): 
     if str(data) == '1' : 
      #self.textbox1.setText(str(data)) 
      pass 
     elif str(data) == '0' : 
      #self.textbox2.setText(str(data)) 
      pass 

class Start_Process(QtCore.QThread): 
    updated = QtCore.pyqtSignal(int) 
    running = True 

    def __init__(self, mcstaddr, mcstport): 
     QtCore.QThread.__init__(self) 
     self.counter = 0 
     self.array = [1,0,1,0,1,0,1,0,1] 

    def run(self): 

     while self.running: 
      for i in self.array : 
       self.updated.emit(i) 
       time.sleep(0.5) 

def main(): 
    app = QtGui.QApplication(sys.argv) 
    GUI = Window() 
    GUI.show() 
    sys.exit(app.exec_()) 

if __name__ == '__main__': 
    main() 
+0

Quel est votre problème, je l'ai exécuté votre code supprimant les commentaires et je l'ai eu aucun problème. – eyllanesc

+0

Que voulez-vous faire dans show_process? – eyllanesc

+1

Vous avez correctement effectué la connexion signal/slot, il vous suffit de garder une référence à l'objet que vous souhaitez mettre à jour. L'ajout de 'self.textbox = label_name' à la fin de la méthode' Window.Label' résout donc votre problème. –

Répondre

1

Une façon simple d'accéder au widget est de créer un conteneur, dans ce cas, nous choisissons un dictionnaire:

self.field_dict = {} 

Ensuite, nous ajoutons dans la méthode Field() nous ajoutons le QLineEdits au dictionnaire.

def Field(self, TrueFalse, width, length, startText, key) : 
    field_name = QtGui.QLineEdit(self) 
    ... 
    self.field_dict[key] = field_name 

Ensuite, nous pouvons obtenir le QLineEdit par la clé.

def show_process(self, key, data): 
    self.field_dict[key].setText(data) 

Exemple complet:

import sys, time 
from PyQt4 import QtGui, QtCore 

class Window(QtGui.QMainWindow): 
    def __init__(self): 
     super(Window, self).__init__() 
     self.setGeometry(50, 50, 500, 200) 
     self.setWindowTitle("TEST APP!") 
     self.field_dict = {} 
     self.home() 



    def Label(self, name, width, length, fontSize) : 
     label_name = QtGui.QLabel(name, self) 
     label_name.move(width,length) 
     label_font = label_name.font() 
     label_font.setPointSize(fontSize) 
     label_name.setFont(label_font) 

    def Field(self, TrueFalse, width, length, startText, key) : 
     field_name = QtGui.QLineEdit(self) 
     field_name.setDisabled(TrueFalse) 
     field_name.move(width, length) 
     field_name.setAlignment(QtCore.Qt.AlignCenter) 
     field_name.setText(startText) 
     self.field_dict[key] = field_name 

    def home(self): 
     self.Label('TEST1', 10, 60, 10) 
     self.Label('TEST2', 10, 120, 10) 
     self.Field(True, 130, 60, 'Ready', 0) # first one 
     self.Field(True, 130, 120, 'Ready', 1) # second one 

     self.start = QtGui.QPushButton("start", self) 
     self.start.clicked.connect(self.startPressed) 
     self.start.move(260, 20) 
     self.stop = QtGui.QPushButton("Stop", self) 
     self.stop.clicked.connect(self.stopPressed) 
     self.stop.move(380, 20) 

     self.show() 

    def startPressed(self): 
     self.get_thread_start = Start_Process('239.200.10.1', 50010) 
     self.stop.clicked.connect(self.get_thread_start.terminate) 
     self.start.setDisabled(True) 
     self.get_thread_start.updated.connect(self.show_process) 

     self.get_thread_start.start() 

    def stopPressed(self): 
     self.start.setDisabled(False) 
     self.get_thread_start.running = False 

    def show_process(self, key, data): 
     self.field_dict[key].setText(data) 

class Start_Process(QtCore.QThread): 
    updated = QtCore.pyqtSignal(int, str) 
    running = True 

    def __init__(self, mcstaddr, mcstport): 
     QtCore.QThread.__init__(self) 
     self.counter = 0 
     self.array = [1,0,1,0,1,0,1,0,1] 

    def run(self): 

     while self.running: 
      for i in self.array : 
       self.updated.emit(i, str(self.counter)) 
       time.sleep(0.5) 
       self.counter += 1 

def main(): 
    app = QtGui.QApplication(sys.argv) 
    GUI = Window() 
    GUI.show() 
    sys.exit(app.exec_()) 

if __name__ == '__main__': 
    main()