簡體   English   中英

PyQt,QThread通信,更新QLineEdit字段

[英]PyQt, QThread communication, update QLineEdit filed

我有一段正在運行的代碼,兩個線程之間的通信以及狀態。 我面臨着如何根據發出的值更新QLineEdit字段的問題。 到目前為止,它在帶注釋的行中都可以正常工作,但這不是我想要的...如何修改show_process函數以完成工作...有些幫助將是非常受歡迎的?

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

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM