2017-07-17 79 views
0

我有一段代碼正在運行,兩個線程之間的通信和狀態。我遇到了如何根據發射值更新QLineEdit字段的問題。到目前爲止,它可以很好地處理註釋行,但這不是我正在尋找的...如何修改show_process函數來完成這項工作...有些幫助會比歡迎的更好?PyQt,QThread通信,更新QLineEdit提交

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

你的問題是,我已經執行你的代碼去除意見,我有沒有問題。 – eyllanesc

+0

你想在show_process中做什麼? – eyllanesc

+1

您正確完成了信號/插槽連接,您只需要保留對要更新的對象的引用。因此,在'Window.Label'方法的末尾添加'self.textbox = label_name'可以解決您的問題。 –

回答

1

一個簡單的方法來訪問控件是創建一個容器,在這種情況下,我們選擇字典:

self.field_dict = {} 

然後我們添加在Field()方法我們添加QLineEdits到字典中。

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

然後我們可以通過密鑰得到QLineEdit

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

完整的例子:

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()